feat(http2): allow HTTP/2 requests by ALPN when http2_only is unset (#2527)
This commit is contained in:
@@ -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(|| {
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user