Skip to content

Commit

Permalink
refactor(error): improve error message when user body ends early
Browse files Browse the repository at this point in the history
  • Loading branch information
seanmonstar committed Mar 14, 2022
1 parent 1e9cd4f commit 740654e
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 11 deletions.
10 changes: 5 additions & 5 deletions src/error.rs
Expand Up @@ -53,8 +53,6 @@ pub(super) enum Kind {
/// Error while writing a body to connection.
#[cfg(any(feature = "http1", feature = "http2"))]
BodyWrite,
/// The body write was aborted.
BodyWriteAborted,
/// Error calling AsyncWrite::shutdown()
#[cfg(feature = "http1")]
Shutdown,
Expand Down Expand Up @@ -96,6 +94,8 @@ pub(super) enum User {
/// Error calling user's HttpBody::poll_data().
#[cfg(any(feature = "http1", feature = "http2"))]
Body,
/// The user aborted writing of the outgoing body.
BodyWriteAborted,
/// Error calling user's MakeService.
#[cfg(any(feature = "http1", feature = "http2"))]
#[cfg(feature = "server")]
Expand Down Expand Up @@ -193,7 +193,7 @@ impl Error {

/// Returns true if the body write was aborted.
pub fn is_body_write_aborted(&self) -> bool {
matches!(self.inner.kind, Kind::BodyWriteAborted)
matches!(self.inner.kind, Kind::User(User::BodyWriteAborted))
}

/// Returns true if the error was caused by a timeout.
Expand Down Expand Up @@ -305,7 +305,7 @@ impl Error {
}

pub(super) fn new_body_write_aborted() -> Error {
Error::new(Kind::BodyWriteAborted)
Error::new(Kind::User(User::BodyWriteAborted))
}

fn new_user(user: User) -> Error {
Expand Down Expand Up @@ -444,7 +444,6 @@ impl Error {
Kind::Body => "error reading a body from connection",
#[cfg(any(feature = "http1", feature = "http2"))]
Kind::BodyWrite => "error writing a body to connection",
Kind::BodyWriteAborted => "body write aborted",
#[cfg(feature = "http1")]
Kind::Shutdown => "error shutting down connection",
#[cfg(feature = "http2")]
Expand All @@ -454,6 +453,7 @@ impl Error {

#[cfg(any(feature = "http1", feature = "http2"))]
Kind::User(User::Body) => "error from user's HttpBody stream",
Kind::User(User::BodyWriteAborted) => "user body write aborted",
#[cfg(any(feature = "http1", feature = "http2"))]
#[cfg(feature = "server")]
Kind::User(User::MakeService) => "error from user's MakeService",
Expand Down
6 changes: 2 additions & 4 deletions src/proto/h1/conn.rs
Expand Up @@ -686,10 +686,8 @@ where
Writing::KeepAlive
}
}
Err(_not_eof) => {
res = Err(crate::Error::new_user_body(
crate::Error::new_body_write_aborted(),
));
Err(not_eof) => {
res = Err(crate::Error::new_body_write_aborted().with(not_eof));
Writing::Closed
}
}
Expand Down
12 changes: 10 additions & 2 deletions src/proto/h1/encode.rs
Expand Up @@ -22,7 +22,7 @@ pub(crate) struct EncodedBuf<B> {
}

#[derive(Debug)]
pub(crate) struct NotEof;
pub(crate) struct NotEof(u64);

#[derive(Debug, PartialEq, Clone)]
enum Kind {
Expand Down Expand Up @@ -98,7 +98,7 @@ impl Encoder {
})),
#[cfg(feature = "server")]
Kind::CloseDelimited => Ok(None),
Kind::Length(_) => Err(NotEof),
Kind::Length(n) => Err(NotEof(n)),
}
}

Expand Down Expand Up @@ -351,6 +351,14 @@ impl<B: Buf> From<Chain<Chain<ChunkSize, B>, StaticBuf>> for EncodedBuf<B> {
}
}

impl fmt::Display for NotEof {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "early end, expected {} more bytes", self.0)
}
}

impl std::error::Error for NotEof {}

#[cfg(test)]
mod tests {
use bytes::BufMut;
Expand Down

1 comment on commit 740654e

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Performance Alert ⚠️

Possible performance regression was detected for benchmark 'end_to_end'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 2.

Benchmark suite Current: 740654e Previous: 1e9cd4f Ratio
http2_parallel_x10_req_10kb_100_chunks_adaptive_window 19586133 ns/iter (± 10032047) 9514608 ns/iter (± 8787225) 2.06

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.