fix(server): use provided executor if fallback to HTTP2
This commit is contained in:
@@ -110,10 +110,23 @@ where
|
|||||||
S::ResBody,
|
S::ResBody,
|
||||||
>,
|
>,
|
||||||
>>,
|
>>,
|
||||||
fallback: bool,
|
fallback: Fallback,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
enum Fallback {
|
||||||
|
ToHttp2(Exec),
|
||||||
|
Http1Only,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Fallback {
|
||||||
|
fn to_h2(&self) -> bool {
|
||||||
|
match *self {
|
||||||
|
Fallback::ToHttp2(_) => true,
|
||||||
|
Fallback::Http1Only => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Deconstructed parts of a `Connection`.
|
/// Deconstructed parts of a `Connection`.
|
||||||
///
|
///
|
||||||
@@ -305,7 +318,11 @@ impl Http {
|
|||||||
|
|
||||||
Connection {
|
Connection {
|
||||||
conn: Some(either),
|
conn: Some(either),
|
||||||
fallback: self.mode == ConnectionMode::Fallback,
|
fallback: if self.mode == ConnectionMode::Fallback {
|
||||||
|
Fallback::ToHttp2(self.exec.clone())
|
||||||
|
} else {
|
||||||
|
Fallback::Http1Only
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -442,7 +459,7 @@ where
|
|||||||
Err(e) => {
|
Err(e) => {
|
||||||
debug!("error polling connection protocol without shutdown: {}", e);
|
debug!("error polling connection protocol without shutdown: {}", e);
|
||||||
match *e.kind() {
|
match *e.kind() {
|
||||||
Kind::Parse(Parse::VersionH2) if self.fallback => {
|
Kind::Parse(Parse::VersionH2) if self.fallback.to_h2() => {
|
||||||
self.upgrade_h2();
|
self.upgrade_h2();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -467,7 +484,11 @@ where
|
|||||||
};
|
};
|
||||||
let mut rewind_io = Rewind::new(io);
|
let mut rewind_io = Rewind::new(io);
|
||||||
rewind_io.rewind(read_buf);
|
rewind_io.rewind(read_buf);
|
||||||
let h2 = proto::h2::Server::new(rewind_io, dispatch.into_service(), Exec::Default);
|
let exec = match self.fallback {
|
||||||
|
Fallback::ToHttp2(ref exec) => exec.clone(),
|
||||||
|
Fallback::Http1Only => unreachable!("upgrade_h2 with Fallback::Http1Only"),
|
||||||
|
};
|
||||||
|
let h2 = proto::h2::Server::new(rewind_io, dispatch.into_service(), exec);
|
||||||
|
|
||||||
debug_assert!(self.conn.is_none());
|
debug_assert!(self.conn.is_none());
|
||||||
self.conn = Some(Either::B(h2));
|
self.conn = Some(Either::B(h2));
|
||||||
@@ -512,7 +533,7 @@ where
|
|||||||
Err(e) => {
|
Err(e) => {
|
||||||
debug!("error polling connection protocol: {}", e);
|
debug!("error polling connection protocol: {}", e);
|
||||||
match *e.kind() {
|
match *e.kind() {
|
||||||
Kind::Parse(Parse::VersionH2) if self.fallback => {
|
Kind::Parse(Parse::VersionH2) if self.fallback.to_h2() => {
|
||||||
self.upgrade_h2();
|
self.upgrade_h2();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -717,7 +738,7 @@ mod upgrades {
|
|||||||
Err(e) => {
|
Err(e) => {
|
||||||
debug!("error polling connection protocol: {}", e);
|
debug!("error polling connection protocol: {}", e);
|
||||||
match *e.kind() {
|
match *e.kind() {
|
||||||
Kind::Parse(Parse::VersionH2) if self.inner.fallback => {
|
Kind::Parse(Parse::VersionH2) if self.inner.fallback.to_h2() => {
|
||||||
self.inner.upgrade_h2();
|
self.inner.upgrade_h2();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user