feat(http2): allow HTTP/2 requests by ALPN when http2_only is unset (#2527)

This commit is contained in:
Geoffry Song
2021-05-19 10:01:20 -07:00
committed by GitHub
parent 4cd06bf256
commit be9677a1e7
2 changed files with 19 additions and 6 deletions

View File

@@ -170,11 +170,7 @@ where
)));
}
}
other_h2 @ Version::HTTP_2 => {
if self.config.ver != Ver::Http2 {
return ResponseFuture::error_version(other_h2);
}
}
Version::HTTP_2 => (),
// completely unsupported HTTP version (like HTTP/0.9)!
other => return ResponseFuture::error_version(other),
};
@@ -230,6 +226,13 @@ where
let mut pooled = self.connection_for(pool_key).await?;
if pooled.is_http1() {
if req.version() == Version::HTTP_2 {
warn!("Connection is HTTP/1, but request requires HTTP/2");
return Err(ClientError::Normal(
crate::Error::new_user_unsupported_version(),
));
}
if self.config.set_host {
let uri = req.uri().clone();
req.headers_mut().entry(HOST).or_insert_with(|| {

View File

@@ -2116,9 +2116,19 @@ mod dispatch_impl {
// so the unwrapped responses futures show it still worked.
assert_eq!(connects.load(Ordering::SeqCst), 3);
let res4 = client.get(url);
let res4 = client.get(url.clone());
rt.block_on(res4).unwrap();
// HTTP/2 request allowed
let res5 = client.request(
Request::builder()
.uri(url)
.version(hyper::Version::HTTP_2)
.body(Default::default())
.unwrap(),
);
rt.block_on(res5).unwrap();
assert_eq!(
connects.load(Ordering::SeqCst),
3,