fix(server): use provided executor if fallback to HTTP2
This commit is contained in:
		| @@ -110,10 +110,23 @@ where | ||||
|             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`. | ||||
| /// | ||||
| @@ -305,7 +318,11 @@ impl Http { | ||||
|  | ||||
|         Connection { | ||||
|             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) => { | ||||
|                     debug!("error polling connection protocol without shutdown: {}", e); | ||||
|                     match *e.kind() { | ||||
|                         Kind::Parse(Parse::VersionH2) if self.fallback => { | ||||
|                         Kind::Parse(Parse::VersionH2) if self.fallback.to_h2() => { | ||||
|                             self.upgrade_h2(); | ||||
|                             continue; | ||||
|                         } | ||||
| @@ -467,7 +484,11 @@ where | ||||
|         }; | ||||
|         let mut rewind_io = Rewind::new(io); | ||||
|         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()); | ||||
|         self.conn = Some(Either::B(h2)); | ||||
| @@ -512,7 +533,7 @@ where | ||||
|                 Err(e) => { | ||||
|                     debug!("error polling connection protocol: {}", e); | ||||
|                     match *e.kind() { | ||||
|                         Kind::Parse(Parse::VersionH2) if self.fallback => { | ||||
|                         Kind::Parse(Parse::VersionH2) if self.fallback.to_h2() => { | ||||
|                             self.upgrade_h2(); | ||||
|                             continue; | ||||
|                         } | ||||
| @@ -717,7 +738,7 @@ mod upgrades { | ||||
|                     Err(e) => { | ||||
|                         debug!("error polling connection protocol: {}", e); | ||||
|                         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(); | ||||
|                                 continue; | ||||
|                             } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user