diff --git a/src/proto/conn.rs b/src/proto/conn.rs index e016e85e38..f909fd8571 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 2595ffcb08..ea5ae79bf2 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 {