diff --git a/tests/upgrade.rs b/tests/upgrade.rs index bc6ce9a7..14fb26a3 100644 --- a/tests/upgrade.rs +++ b/tests/upgrade.rs @@ -1,5 +1,6 @@ #![cfg(not(target_arch = "wasm32"))] mod support; +use http::Method; use support::server; use tokio::io::{AsyncReadExt, AsyncWriteExt}; @@ -49,3 +50,53 @@ async fn http_upgrade() { upgraded.read_to_end(&mut buf).await.unwrap(); assert_eq!(buf, b"bar=foo"); } + +#[tokio::test] +async fn http2_upgrade() { + let server = server::http_with_config( + move |req| { + assert_eq!(req.method(), http::Method::CONNECT); + assert_eq!(req.version(), http::Version::HTTP_2); + + tokio::spawn(async move { + let mut upgraded = + hyper_util::rt::TokioIo::new(hyper::upgrade::on(req).await.unwrap()); + + let mut buf = vec![0; 7]; + upgraded.read_exact(&mut buf).await.unwrap(); + assert_eq!(buf, b"foo=bar"); + + upgraded.write_all(b"bar=foo").await.unwrap(); + }); + + async { + http::Response::builder() + .body(rquest::Body::default()) + .unwrap() + } + }, + |builder| { + let mut http2 = builder.http2(); + http2.enable_connect_protocol(); + }, + ); + + let res = rquest::Client::builder() + .http2_only() + .build() + .unwrap() + .request(Method::CONNECT, format!("http://{}", server.addr())) + .send() + .await + .unwrap(); + + assert_eq!(res.status(), http::StatusCode::OK); + assert_eq!(res.version(), http::Version::HTTP_2); + let mut upgraded = res.upgrade().await.unwrap(); + + upgraded.write_all(b"foo=bar").await.unwrap(); + + let mut buf = vec![]; + upgraded.read_to_end(&mut buf).await.unwrap(); + assert_eq!(buf, b"bar=foo"); +}