1
0
mirror of https://github.com/fafhrd91/actix-web synced 2024-11-28 01:52:57 +01:00

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.
This commit is contained in:
Jan Niehusmann 2018-04-12 09:47:32 +02:00
parent d39b531537
commit 72bc1546c4

View File

@ -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()),
}