feat(http2): Make HTTP/2 support an optional feature
cc #2251 BREAKING CHANGE: This puts all HTTP/2 methods and support behind an `http2` cargo feature, which will not be enabled by default. To use HTTP/2, add `features = ["http2"]` to the hyper dependency in your `Cargo.toml`.
This commit is contained in:
@@ -14,6 +14,7 @@ use http_body::{Body as HttpBody, SizeHint};
|
||||
#[cfg(feature = "stream")]
|
||||
use crate::common::sync_wrapper::SyncWrapper;
|
||||
use crate::common::{task, watch, Future, Never, Pin, Poll};
|
||||
#[cfg(feature = "http2")]
|
||||
use crate::proto::h2::ping;
|
||||
use crate::proto::DecodedLength;
|
||||
use crate::upgrade::OnUpgrade;
|
||||
@@ -39,6 +40,7 @@ enum Kind {
|
||||
want_tx: watch::Sender,
|
||||
rx: mpsc::Receiver<Result<Bytes, crate::Error>>,
|
||||
},
|
||||
#[cfg(feature = "http2")]
|
||||
H2 {
|
||||
ping: ping::Recorder,
|
||||
content_length: DecodedLength,
|
||||
@@ -186,6 +188,7 @@ impl Body {
|
||||
Body { kind, extra: None }
|
||||
}
|
||||
|
||||
#[cfg(feature = "http2")]
|
||||
pub(crate) fn h2(
|
||||
recv: h2::RecvStream,
|
||||
content_length: DecodedLength,
|
||||
@@ -273,6 +276,7 @@ impl Body {
|
||||
None => Poll::Ready(None),
|
||||
}
|
||||
}
|
||||
#[cfg(feature = "http2")]
|
||||
Kind::H2 {
|
||||
ref ping,
|
||||
recv: ref mut h2,
|
||||
@@ -325,10 +329,11 @@ impl HttpBody for Body {
|
||||
}
|
||||
|
||||
fn poll_trailers(
|
||||
mut self: Pin<&mut Self>,
|
||||
cx: &mut task::Context<'_>,
|
||||
#[cfg_attr(not(feature = "http2"), allow(unused_mut))] mut self: Pin<&mut Self>,
|
||||
#[cfg_attr(not(feature = "http2"), allow(unused))] cx: &mut task::Context<'_>,
|
||||
) -> Poll<Result<Option<HeaderMap>, Self::Error>> {
|
||||
match self.kind {
|
||||
#[cfg(feature = "http2")]
|
||||
Kind::H2 {
|
||||
recv: ref mut h2,
|
||||
ref ping,
|
||||
@@ -348,6 +353,7 @@ impl HttpBody for Body {
|
||||
match self.kind {
|
||||
Kind::Once(ref val) => val.is_none(),
|
||||
Kind::Chan { content_length, .. } => content_length == DecodedLength::ZERO,
|
||||
#[cfg(feature = "http2")]
|
||||
Kind::H2 { recv: ref h2, .. } => h2.is_end_stream(),
|
||||
#[cfg(feature = "stream")]
|
||||
Kind::Wrapped(..) => false,
|
||||
@@ -355,20 +361,26 @@ impl HttpBody for Body {
|
||||
}
|
||||
|
||||
fn size_hint(&self) -> SizeHint {
|
||||
macro_rules! opt_len {
|
||||
($content_length:expr) => {{
|
||||
let mut hint = SizeHint::default();
|
||||
|
||||
if let Some(content_length) = $content_length.into_opt() {
|
||||
hint.set_exact(content_length);
|
||||
}
|
||||
|
||||
hint
|
||||
}};
|
||||
}
|
||||
|
||||
match self.kind {
|
||||
Kind::Once(Some(ref val)) => SizeHint::with_exact(val.len() as u64),
|
||||
Kind::Once(None) => SizeHint::with_exact(0),
|
||||
#[cfg(feature = "stream")]
|
||||
Kind::Wrapped(..) => SizeHint::default(),
|
||||
Kind::Chan { content_length, .. } | Kind::H2 { content_length, .. } => {
|
||||
let mut hint = SizeHint::default();
|
||||
|
||||
if let Some(content_length) = content_length.into_opt() {
|
||||
hint.set_exact(content_length);
|
||||
}
|
||||
|
||||
hint
|
||||
}
|
||||
Kind::Chan { content_length, .. } => opt_len!(content_length),
|
||||
#[cfg(feature = "http2")]
|
||||
Kind::H2 { content_length, .. } => opt_len!(content_length),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user