Merge pull request #545 from hyperium/issue-543
fix(client): don't close stream until EOF
This commit is contained in:
		| @@ -43,9 +43,6 @@ impl Response { | |||||||
|         debug!("version={:?}, status={:?}", head.version, status); |         debug!("version={:?}, status={:?}", head.version, status); | ||||||
|         debug!("headers={:?}", headers); |         debug!("headers={:?}", headers); | ||||||
|  |  | ||||||
|         if !http::should_keep_alive(head.version, &headers) { |  | ||||||
|             try!(stream.get_mut().close(Shutdown::Write)); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         let body = if headers.has::<TransferEncoding>() { |         let body = if headers.has::<TransferEncoding>() { | ||||||
|             match headers.get::<TransferEncoding>() { |             match headers.get::<TransferEncoding>() { | ||||||
| @@ -97,7 +94,15 @@ impl Response { | |||||||
| impl Read for Response { | impl Read for Response { | ||||||
|     #[inline] |     #[inline] | ||||||
|     fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { |     fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { | ||||||
|         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) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								src/http.rs
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								src/http.rs
									
									
									
									
									
								
							| @@ -59,6 +59,16 @@ impl<R: Read> HttpReader<R> { | |||||||
|             EmptyReader(r) => r, |             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<R> fmt::Debug for HttpReader<R> { | impl<R> fmt::Debug for HttpReader<R> { | ||||||
| @@ -121,7 +131,9 @@ impl<R: Read> Read for HttpReader<R> { | |||||||
|                 Ok(count as usize) |                 Ok(count as usize) | ||||||
|             }, |             }, | ||||||
|             EofReader(ref mut body) => { |             EofReader(ref mut body) => { | ||||||
|                 body.read(buf) |                 let r = body.read(buf); | ||||||
|  |                 trace!("eofread: {:?}", r); | ||||||
|  |                 r | ||||||
|             }, |             }, | ||||||
|             EmptyReader(_) => Ok(0) |             EmptyReader(_) => Ok(0) | ||||||
|         } |         } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user