11use std:: io;
22use std:: net:: SocketAddr ;
33use server:: { WsServer , NoTlsAcceptor } ;
4- use tokio_core:: net:: TcpListener ;
4+ use tokio_core:: net:: { TcpListener , TcpStream } ;
5+ use futures:: { Stream , Future } ;
6+ use server:: upgrade:: async:: { IntoWs , Upgrade } ;
7+ use server:: InvalidConnection ;
8+ use bytes:: BytesMut ;
59pub use tokio_core:: reactor:: Handle ;
610
711#[ cfg( any( feature="async-ssl" ) ) ]
8- use native_tls:: { TlsStream , TlsAcceptor } ;
12+ use native_tls:: TlsAcceptor ;
13+ #[ cfg( any( feature="async-ssl" ) ) ]
14+ use tokio_tls:: { TlsAcceptorExt , TlsStream } ;
915
1016pub type Server < S > = WsServer < S , TcpListener > ;
1117
18+ pub type Incoming < S > = Box < Stream < Item = Upgrade < S > , Error = InvalidConnection < S , BytesMut > > > ;
19+
20+ pub enum AcceptError < E > {
21+ Io ( io:: Error ) ,
22+ Upgrade ( E ) ,
23+ }
24+
1225impl WsServer < NoTlsAcceptor , TcpListener > {
13- /// Bind this Server to this socket
1426 pub fn bind ( addr : & SocketAddr , handle : & Handle ) -> io:: Result < Self > {
1527 Ok ( Server {
1628 listener : TcpListener :: bind ( addr, handle) ?,
1729 ssl_acceptor : NoTlsAcceptor ,
1830 } )
1931 }
2032
21- /// Wait for and accept an incoming WebSocket connection, returning a WebSocketRequest
22- pub fn incoming ( & mut self ) {
23- unimplemented ! ( ) ;
33+ pub fn incoming ( self ) -> Incoming < TcpStream > {
34+ let future = self . listener
35+ . incoming ( )
36+ . map_err ( |e| {
37+ InvalidConnection {
38+ stream : None ,
39+ parsed : None ,
40+ buffer : None ,
41+ error : e. into ( ) ,
42+ }
43+ } )
44+ . and_then ( |( stream, _) | {
45+ stream. into_ws ( )
46+ . map_err ( |( stream, req, buf, err) | {
47+ InvalidConnection {
48+ stream : Some ( stream) ,
49+ parsed : req,
50+ buffer : Some ( buf) ,
51+ error : err,
52+ }
53+ } )
54+ } ) ;
55+ Box :: new ( future)
2456 }
2557}
2658
2759#[ cfg( any( feature="async-ssl" ) ) ]
2860impl WsServer < TlsAcceptor , TcpListener > {
29- /// Bind this Server to this socket
3061 pub fn bind_secure (
3162 addr : & SocketAddr ,
3263 acceptor : TlsAcceptor ,
@@ -38,8 +69,41 @@ impl WsServer<TlsAcceptor, TcpListener> {
3869 } )
3970 }
4071
41- /// Wait for and accept an incoming WebSocket connection, returning a WebSocketRequest
42- pub fn incoming ( & mut self ) {
43- unimplemented ! ( ) ;
72+ pub fn incoming ( self ) -> Incoming < TlsStream < TcpStream > > {
73+ let acceptor = self . ssl_acceptor ;
74+ let future = self . listener
75+ . incoming ( )
76+ . map_err ( |e| {
77+ InvalidConnection {
78+ stream : None ,
79+ parsed : None ,
80+ buffer : None ,
81+ error : e. into ( ) ,
82+ }
83+ } )
84+ . and_then ( move |( stream, _) | {
85+ acceptor. accept_async ( stream)
86+ . map_err ( |e| {
87+ InvalidConnection {
88+ stream : None ,
89+ parsed : None ,
90+ buffer : None ,
91+ // TODO: better error types
92+ error : io:: Error :: new ( io:: ErrorKind :: Other , e) . into ( ) ,
93+ }
94+ } )
95+ } )
96+ . and_then ( |stream| {
97+ stream. into_ws ( )
98+ . map_err ( |( stream, req, buf, err) | {
99+ InvalidConnection {
100+ stream : Some ( stream) ,
101+ parsed : req,
102+ buffer : Some ( buf) ,
103+ error : err,
104+ }
105+ } )
106+ } ) ;
107+ Box :: new ( future)
44108 }
45109}
0 commit comments