@@ -47,6 +47,7 @@ use std::sync::Arc;
4747use std:: task:: { Context , Poll } ;
4848
4949pub use rustls;
50+ use rustls:: server:: AcceptedAlert ;
5051use rustls:: { ClientConfig , ClientConnection , CommonState , ServerConfig , ServerConnection } ;
5152use tokio:: io:: { AsyncRead , AsyncWrite , ReadBuf } ;
5253
@@ -195,6 +196,7 @@ impl TlsAcceptor {
195196pub struct LazyConfigAcceptor < IO > {
196197 acceptor : rustls:: server:: Acceptor ,
197198 io : Option < IO > ,
199+ alert : Option < ( rustls:: Error , AcceptedAlert ) > ,
198200}
199201
200202impl < IO > LazyConfigAcceptor < IO >
@@ -206,6 +208,7 @@ where
206208 Self {
207209 acceptor,
208210 io : Some ( io) ,
211+ alert : None ,
209212 }
210213 }
211214
@@ -274,6 +277,22 @@ where
274277 }
275278 } ;
276279
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 :: InvalidData , err) ) )
288+ }
289+ Ok ( _) => {
290+ this. alert = Some ( ( err, alert) ) ;
291+ continue ;
292+ }
293+ } ;
294+ }
295+
277296 let mut reader = common:: SyncReadAdapter { io, cx } ;
278297 match this. acceptor . read_tls ( & mut reader) {
279298 Ok ( 0 ) => return Err ( io:: ErrorKind :: UnexpectedEof . into ( ) ) . into ( ) ,
@@ -287,11 +306,9 @@ where
287306 let io = this. io . take ( ) . unwrap ( ) ;
288307 return Poll :: Ready ( Ok ( StartHandshake { accepted, io } ) ) ;
289308 }
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) ) ;
295312 }
296313 }
297314 }
0 commit comments