From e64ce8c05e847b2396e4b7e2bb656240e9806ed8 Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Sat, 23 May 2015 15:11:37 -0700 Subject: [PATCH 1/2] feat(http): add get_mut method to HttpReader --- src/http.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/http.rs b/src/http.rs index fe884b26..71068278 100644 --- a/src/http.rs +++ b/src/http.rs @@ -59,6 +59,16 @@ impl HttpReader { EmptyReader(r) => r, } } + + /// Gets a mutable reference to the underlying Reader. + pub fn get_mut(&mut self) -> &mut R { + match *self { + SizedReader(ref mut r, _) => r, + ChunkedReader(ref mut r, _) => r, + EofReader(ref mut r) => r, + EmptyReader(ref mut r) => r, + } + } } impl fmt::Debug for HttpReader { @@ -121,7 +131,9 @@ impl Read for HttpReader { Ok(count as usize) }, EofReader(ref mut body) => { - body.read(buf) + let r = body.read(buf); + trace!("eofread: {:?}", r); + r }, EmptyReader(_) => Ok(0) } From a5e6174efd57afb1df7113c64f4e7718a3a94187 Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Sat, 23 May 2015 15:11:44 -0700 Subject: [PATCH 2/2] fix(client): don't close stream until EOF Closes #543 --- src/client/response.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/client/response.rs b/src/client/response.rs index c8c4a71c..f21f7623 100644 --- a/src/client/response.rs +++ b/src/client/response.rs @@ -43,9 +43,6 @@ impl Response { debug!("version={:?}, status={:?}", head.version, status); debug!("headers={:?}", headers); - if !http::should_keep_alive(head.version, &headers) { - try!(stream.get_mut().close(Shutdown::Write)); - } let body = if headers.has::() { match headers.get::() { @@ -97,7 +94,15 @@ impl Response { impl Read for Response { #[inline] fn read(&mut self, buf: &mut [u8]) -> io::Result { - self.body.read(buf) + let count = try!(self.body.read(buf)); + + if count == 0 { + if !http::should_keep_alive(self.version, &self.headers) { + try!(self.body.get_mut().get_mut().close(Shutdown::Both)); + } + } + + Ok(count) } }