From 60d0eaf8916f7cb5073105778f25dff21bd504bb Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Tue, 28 Nov 2017 15:34:30 -0800 Subject: [PATCH] fix(server): allow TLS shutdown before dropping connections with no_proto This is important for TLS connections in particular Closes #1380 --- src/proto/conn.rs | 19 +++++++++++++++---- src/proto/dispatch.rs | 1 + 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/proto/conn.rs b/src/proto/conn.rs index e016e85e..f909fd85 100644 --- a/src/proto/conn.rs +++ b/src/proto/conn.rs @@ -447,6 +447,20 @@ where I: AsyncRead + AsyncWrite, } + pub fn shutdown(&mut self) -> Poll<(), io::Error> { + match self.io.io_mut().shutdown() { + Ok(Async::NotReady) => Ok(Async::NotReady), + Ok(Async::Ready(())) => { + trace!("shut down IO"); + Ok(Async::Ready(())) + } + Err(e) => { + debug!("error shutting down IO: {}", e); + Err(e) + } + } + } + pub fn close_read(&mut self) { self.state.close_read(); } @@ -540,10 +554,7 @@ where I: AsyncRead + AsyncWrite, #[inline] fn close(&mut self) -> Poll<(), Self::SinkError> { try_ready!(self.poll_complete()); - self.io.io_mut().shutdown().map_err(|err| { - debug!("error closing: {}", err); - err - }) + self.shutdown() } } diff --git a/src/proto/dispatch.rs b/src/proto/dispatch.rs index 2595ffcb..ea5ae79b 100644 --- a/src/proto/dispatch.rs +++ b/src/proto/dispatch.rs @@ -210,6 +210,7 @@ where self.poll_flush()?; if self.is_done() { + try_ready!(self.conn.shutdown()); trace!("Dispatch::poll done"); Ok(Async::Ready(())) } else {