feat(error): revamp hyper::Error type
**The `Error` is now an opaque struct**, which allows for more variants to be added freely, and the internal representation to change without being breaking changes. For inspecting an `Error`, there are several `is_*` methods to check for certain classes of errors, such as `Error::is_parse()`. The `cause` can also be inspected, like before. This likely seems like a downgrade, but more inspection can be added as needed! The `Error` now knows about more states, which gives much more context around when a certain error occurs. This is also expressed in the description and `fmt` messages. **Most places where a user would provide an error to hyper can now pass any error type** (`E: Into<Box<std::error::Error>>`). This error is passed back in relevant places, and can be useful for logging. This should make it much clearer about what error a user should provide to hyper: any it feels is relevant! Closes #1128 Closes #1130 Closes #1431 Closes #1338 BREAKING CHANGE: `Error` is no longer an enum to pattern match over, or to construct. Code will need to be updated accordingly. For body streams or `Service`s, inference might be unable to determine what error type you mean to return. Starting in Rust 1.26, you could just label that as `!` if you never return an error.
This commit is contained in:
@@ -6,7 +6,7 @@ use headers;
|
||||
|
||||
pub use self::body::Body;
|
||||
pub use self::chunk::Chunk;
|
||||
pub use self::h1::{dispatch, Conn};
|
||||
pub(crate) use self::h1::{dispatch, Conn};
|
||||
|
||||
pub mod body;
|
||||
mod chunk;
|
||||
@@ -60,14 +60,14 @@ pub fn expecting_continue(version: Version, headers: &HeaderMap) -> bool {
|
||||
version == Version::HTTP_11 && headers::expect_continue(headers)
|
||||
}
|
||||
|
||||
pub type ServerTransaction = h1::role::Server<h1::role::YesUpgrades>;
|
||||
pub(crate) type ServerTransaction = h1::role::Server<h1::role::YesUpgrades>;
|
||||
//pub type ServerTransaction = h1::role::Server<h1::role::NoUpgrades>;
|
||||
//pub type ServerUpgradeTransaction = h1::role::Server<h1::role::YesUpgrades>;
|
||||
|
||||
pub type ClientTransaction = h1::role::Client<h1::role::NoUpgrades>;
|
||||
pub type ClientUpgradeTransaction = h1::role::Client<h1::role::YesUpgrades>;
|
||||
pub(crate) type ClientTransaction = h1::role::Client<h1::role::NoUpgrades>;
|
||||
pub(crate) type ClientUpgradeTransaction = h1::role::Client<h1::role::YesUpgrades>;
|
||||
|
||||
pub trait Http1Transaction {
|
||||
pub(crate) trait Http1Transaction {
|
||||
type Incoming;
|
||||
type Outgoing: Default;
|
||||
fn parse(bytes: &mut BytesMut) -> ParseResult<Self::Incoming>;
|
||||
@@ -84,7 +84,7 @@ pub trait Http1Transaction {
|
||||
fn should_read_first() -> bool;
|
||||
}
|
||||
|
||||
pub type ParseResult<T> = ::Result<Option<(MessageHead<T>, usize)>>;
|
||||
pub(crate) type ParseResult<T> = Result<Option<(MessageHead<T>, usize)>, ::error::Parse>;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum BodyLength {
|
||||
|
||||
Reference in New Issue
Block a user