feat(http1): Add higher-level HTTP upgrade support to Client and Server (#1563)
- Adds `Body::on_upgrade()` that returns an `OnUpgrade` future.
- Adds `hyper::upgrade` module containing types for dealing with
  upgrades.
- Adds `server::conn::Connection::with_upgrades()` method to enable
  these upgrades when using lower-level API (because of a missing
  `Send` bound on the transport generic).
- Client connections are automatically enabled.
- Optimizes request parsing, to make up for extra work to look for
  upgrade requests.
  - Returns a smaller `DecodedLength` type instead of the fatter
    `Decoder`, which should also allow a couple fewer branches.
  - Removes the `Decode::Ignore` wrapper enum, and instead ignoring
    1xx responses is handled directly in the response parsing code.
Ref #1563 
Closes #1395
			
			
This commit is contained in:
		| @@ -1,7 +1,7 @@ | ||||
| use bytes::BytesMut; | ||||
| use http::{HeaderMap, Method}; | ||||
|  | ||||
| use proto::{MessageHead, BodyLength}; | ||||
| use proto::{MessageHead, BodyLength, DecodedLength}; | ||||
|  | ||||
| pub(crate) use self::conn::Conn; | ||||
| pub(crate) use self::dispatch::Dispatcher; | ||||
| @@ -19,12 +19,8 @@ mod io; | ||||
| mod role; | ||||
|  | ||||
|  | ||||
| pub(crate) type ServerTransaction = self::role::Server<self::role::YesUpgrades>; | ||||
| //pub type ServerTransaction = self::role::Server<self::role::NoUpgrades>; | ||||
| //pub type ServerUpgradeTransaction = self::role::Server<self::role::YesUpgrades>; | ||||
|  | ||||
| pub(crate) type ClientTransaction = self::role::Client<self::role::NoUpgrades>; | ||||
| pub(crate) type ClientUpgradeTransaction = self::role::Client<self::role::YesUpgrades>; | ||||
| pub(crate) type ServerTransaction = role::Server; | ||||
| pub(crate) type ClientTransaction = role::Client; | ||||
|  | ||||
| pub(crate) trait Http1Transaction { | ||||
|     type Incoming; | ||||
| @@ -40,14 +36,16 @@ pub(crate) trait Http1Transaction { | ||||
|     fn update_date() {} | ||||
| } | ||||
|  | ||||
| /// Result newtype for Http1Transaction::parse. | ||||
| pub(crate) type ParseResult<T> = Result<Option<ParsedMessage<T>>, ::error::Parse>; | ||||
|  | ||||
| #[derive(Debug)] | ||||
| pub(crate) struct ParsedMessage<T> { | ||||
|     head: MessageHead<T>, | ||||
|     decode: Decode, | ||||
|     decode: DecodedLength, | ||||
|     expect_continue: bool, | ||||
|     keep_alive: bool, | ||||
|     wants_upgrade: bool, | ||||
| } | ||||
|  | ||||
| pub(crate) struct ParseContext<'a> { | ||||
| @@ -64,12 +62,3 @@ pub(crate) struct Encode<'a, T: 'a> { | ||||
|     title_case_headers: bool, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, PartialEq)] | ||||
| pub enum Decode { | ||||
|     /// Decode normally. | ||||
|     Normal(Decoder), | ||||
|     /// After this decoder is done, HTTP is done. | ||||
|     Final(Decoder), | ||||
|     /// A header block that should be ignored, like unknown 1xx responses. | ||||
|     Ignore, | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user