Skip to content

Commit 195fbb2

Browse files
committed
fix(server): coerce responses with HTTP2 version to HTTP/1.1 when protocol is 1.x
1 parent 853266d commit 195fbb2

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

src/proto/h1/role.rs

+4
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,10 @@ impl Http1Transaction for Server {
267267
match msg.head.version {
268268
Version::HTTP_10 => extend(dst, b"HTTP/1.0 "),
269269
Version::HTTP_11 => extend(dst, b"HTTP/1.1 "),
270+
Version::HTTP_2 => {
271+
warn!("response with HTTP2 version coerced to HTTP/1.1");
272+
extend(dst, b"HTTP/1.1 ");
273+
},
270274
_ => unreachable!(),
271275
}
272276

tests/server.rs

+28
Original file line numberDiff line numberDiff line change
@@ -1542,6 +1542,25 @@ fn streaming_body() {
15421542
rt.block_on(fut.join(rx)).unwrap();
15431543
}
15441544

1545+
#[test]
1546+
fn http1_response_with_http2_version() {
1547+
let server = serve();
1548+
let addr_str = format!("http://{}", server.addr());
1549+
1550+
let mut rt = Runtime::new().expect("runtime new");
1551+
1552+
server
1553+
.reply()
1554+
.version(hyper::Version::HTTP_2);
1555+
1556+
rt.block_on(hyper::rt::lazy(move || {
1557+
let client = Client::new();
1558+
let uri = addr_str.parse().expect("server addr should parse");
1559+
1560+
client.get(uri)
1561+
})).unwrap();
1562+
}
1563+
15451564
#[test]
15461565
fn try_h2() {
15471566
let server = serve();
@@ -1641,6 +1660,11 @@ impl<'a> ReplyBuilder<'a> {
16411660
self
16421661
}
16431662

1663+
fn version(self, version: hyper::Version) -> Self {
1664+
self.tx.send(Reply::Version(version)).unwrap();
1665+
self
1666+
}
1667+
16441668
fn header<V: AsRef<str>>(self, name: &str, value: V) -> Self {
16451669
let name = HeaderName::from_bytes(name.as_bytes()).expect("header name");
16461670
let value = HeaderValue::from_str(value.as_ref()).expect("header value");
@@ -1681,6 +1705,7 @@ struct TestService {
16811705
#[derive(Debug)]
16821706
enum Reply {
16831707
Status(hyper::StatusCode),
1708+
Version(hyper::Version),
16841709
Header(HeaderName, HeaderValue),
16851710
Body(hyper::Body),
16861711
End,
@@ -1718,6 +1743,9 @@ impl TestService {
17181743
Reply::Status(s) => {
17191744
*res.status_mut() = s;
17201745
},
1746+
Reply::Version(v) => {
1747+
*res.version_mut() = v;
1748+
},
17211749
Reply::Header(name, value) => {
17221750
res.headers_mut().insert(name, value);
17231751
},

0 commit comments

Comments
 (0)