refactor(error): add header parse error details in hyper::Error
When a header parse error is because of content-length or transfer-encoding semantics, include a better error message in the `hyper::Error`.
This commit is contained in:
44
src/error.rs
44
src/error.rs
@@ -72,13 +72,24 @@ pub(super) enum Parse {
|
||||
#[cfg(feature = "http1")]
|
||||
VersionH2,
|
||||
Uri,
|
||||
Header,
|
||||
Header(Header),
|
||||
TooLarge,
|
||||
Status,
|
||||
#[cfg_attr(debug_assertions, allow(unused))]
|
||||
Internal,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub(super) enum Header {
|
||||
Token,
|
||||
#[cfg(feature = "http1")]
|
||||
ContentLengthInvalid,
|
||||
#[cfg(feature = "http1")]
|
||||
TransferEncodingInvalid,
|
||||
#[cfg(feature = "http1")]
|
||||
TransferEncodingUnexpected,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub(super) enum User {
|
||||
/// Error calling user's HttpBody::poll_data().
|
||||
@@ -375,7 +386,19 @@ impl Error {
|
||||
#[cfg(feature = "http1")]
|
||||
Kind::Parse(Parse::VersionH2) => "invalid HTTP version parsed (found HTTP2 preface)",
|
||||
Kind::Parse(Parse::Uri) => "invalid URI",
|
||||
Kind::Parse(Parse::Header) => "invalid HTTP header parsed",
|
||||
Kind::Parse(Parse::Header(Header::Token)) => "invalid HTTP header parsed",
|
||||
#[cfg(feature = "http1")]
|
||||
Kind::Parse(Parse::Header(Header::ContentLengthInvalid)) => {
|
||||
"invalid content-length parsed"
|
||||
}
|
||||
#[cfg(feature = "http1")]
|
||||
Kind::Parse(Parse::Header(Header::TransferEncodingInvalid)) => {
|
||||
"invalid transfer-encoding parsed"
|
||||
}
|
||||
#[cfg(feature = "http1")]
|
||||
Kind::Parse(Parse::Header(Header::TransferEncodingUnexpected)) => {
|
||||
"unexpected transfer-encoding parsed"
|
||||
}
|
||||
Kind::Parse(Parse::TooLarge) => "message head is too large",
|
||||
Kind::Parse(Parse::Status) => "invalid HTTP status-code parsed",
|
||||
Kind::Parse(Parse::Internal) => {
|
||||
@@ -475,13 +498,28 @@ impl From<Parse> for Error {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "http1")]
|
||||
impl Parse {
|
||||
pub(crate) fn content_length_invalid() -> Self {
|
||||
Parse::Header(Header::ContentLengthInvalid)
|
||||
}
|
||||
|
||||
pub(crate) fn transfer_encoding_invalid() -> Self {
|
||||
Parse::Header(Header::TransferEncodingInvalid)
|
||||
}
|
||||
|
||||
pub(crate) fn transfer_encoding_unexpected() -> Self {
|
||||
Parse::Header(Header::TransferEncodingUnexpected)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<httparse::Error> for Parse {
|
||||
fn from(err: httparse::Error) -> Parse {
|
||||
match err {
|
||||
httparse::Error::HeaderName
|
||||
| httparse::Error::HeaderValue
|
||||
| httparse::Error::NewLine
|
||||
| httparse::Error::Token => Parse::Header,
|
||||
| httparse::Error::Token => Parse::Header(Header::Token),
|
||||
httparse::Error::Status => Parse::Status,
|
||||
httparse::Error::TooManyHeaders => Parse::TooLarge,
|
||||
httparse::Error::Version => Parse::Version,
|
||||
|
||||
Reference in New Issue
Block a user