11use crate :: { TcpConnection , TlsListenerBuilder , TlsListenerConfig , TlsStreamWrapper } ;
22
3+ use tide:: listener:: ListenInfo ;
34use tide:: listener:: { Listener , ToListener } ;
45use tide:: Server ;
56
@@ -19,15 +20,36 @@ use std::sync::Arc;
1920use std:: time:: Duration ;
2021
2122/// The primary type for this crate
22- #[ derive( Debug ) ]
23- pub struct TlsListener {
23+ pub struct TlsListener < State > {
2424 connection : TcpConnection ,
2525 config : TlsListenerConfig ,
26+ server : Option < Server < State > > ,
2627}
2728
28- impl TlsListener {
29+ impl < State > Debug for TlsListener < State > {
30+ fn fmt ( & self , f : & mut Formatter < ' _ > ) -> fmt:: Result {
31+ f. debug_struct ( "TlsListener" )
32+ . field ( & "connection" , & self . connection )
33+ . field ( & "config" , & self . config )
34+ . field (
35+ & "server" ,
36+ if self . server . is_some ( ) {
37+ & "Some(Server<State>)"
38+ } else {
39+ & "None"
40+ } ,
41+ )
42+ . finish ( )
43+ }
44+ }
45+
46+ impl < State > TlsListener < State > {
2947 pub ( crate ) fn new ( connection : TcpConnection , config : TlsListenerConfig ) -> Self {
30- Self { connection, config }
48+ Self {
49+ connection,
50+ config,
51+ server : None ,
52+ }
3153 }
3254 /// The primary entrypoint to create a TlsListener. See
3355 /// [TlsListenerBuilder](crate::TlsListenerBuilder) for more
@@ -37,13 +59,13 @@ impl TlsListener {
3759 ///
3860 /// ```rust
3961 /// # use tide_rustls::TlsListener;
40- /// let listener = TlsListener::build()
62+ /// let listener = TlsListener::<()>:: build()
4163 /// .addrs("localhost:4433")
4264 /// .cert("./tls/localhost-4433.cert")
4365 /// .key("./tls/localhost-4433.key")
4466 /// .finish();
4567 /// ```
46- pub fn build ( ) -> TlsListenerBuilder {
68+ pub fn build ( ) -> TlsListenerBuilder < State > {
4769 TlsListenerBuilder :: new ( )
4870 }
4971
@@ -77,6 +99,20 @@ impl TlsListener {
7799 }
78100 }
79101
102+ fn acceptor ( & self ) -> Option < & TlsAcceptor > {
103+ match self . config {
104+ TlsListenerConfig :: Acceptor ( ref a) => Some ( a) ,
105+ _ => None ,
106+ }
107+ }
108+
109+ fn tcp ( & self ) -> Option < & TcpListener > {
110+ match self . connection {
111+ TcpConnection :: Connected ( ref t) => Some ( t) ,
112+ _ => None ,
113+ }
114+ }
115+
80116 async fn connect ( & mut self ) -> io:: Result < & TcpListener > {
81117 if let TcpConnection :: Addrs ( addrs) = & self . connection {
82118 let tcp = TcpListener :: bind ( & addrs[ ..] ) . await ?;
@@ -125,44 +161,59 @@ fn handle_tls<State: Clone + Send + Sync + 'static>(
125161 } ) ;
126162}
127163
128- impl < State : Clone + Send + Sync + ' static > ToListener < State > for TlsListener {
164+ impl < State : Clone + Send + Sync + ' static > ToListener < State > for TlsListener < State > {
129165 type Listener = Self ;
130166 fn to_listener ( self ) -> io:: Result < Self :: Listener > {
131167 Ok ( self )
132168 }
133169}
134170
135- impl < State : Clone + Send + Sync + ' static > ToListener < State > for TlsListenerBuilder {
136- type Listener = TlsListener ;
171+ impl < State : Clone + Send + Sync + ' static > ToListener < State > for TlsListenerBuilder < State > {
172+ type Listener = TlsListener < State > ;
137173 fn to_listener ( self ) -> io:: Result < Self :: Listener > {
138174 self . finish ( )
139175 }
140176}
141177
142178#[ tide:: utils:: async_trait]
143- impl < State : Clone + Send + Sync + ' static > Listener < State > for TlsListener {
144- async fn listen ( & mut self , app : Server < State > ) -> io:: Result < ( ) > {
145- let acceptor = self . configure ( ) . await ?;
146- let listener = self . connect ( ) . await ?;
179+ impl < State : Clone + Send + Sync + ' static > Listener < State > for TlsListener < State > {
180+ async fn bind ( & mut self , server : Server < State > ) -> io:: Result < ( ) > {
181+ self . configure ( ) . await ?;
182+ self . connect ( ) . await ?;
183+ self . server = Some ( server) ;
184+ Ok ( ( ) )
185+ }
186+
187+ async fn accept ( & mut self ) -> io:: Result < ( ) > {
188+ let listener = self . tcp ( ) . unwrap ( ) ;
147189 let mut incoming = listener. incoming ( ) ;
190+ let acceptor = self . acceptor ( ) . unwrap ( ) ;
191+ let server = self . server . as_ref ( ) . unwrap ( ) ;
148192
149193 while let Some ( stream) = incoming. next ( ) . await {
150194 match stream {
151195 Err ( ref e) if is_transient_error ( e) => continue ,
196+
152197 Err ( error) => {
153198 let delay = Duration :: from_millis ( 500 ) ;
154199 tide:: log:: error!( "Error: {}. Pausing for {:?}." , error, delay) ;
155200 task:: sleep ( delay) . await ;
156201 continue ;
157202 }
158203
159- Ok ( stream) => {
160- handle_tls ( app. clone ( ) , stream, acceptor. clone ( ) ) ;
161- }
204+ Ok ( stream) => handle_tls ( server. clone ( ) , stream, acceptor. clone ( ) ) ,
162205 } ;
163206 }
164207 Ok ( ( ) )
165208 }
209+
210+ fn info ( & self ) -> Vec < ListenInfo > {
211+ vec ! [ ListenInfo :: new(
212+ self . connection. to_string( ) ,
213+ String :: from( "tcp" ) ,
214+ true ,
215+ ) ]
216+ }
166217}
167218
168219fn is_transient_error ( e : & io:: Error ) -> bool {
@@ -173,7 +224,7 @@ fn is_transient_error(e: &io::Error) -> bool {
173224 )
174225}
175226
176- impl Display for TlsListener {
227+ impl < State > Display for TlsListener < State > {
177228 fn fmt ( & self , f : & mut Formatter < ' _ > ) -> fmt:: Result {
178229 write ! ( f, "{}" , self . connection)
179230 }
0 commit comments