@@ -47,6 +47,7 @@ use std::sync::Arc;
47
47
use std:: task:: { Context , Poll } ;
48
48
49
49
pub use rustls;
50
+ use rustls:: server:: AcceptedAlert ;
50
51
use rustls:: { ClientConfig , ClientConnection , CommonState , ServerConfig , ServerConnection } ;
51
52
use tokio:: io:: { AsyncRead , AsyncWrite , ReadBuf } ;
52
53
@@ -195,6 +196,7 @@ impl TlsAcceptor {
195
196
pub struct LazyConfigAcceptor < IO > {
196
197
acceptor : rustls:: server:: Acceptor ,
197
198
io : Option < IO > ,
199
+ alert : Option < ( rustls:: Error , AcceptedAlert ) > ,
198
200
}
199
201
200
202
impl < IO > LazyConfigAcceptor < IO >
@@ -206,6 +208,7 @@ where
206
208
Self {
207
209
acceptor,
208
210
io : Some ( io) ,
211
+ alert : None ,
209
212
}
210
213
}
211
214
@@ -274,6 +277,22 @@ where
274
277
}
275
278
} ;
276
279
280
+ if let Some ( ( err, mut alert) ) = this. alert . take ( ) {
281
+ match alert. write ( & mut common:: SyncWriteAdapter { io, cx } ) {
282
+ Err ( e) if e. kind ( ) == io:: ErrorKind :: WouldBlock => {
283
+ this. alert = Some ( ( err, alert) ) ;
284
+ return Poll :: Pending ;
285
+ }
286
+ Ok ( 0 ) | Err ( _) => {
287
+ return Poll :: Ready ( Err ( io:: Error :: new ( io:: ErrorKind :: InvalidInput , err) ) )
288
+ }
289
+ Ok ( _) => {
290
+ this. alert = Some ( ( err, alert) ) ;
291
+ continue ;
292
+ }
293
+ } ;
294
+ }
295
+
277
296
let mut reader = common:: SyncReadAdapter { io, cx } ;
278
297
match this. acceptor . read_tls ( & mut reader) {
279
298
Ok ( 0 ) => return Err ( io:: ErrorKind :: UnexpectedEof . into ( ) ) . into ( ) ,
@@ -287,11 +306,9 @@ where
287
306
let io = this. io . take ( ) . unwrap ( ) ;
288
307
return Poll :: Ready ( Ok ( StartHandshake { accepted, io } ) ) ;
289
308
}
290
- Ok ( None ) => continue ,
291
- Err ( ( err, mut alert) ) => {
292
- let mut writer = common:: SyncWriteAdapter { io, cx } ;
293
- let _ = alert. write ( & mut writer) ; // best effort
294
- return Poll :: Ready ( Err ( io:: Error :: new ( io:: ErrorKind :: InvalidInput , err) ) ) ;
309
+ Ok ( None ) => { }
310
+ Err ( ( err, alert) ) => {
311
+ this. alert = Some ( ( err, alert) ) ;
295
312
}
296
313
}
297
314
}
0 commit comments