Large header sets might require being split up across multiple frames. This patch adds support for doing so.
87 lines
2.4 KiB
Rust
87 lines
2.4 KiB
Rust
#[macro_use]
|
|
pub mod support;
|
|
use support::prelude::*;
|
|
|
|
#[test]
|
|
fn write_continuation_frames() {
|
|
// An invalid dependency ID results in a stream level error. The hpack
|
|
// payload should still be decoded.
|
|
let _ = ::env_logger::init();
|
|
let (io, srv) = mock::new();
|
|
|
|
let large = build_large_headers();
|
|
|
|
// Build the large request frame
|
|
let frame = large.iter().fold(
|
|
frames::headers(1).request("GET", "https://http2.akamai.com/"),
|
|
|frame, &(name, ref value)| frame.field(name, &value[..]));
|
|
|
|
let srv = srv.assert_client_handshake()
|
|
.unwrap()
|
|
.recv_settings()
|
|
.recv_frame(frame.eos())
|
|
.send_frame(
|
|
frames::headers(1)
|
|
.response(204)
|
|
.eos(),
|
|
)
|
|
.close();
|
|
|
|
let client = Client::handshake(io)
|
|
.expect("handshake")
|
|
.and_then(|(mut client, conn)| {
|
|
let mut request = Request::builder();
|
|
request.uri("https://http2.akamai.com/");
|
|
|
|
for &(name, ref value) in &large {
|
|
request.header(name, &value[..]);
|
|
}
|
|
|
|
let request = request
|
|
.body(())
|
|
.unwrap();
|
|
|
|
let req = client
|
|
.send_request(request, true)
|
|
.expect("send_request1")
|
|
.0
|
|
.then(|res| {
|
|
let response = res.unwrap();
|
|
assert_eq!(response.status(), StatusCode::NO_CONTENT);
|
|
Ok::<_, ()>(())
|
|
});
|
|
|
|
conn.drive(req)
|
|
.and_then(move |(h2, _)| {
|
|
h2.unwrap()
|
|
})
|
|
});
|
|
|
|
client.join(srv).wait().expect("wait");
|
|
}
|
|
|
|
fn build_large_headers() -> Vec<(&'static str, String)> {
|
|
vec![
|
|
("one", "hello".to_string()),
|
|
("two", build_large_string('2', 4 * 1024)),
|
|
("three", "three".to_string()),
|
|
("four", build_large_string('4', 4 * 1024)),
|
|
("five", "five".to_string()),
|
|
("six", build_large_string('6', 4 * 1024)),
|
|
("seven", "seven".to_string()),
|
|
("eight", build_large_string('8', 4 * 1024)),
|
|
("nine", "nine".to_string()),
|
|
("ten", build_large_string('0', 4 * 1024)),
|
|
]
|
|
}
|
|
|
|
fn build_large_string(ch: char, len: usize) -> String {
|
|
let mut ret = String::new();
|
|
|
|
for _ in 0..len {
|
|
ret.push(ch);
|
|
}
|
|
|
|
ret
|
|
}
|