From 6be60052c627b7e498d973465b4a3ee7efc40665 Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Thu, 7 May 2015 10:14:56 -0700 Subject: [PATCH] fix(net): ignore NotConnected error in NetworkStream.close On OSX, calling shutdown a second time will return a NotConnected error. This commit will just ignore it, since we can agree that if a stream is "not connected", it is in fact "closed". Closes #508 --- src/net.rs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/net.rs b/src/net.rs index 2146d413e7..2c1d0d3b70 100644 --- a/src/net.rs +++ b/src/net.rs @@ -1,7 +1,7 @@ //! A collection of traits abstracting over Listeners and Streams. use std::any::{Any, TypeId}; use std::fmt; -use std::io::{self, Read, Write}; +use std::io::{self, ErrorKind, Read, Write}; use std::net::{SocketAddr, ToSocketAddrs, TcpStream, TcpListener, Shutdown}; use std::mem; use std::path::Path; @@ -292,10 +292,21 @@ impl NetworkStream for HttpStream { #[inline] fn close(&mut self, how: Shutdown) -> io::Result<()> { + #[inline] + fn shutdown(tcp: &mut TcpStream, how: Shutdown) -> io::Result<()> { + match tcp.shutdown(how) { + Ok(_) => Ok(()), + // see https://github.com/hyperium/hyper/issues/508 + Err(ref e) if e.kind() == ErrorKind::NotConnected => Ok(()), + err => err + } + } + match *self { - HttpStream::Http(ref mut inner) => inner.0.shutdown(how), - HttpStream::Https(ref mut inner) => inner.get_mut().0.shutdown(how) + HttpStream::Http(ref mut inner) => shutdown(&mut inner.0, how), + HttpStream::Https(ref mut inner) => shutdown(&mut inner.get_mut().0, how) } + } }