Skip to content

Commit

Permalink
fix(http1): return error if user body ends prematurely
Browse files Browse the repository at this point in the history
- update proto::h1::end_body to return Result<()>
- update Encoder::end to return Error(NotEof) only when there's Content-length left to be addressed

Closes #2263
  • Loading branch information
jxs committed Aug 12, 2020
1 parent 3de81c8 commit 1ecbcbb
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 8 deletions.
12 changes: 9 additions & 3 deletions src/proto/h1/conn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ use super::{Decoder, Encode, EncodedBuf, Encoder, Http1Transaction, ParseContext
use crate::common::{task, Pin, Poll, Unpin};
use crate::headers::connection_keep_alive;
use crate::proto::{BodyLength, DecodedLength, MessageHead};
use crate::Result;

const H2_PREFACE: &[u8] = b"PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n";

Expand Down Expand Up @@ -584,7 +585,7 @@ where
self.state.writing = state;
}

pub fn end_body(&mut self) {
pub fn end_body(&mut self) -> Result<()> {
debug_assert!(self.can_write_body());

let state = match self.state.writing {
Expand All @@ -601,13 +602,18 @@ where
Writing::KeepAlive
}
}
Err(_not_eof) => Writing::Closed,
Err(_not_eof) => {
return Err(crate::Error::new_user_body(
crate::Error::new_body_write_aborted(),
))
}
}
}
_ => return,
_ => return Ok(()),
};

self.state.writing = state;
Ok(())
}

// When we get a parse error, depending on what side we are, we might be able
Expand Down
4 changes: 2 additions & 2 deletions src/proto/h1/dispatch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@ where
*clear_body = true;
if chunk.remaining() == 0 {
trace!("discarding empty chunk");
self.conn.end_body();
self.conn.end_body()?;
} else {
self.conn.write_body_and_end(chunk);
}
Expand All @@ -351,7 +351,7 @@ where
}
} else {
*clear_body = true;
self.conn.end_body();
self.conn.end_body()?;
}
} else {
return Poll::Pending;
Expand Down
7 changes: 4 additions & 3 deletions src/proto/h1/encode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@ impl Encoder {
Kind::Chunked => Ok(Some(EncodedBuf {
kind: BufKind::ChunkedEnd(b"0\r\n\r\n"),
})),
_ => Err(NotEof),
Kind::CloseDelimited => Ok(None),
Kind::Length(_) => Err(NotEof),
}
}

Expand Down Expand Up @@ -405,14 +406,14 @@ mod tests {

assert_eq!(dst, b"foo bar");
assert!(!encoder.is_eof());
encoder.end::<()>().unwrap_err();
encoder.end::<()>().unwrap();

let msg2 = b"baz".as_ref();
let buf2 = encoder.encode(msg2);
dst.put(buf2);

assert_eq!(dst, b"foo barbaz");
assert!(!encoder.is_eof());
encoder.end::<()>().unwrap_err();
encoder.end::<()>().unwrap();
}
}

0 comments on commit 1ecbcbb

Please sign in to comment.