fix(server): coerce responses with HTTP2 version to HTTP/1.1 when protocol is 1.x
This commit is contained in:
		| @@ -267,6 +267,10 @@ impl Http1Transaction for Server { | |||||||
|             match msg.head.version { |             match msg.head.version { | ||||||
|                 Version::HTTP_10 => extend(dst, b"HTTP/1.0 "), |                 Version::HTTP_10 => extend(dst, b"HTTP/1.0 "), | ||||||
|                 Version::HTTP_11 => extend(dst, b"HTTP/1.1 "), |                 Version::HTTP_11 => extend(dst, b"HTTP/1.1 "), | ||||||
|  |                 Version::HTTP_2 => { | ||||||
|  |                     warn!("response with HTTP2 version coerced to HTTP/1.1"); | ||||||
|  |                     extend(dst, b"HTTP/1.1 "); | ||||||
|  |                 }, | ||||||
|                 _ => unreachable!(), |                 _ => unreachable!(), | ||||||
|             } |             } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1542,6 +1542,25 @@ fn streaming_body() { | |||||||
|     rt.block_on(fut.join(rx)).unwrap(); |     rt.block_on(fut.join(rx)).unwrap(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #[test] | ||||||
|  | fn http1_response_with_http2_version() { | ||||||
|  |     let server = serve(); | ||||||
|  |     let addr_str = format!("http://{}", server.addr()); | ||||||
|  |  | ||||||
|  |     let mut rt = Runtime::new().expect("runtime new"); | ||||||
|  |  | ||||||
|  |     server | ||||||
|  |         .reply() | ||||||
|  |         .version(hyper::Version::HTTP_2); | ||||||
|  |  | ||||||
|  |     rt.block_on(hyper::rt::lazy(move || { | ||||||
|  |         let client = Client::new(); | ||||||
|  |         let uri = addr_str.parse().expect("server addr should parse"); | ||||||
|  |  | ||||||
|  |         client.get(uri) | ||||||
|  |     })).unwrap(); | ||||||
|  | } | ||||||
|  |  | ||||||
| #[test] | #[test] | ||||||
| fn try_h2() { | fn try_h2() { | ||||||
|     let server = serve(); |     let server = serve(); | ||||||
| @@ -1641,6 +1660,11 @@ impl<'a> ReplyBuilder<'a> { | |||||||
|         self |         self | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     fn version(self, version: hyper::Version) -> Self { | ||||||
|  |         self.tx.send(Reply::Version(version)).unwrap(); | ||||||
|  |         self | ||||||
|  |     } | ||||||
|  |  | ||||||
|     fn header<V: AsRef<str>>(self, name: &str, value: V) -> Self { |     fn header<V: AsRef<str>>(self, name: &str, value: V) -> Self { | ||||||
|         let name = HeaderName::from_bytes(name.as_bytes()).expect("header name"); |         let name = HeaderName::from_bytes(name.as_bytes()).expect("header name"); | ||||||
|         let value = HeaderValue::from_str(value.as_ref()).expect("header value"); |         let value = HeaderValue::from_str(value.as_ref()).expect("header value"); | ||||||
| @@ -1681,6 +1705,7 @@ struct TestService { | |||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| enum Reply { | enum Reply { | ||||||
|     Status(hyper::StatusCode), |     Status(hyper::StatusCode), | ||||||
|  |     Version(hyper::Version), | ||||||
|     Header(HeaderName, HeaderValue), |     Header(HeaderName, HeaderValue), | ||||||
|     Body(hyper::Body), |     Body(hyper::Body), | ||||||
|     End, |     End, | ||||||
| @@ -1718,6 +1743,9 @@ impl TestService { | |||||||
|                     Reply::Status(s) => { |                     Reply::Status(s) => { | ||||||
|                         *res.status_mut() = s; |                         *res.status_mut() = s; | ||||||
|                     }, |                     }, | ||||||
|  |                     Reply::Version(v) => { | ||||||
|  |                         *res.version_mut() = v; | ||||||
|  |                     }, | ||||||
|                     Reply::Header(name, value) => { |                     Reply::Header(name, value) => { | ||||||
|                         res.headers_mut().insert(name, value); |                         res.headers_mut().insert(name, value); | ||||||
|                     }, |                     }, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user