in neqo-http3/src/connection_client.rs [3452:3538]
fn multiple_goaways() {
let (mut client, mut server) = connect();
let request_stream_id_1 = make_request(&mut client, false, &[]);
assert_eq!(request_stream_id_1, 0);
let request_stream_id_2 = make_request(&mut client, false, &[]);
assert_eq!(request_stream_id_2, 4);
let request_stream_id_3 = make_request(&mut client, false, &[]);
assert_eq!(request_stream_id_3, 8);
let out = client.process_output(now());
drop(server.conn.process(out.dgram(), now()));
// First send a Goaway frame with an higher number
_ = server
.conn
.stream_send(server.control_stream_id.unwrap(), &[0x7, 0x1, 0x8])
.unwrap();
let out = server.conn.process_output(now());
client.process(out.dgram(), now());
// Check that there is one reset for stream_id 8
let mut stream_reset_1 = 0;
while let Some(e) = client.next_event() {
if let Http3ClientEvent::Reset {
stream_id,
error,
local,
} = e
{
assert_eq!(stream_id, request_stream_id_3);
assert_eq!(error, Error::HttpRequestRejected.code());
assert!(!local);
stream_reset_1 += 1;
}
}
assert_eq!(stream_reset_1, 1);
assert_eq!(client.state(), Http3State::GoingAway(StreamId::new(8)));
// Server sends another GOAWAY frame
_ = server
.conn
.stream_send(server.control_stream_id.unwrap(), &[0x7, 0x1, 0x4])
.unwrap();
// Send response for stream 0
server_send_response_and_exchange_packet(
&mut client,
&mut server,
request_stream_id_1,
HTTP_RESPONSE_1,
true,
);
let mut stream_reset_2 = 0;
while let Some(e) = client.next_event() {
match e {
Http3ClientEvent::HeaderReady { headers, fin, .. } => {
check_response_header_1(&headers);
assert!(!fin);
}
Http3ClientEvent::DataReadable { stream_id } => {
assert!(stream_id == request_stream_id_1);
let mut buf = [0_u8; 100];
assert_eq!(
(EXPECTED_RESPONSE_DATA_1.len(), true),
client.read_data(now(), stream_id, &mut buf).unwrap()
);
}
Http3ClientEvent::Reset {
stream_id,
error,
local,
} => {
assert_eq!(stream_id, request_stream_id_2);
assert_eq!(error, Error::HttpRequestRejected.code());
assert!(!local);
stream_reset_2 += 1;
}
_ => {}
}
}
assert_eq!(stream_reset_2, 1);
assert_eq!(client.state(), Http3State::GoingAway(StreamId::new(4)));
}