in neqo-http3/src/connection_client.rs [3777:3845]
fn stream_fin_after_headers_an_empty_data_frame_are_read() {
let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
// Send some good data without fin
// Send headers.
_ = server
.conn
.stream_send(request_stream_id, HTTP_RESPONSE_HEADER_ONLY_2)
.unwrap();
// Send an empty data frame.
_ = server
.conn
.stream_send(request_stream_id, &[0x00, 0x00])
.unwrap();
let out = server.conn.process_output(now());
client.process(out.dgram(), now());
// Recv headers without fin
while let Some(e) = client.next_event() {
match e {
Http3ClientEvent::HeaderReady {
stream_id,
headers,
interim,
fin,
} => {
assert_eq!(stream_id, request_stream_id);
check_response_header_2(&headers);
assert!(!fin);
assert!(!interim);
}
Http3ClientEvent::DataReadable { .. } => {
panic!("We should not receive a DataGeadable event!");
}
_ => {}
}
}
// ok NOW send fin
server.conn.stream_close_send(request_stream_id).unwrap();
let out = server.conn.process_output(now());
client.process(out.dgram(), now());
// Recv no data, but do get fin
while let Some(e) = client.next_event() {
match e {
Http3ClientEvent::HeaderReady { .. } => {
panic!("We should not get another HeaderReady!");
}
Http3ClientEvent::DataReadable { stream_id } => {
assert_eq!(stream_id, request_stream_id);
let mut buf = [0_u8; 100];
let res = client.read_data(now(), stream_id, &mut buf);
let (len, fin) = res.expect("should read");
assert_eq!(0, len);
assert!(fin);
}
_ => {}
}
}
// Stream should now be closed and gone
let mut buf = [0_u8; 100];
assert_eq!(
client.read_data(now(), StreamId::new(0), &mut buf),
Err(Error::InvalidStreamId)
);
}