refactor(http1): move upgrade state from body to head (#2353)
Move state required for protocol upgrades to head representations, instead of associating it with the body. Closes #2340. Signed-off-by: Arve Knudsen <arve.knudsen@gmail.com>
This commit is contained in:
@@ -10,6 +10,7 @@ use crate::common::{task, Future, Pin, Poll, Unpin};
|
||||
use crate::proto::{
|
||||
BodyLength, Conn, Dispatched, MessageHead, RequestHead,
|
||||
};
|
||||
use crate::upgrade::OnUpgrade;
|
||||
|
||||
pub(crate) struct Dispatcher<D, Bs: HttpBody, I, T> {
|
||||
conn: Conn<I, Bs::Data, T>,
|
||||
@@ -243,8 +244,8 @@ where
|
||||
}
|
||||
// dispatch is ready for a message, try to read one
|
||||
match ready!(self.conn.poll_read_head(cx)) {
|
||||
Some(Ok((head, body_len, wants))) => {
|
||||
let mut body = match body_len {
|
||||
Some(Ok((mut head, body_len, wants))) => {
|
||||
let body = match body_len {
|
||||
DecodedLength::ZERO => Body::empty(),
|
||||
other => {
|
||||
let (tx, rx) = Body::new_channel(other, wants.contains(Wants::EXPECT));
|
||||
@@ -253,7 +254,10 @@ where
|
||||
}
|
||||
};
|
||||
if wants.contains(Wants::UPGRADE) {
|
||||
body.set_on_upgrade(self.conn.on_upgrade());
|
||||
let upgrade = self.conn.on_upgrade();
|
||||
debug_assert!(!upgrade.is_none(), "empty upgrade");
|
||||
debug_assert!(head.extensions.get::<OnUpgrade>().is_none(), "OnUpgrade already set");
|
||||
head.extensions.insert(upgrade);
|
||||
}
|
||||
self.dispatch.recv_msg(Ok((head, body)))?;
|
||||
Poll::Ready(Ok(()))
|
||||
@@ -488,6 +492,7 @@ cfg_server! {
|
||||
version: parts.version,
|
||||
subject: parts.status,
|
||||
headers: parts.headers,
|
||||
extensions: http::Extensions::default(),
|
||||
};
|
||||
Poll::Ready(Some(Ok((head, body))))
|
||||
} else {
|
||||
@@ -506,6 +511,7 @@ cfg_server! {
|
||||
*req.uri_mut() = msg.subject.1;
|
||||
*req.headers_mut() = msg.headers;
|
||||
*req.version_mut() = msg.version;
|
||||
*req.extensions_mut() = msg.extensions;
|
||||
let fut = self.service.call(req);
|
||||
self.in_flight.set(Some(fut));
|
||||
Ok(())
|
||||
@@ -570,6 +576,7 @@ cfg_client! {
|
||||
version: parts.version,
|
||||
subject: crate::proto::RequestLine(parts.method, parts.uri),
|
||||
headers: parts.headers,
|
||||
extensions: http::Extensions::default(),
|
||||
};
|
||||
*this.callback = Some(cb);
|
||||
Poll::Ready(Some(Ok((head, body))))
|
||||
@@ -594,6 +601,7 @@ cfg_client! {
|
||||
*res.status_mut() = msg.subject;
|
||||
*res.headers_mut() = msg.headers;
|
||||
*res.version_mut() = msg.version;
|
||||
*res.extensions_mut() = msg.extensions;
|
||||
cb.send(Ok(res));
|
||||
Ok(())
|
||||
} else {
|
||||
|
||||
@@ -270,6 +270,7 @@ impl Http1Transaction for Server {
|
||||
version,
|
||||
subject,
|
||||
headers,
|
||||
extensions: http::Extensions::default(),
|
||||
},
|
||||
decode: decoder,
|
||||
expect_continue,
|
||||
@@ -713,6 +714,7 @@ impl Http1Transaction for Client {
|
||||
version,
|
||||
subject: status,
|
||||
headers,
|
||||
extensions: http::Extensions::default(),
|
||||
};
|
||||
if let Some((decode, is_upgrade)) = Client::decoder(&head, ctx.req_method)? {
|
||||
return Ok(Some(ParsedMessage {
|
||||
|
||||
@@ -16,7 +16,7 @@ cfg_http2! {
|
||||
}
|
||||
|
||||
/// An Incoming Message head. Includes request/status line, and headers.
|
||||
#[derive(Clone, Debug, Default, PartialEq)]
|
||||
#[derive(Debug, Default)]
|
||||
pub struct MessageHead<S> {
|
||||
/// HTTP version of the message.
|
||||
pub version: http::Version,
|
||||
@@ -24,6 +24,9 @@ pub struct MessageHead<S> {
|
||||
pub subject: S,
|
||||
/// Headers of the Incoming message.
|
||||
pub headers: http::HeaderMap,
|
||||
|
||||
/// Extensions.
|
||||
extensions: http::Extensions,
|
||||
}
|
||||
|
||||
/// An incoming request message.
|
||||
|
||||
Reference in New Issue
Block a user