Skip to content

Commit 1881db6

Browse files
authored
fix(http1): remove panic for HTTP upgrades that have been ignored (#2115)
Closes #2114
1 parent ba2a144 commit 1881db6

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

src/proto/h1/conn.rs

-1
Original file line numberDiff line numberDiff line change
@@ -902,7 +902,6 @@ impl State {
902902
}
903903

904904
fn prepare_upgrade(&mut self) -> crate::upgrade::OnUpgrade {
905-
debug_assert!(self.upgrade.is_none());
906905
let (tx, rx) = crate::upgrade::pending();
907906
self.upgrade = Some(tx);
908907
rx

tests/server.rs

+40
Original file line numberDiff line numberDiff line change
@@ -1323,6 +1323,46 @@ async fn upgrades_new() {
13231323
assert_eq!(s(&vec), "bar=foo");
13241324
}
13251325

1326+
#[tokio::test]
1327+
async fn upgrades_ignored() {
1328+
let _ = pretty_env_logger::try_init();
1329+
let mut listener = tcp_bind(&"127.0.0.1:0".parse().unwrap()).unwrap();
1330+
let addr = listener.local_addr().unwrap();
1331+
1332+
tokio::spawn(async move {
1333+
let svc = service_fn(move |req: Request<Body>| {
1334+
assert_eq!(req.headers()["upgrade"], "yolo");
1335+
future::ok::<_, hyper::Error>(Response::new(hyper::Body::empty()))
1336+
});
1337+
1338+
let (socket, _) = listener.accept().await.unwrap();
1339+
Http::new()
1340+
.serve_connection(socket, svc)
1341+
.with_upgrades()
1342+
.await
1343+
.expect("server task");
1344+
});
1345+
1346+
let client = hyper::Client::new();
1347+
let url = format!("http://{}/", addr);
1348+
1349+
let make_req = || {
1350+
hyper::Request::builder()
1351+
.uri(&*url)
1352+
.header("upgrade", "yolo")
1353+
.header("connection", "upgrade")
1354+
.body(hyper::Body::empty())
1355+
.expect("make_req")
1356+
};
1357+
1358+
let res1 = client.request(make_req()).await.expect("req 1");
1359+
assert_eq!(res1.status(), 200);
1360+
drop(res1);
1361+
1362+
let res2 = client.request(make_req()).await.expect("req 2");
1363+
assert_eq!(res2.status(), 200);
1364+
}
1365+
13261366
#[tokio::test]
13271367
async fn http_connect_new() {
13281368
use tokio::io::{AsyncReadExt, AsyncWriteExt};

0 commit comments

Comments
 (0)