in neqo-http3/src/connection_client.rs [6302:6374]
fn two_push_promises_and_header_block() {
let mut client = default_http3_client_param(200);
let mut server = TestServer::new_with_settings(&[
HSetting::new(HSettingType::MaxTableCapacity, 200),
HSetting::new(HSettingType::BlockedStreams, 100),
HSetting::new(HSettingType::MaxHeaderListSize, 10000),
]);
connect_only_transport_with(&mut client, &mut server);
server.create_control_stream();
server.create_qpack_streams();
setup_server_side_encoder_param(&mut client, &mut server, 200);
let request_stream_id = make_request_and_exchange_pkts(&mut client, &mut server, true);
// Send a PushPromise that is blocked until encoder_inst_pkt2 is process by the client.
let encoder_inst_pkt1 = send_push_promise_using_encoder_with_custom_headers(
&mut client,
&mut server,
request_stream_id,
PushId::new(0),
Header::new("myn1", "myv1"),
);
// PushPromise is blocked watching for encoder instructions.
assert!(!check_push_events(&mut client));
let encoder_inst_pkt2 = send_push_promise_using_encoder_with_custom_headers(
&mut client,
&mut server,
request_stream_id,
PushId::new(1),
Header::new("myn2", "myv2"),
);
// PushPromise is blocked watching for encoder instructions.
assert!(!check_push_events(&mut client));
let response_headers = vec![
Header::new(":status", "200"),
Header::new("content-length", "1234"),
Header::new("myn3", "myv3"),
];
let encoded_headers = server.encoder.borrow_mut().encode_header_block(
&mut server.conn,
&response_headers,
request_stream_id,
);
let header_hframe = HFrame::Headers {
header_block: encoded_headers.to_vec(),
};
let mut d = Encoder::default();
header_hframe.encode(&mut d);
server_send_response_and_exchange_packet(
&mut client,
&mut server,
request_stream_id,
&d,
false,
);
// The response headers are blocked.
assert!(!check_header_ready(&mut client));
// Let client receive the encoder instructions.
let _out = client.process(encoder_inst_pkt1, now());
assert!(check_push_events(&mut client));
// Let client receive the encoder instructions.
let _out = client.process(encoder_inst_pkt2, now());
assert!(check_header_ready_and_push_promise(&mut client));
}