fix(http1): remove panic for HTTP upgrades that have been ignored (#2115)
Closes #2114
This commit is contained in:
@@ -902,7 +902,6 @@ impl State {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn prepare_upgrade(&mut self) -> crate::upgrade::OnUpgrade {
|
fn prepare_upgrade(&mut self) -> crate::upgrade::OnUpgrade {
|
||||||
debug_assert!(self.upgrade.is_none());
|
|
||||||
let (tx, rx) = crate::upgrade::pending();
|
let (tx, rx) = crate::upgrade::pending();
|
||||||
self.upgrade = Some(tx);
|
self.upgrade = Some(tx);
|
||||||
rx
|
rx
|
||||||
|
|||||||
@@ -1323,6 +1323,46 @@ async fn upgrades_new() {
|
|||||||
assert_eq!(s(&vec), "bar=foo");
|
assert_eq!(s(&vec), "bar=foo");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn upgrades_ignored() {
|
||||||
|
let _ = pretty_env_logger::try_init();
|
||||||
|
let mut listener = tcp_bind(&"127.0.0.1:0".parse().unwrap()).unwrap();
|
||||||
|
let addr = listener.local_addr().unwrap();
|
||||||
|
|
||||||
|
tokio::spawn(async move {
|
||||||
|
let svc = service_fn(move |req: Request<Body>| {
|
||||||
|
assert_eq!(req.headers()["upgrade"], "yolo");
|
||||||
|
future::ok::<_, hyper::Error>(Response::new(hyper::Body::empty()))
|
||||||
|
});
|
||||||
|
|
||||||
|
let (socket, _) = listener.accept().await.unwrap();
|
||||||
|
Http::new()
|
||||||
|
.serve_connection(socket, svc)
|
||||||
|
.with_upgrades()
|
||||||
|
.await
|
||||||
|
.expect("server task");
|
||||||
|
});
|
||||||
|
|
||||||
|
let client = hyper::Client::new();
|
||||||
|
let url = format!("http://{}/", addr);
|
||||||
|
|
||||||
|
let make_req = || {
|
||||||
|
hyper::Request::builder()
|
||||||
|
.uri(&*url)
|
||||||
|
.header("upgrade", "yolo")
|
||||||
|
.header("connection", "upgrade")
|
||||||
|
.body(hyper::Body::empty())
|
||||||
|
.expect("make_req")
|
||||||
|
};
|
||||||
|
|
||||||
|
let res1 = client.request(make_req()).await.expect("req 1");
|
||||||
|
assert_eq!(res1.status(), 200);
|
||||||
|
drop(res1);
|
||||||
|
|
||||||
|
let res2 = client.request(make_req()).await.expect("req 2");
|
||||||
|
assert_eq!(res2.status(), 200);
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn http_connect_new() {
|
async fn http_connect_new() {
|
||||||
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
||||||
|
|||||||
Reference in New Issue
Block a user