From 72bc1546c484ea9419c3a913c9de217ed3b2aeaa Mon Sep 17 00:00:00 2001 From: Jan Niehusmann Date: Thu, 12 Apr 2018 09:47:32 +0200 Subject: [PATCH] fix end-of-stream handling in parse_payload parse_payload can be called with a pre-filled buf. In this case, it's totaly fine for read_from_io to return sync::Ready(0) while buf is not empty. This is not an PayloadError::Incomplete. So, move the check for PayloadError::Incomplete down to the decoding code: If the decoder is not ready, but the input stream is finished, PayloadError::Incomplete will be returned. --- src/client/parser.rs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/client/parser.rs b/src/client/parser.rs index e0c49406..6feb0cc7 100644 --- a/src/client/parser.rs +++ b/src/client/parser.rs @@ -81,16 +81,11 @@ impl HttpResponseParser { if self.decoder.is_some() { loop { // read payload - let not_ready = match utils::read_from_io(io, buf) { - Ok(Async::Ready(0)) => { - if buf.is_empty() { - return Err(PayloadError::Incomplete) - } - true - } + let (not_ready, stream_finished) = match utils::read_from_io(io, buf) { + Ok(Async::Ready(0)) => (false, true), Err(err) => return Err(err.into()), - Ok(Async::NotReady) => true, - _ => false, + Ok(Async::NotReady) => (true, false), + _ => (false, false), }; match self.decoder.as_mut().unwrap().decode(buf) { @@ -104,6 +99,9 @@ impl HttpResponseParser { if not_ready { return Ok(Async::NotReady) } + if stream_finished { + return Err(PayloadError::Incomplete) + } } Err(err) => return Err(err.into()), }