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