Skip to content

Commit b9d5397

Browse files
authored
test: window update stream errors count towards local max (#859)
test: more local reset counts
1 parent 41a0f80 commit b9d5397

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed

tests/h2-tests/tests/flow_control.rs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1989,3 +1989,61 @@ async fn reclaim_reserved_capacity() {
19891989

19901990
join(mock, h2).await;
19911991
}
1992+
1993+
// ==== abusive window updates ====
1994+
1995+
#[tokio::test]
1996+
async fn too_many_window_update_resets_causes_go_away() {
1997+
h2_support::trace_init!();
1998+
let (io, mut client) = mock::new();
1999+
2000+
let client = async move {
2001+
let settings = client.assert_server_handshake().await;
2002+
assert_default_settings!(settings);
2003+
for s in (1..21).step_by(2) {
2004+
client
2005+
.send_frame(
2006+
frames::headers(s)
2007+
.request("GET", "https://example.com/")
2008+
.eos(),
2009+
)
2010+
.await;
2011+
// send a bunch of bad window updates before any headers
2012+
client
2013+
.send_frame(frames::window_update(s, u32::MAX - 2))
2014+
.await;
2015+
client.recv_frame(frames::reset(s).flow_control()).await;
2016+
}
2017+
2018+
client
2019+
.send_frame(
2020+
frames::headers(21)
2021+
.request("GET", "https://example.com/")
2022+
.eos(),
2023+
)
2024+
.await;
2025+
// send a bunch of bad window updates before any headers
2026+
client
2027+
.send_frame(frames::window_update(21, u32::MAX - 2))
2028+
.await;
2029+
client
2030+
.recv_frame(frames::go_away(21).calm().data("too_many_internal_resets"))
2031+
.await;
2032+
};
2033+
let srv = async move {
2034+
let mut conn = server::Builder::new()
2035+
.max_local_error_reset_streams(Some(10))
2036+
.handshake::<_, Bytes>(io)
2037+
.await
2038+
.unwrap();
2039+
for _ in (1..21).step_by(2) {
2040+
let (_, _) = conn.next().await.unwrap().unwrap();
2041+
}
2042+
let err = conn.next().await.unwrap().unwrap_err();
2043+
assert!(err.is_go_away());
2044+
assert!(err.is_library());
2045+
assert_eq!(err.reason(), Some(Reason::ENHANCE_YOUR_CALM));
2046+
};
2047+
2048+
join(srv, client).await;
2049+
}

tests/h2-tests/tests/server.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,6 +1239,46 @@ async fn send_reset_explicitly() {
12391239
join(client, srv).await;
12401240
}
12411241

1242+
#[tokio::test]
1243+
async fn send_reset_explicitly_does_not_affect_local_limit() {
1244+
h2_support::trace_init!();
1245+
let (io, mut client) = mock::new();
1246+
1247+
let client = async move {
1248+
let settings = client.assert_server_handshake().await;
1249+
assert_default_settings!(settings);
1250+
for s in (1..9).step_by(2) {
1251+
client
1252+
.send_frame(
1253+
frames::headers(s)
1254+
.request("GET", "https://example.com/")
1255+
.eos(),
1256+
)
1257+
.await;
1258+
client
1259+
.recv_frame(frames::reset(s).reason(Reason::INTERNAL_ERROR))
1260+
.await;
1261+
}
1262+
};
1263+
1264+
let srv = async move {
1265+
let mut srv = server::Builder::new()
1266+
.max_local_error_reset_streams(Some(3))
1267+
.handshake::<_, Bytes>(io)
1268+
.await
1269+
.expect("handshake");
1270+
1271+
for _s in (1..9).step_by(2) {
1272+
let (_req, mut stream) = srv.next().await.unwrap().unwrap();
1273+
stream.send_reset(Reason::INTERNAL_ERROR);
1274+
}
1275+
1276+
assert!(srv.next().await.is_none());
1277+
};
1278+
1279+
join(client, srv).await;
1280+
}
1281+
12421282
#[tokio::test]
12431283
async fn extended_connect_protocol_disabled_by_default() {
12441284
h2_support::trace_init!();

0 commit comments

Comments
 (0)