Skip to content

Commit

Permalink
feat(http2): allow HTTP/2 requests by ALPN when http2_only is unset (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
goffrie authored May 19, 2021
1 parent 4cd06bf commit be9677a
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 6 deletions.
13 changes: 8 additions & 5 deletions src/client/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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),
};
Expand Down Expand Up @@ -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(|| {
Expand Down
12 changes: 11 additions & 1 deletion tests/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit be9677a

Please sign in to comment.