Skip to content

Commit f6015e3

Browse files
committed
chore(http1): add test cases for max_headers
Signed-off-by: Yu Li <[email protected]>
1 parent 32805b9 commit f6015e3

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed

src/proto/h1/role.rs

+119
Original file line numberDiff line numberDiff line change
@@ -2698,6 +2698,125 @@ mod tests {
26982698
assert_eq!(parsed.head.headers["server"], "hello\tworld");
26992699
}
27002700

2701+
#[test]
2702+
fn parse_too_large_headers() {
2703+
fn gen_req_with_headers(num: usize) -> String {
2704+
let mut req = String::from("GET / HTTP/1.1\r\n");
2705+
for i in 0..num {
2706+
req.push_str(&format!("key{i}: val{i}\r\n"));
2707+
}
2708+
req.push_str("\r\n");
2709+
req
2710+
}
2711+
fn gen_resp_with_headers(num: usize) -> String {
2712+
let mut req = String::from("HTTP/1.1 200 OK\r\n");
2713+
for i in 0..num {
2714+
req.push_str(&format!("key{i}: val{i}\r\n"));
2715+
}
2716+
req.push_str("\r\n");
2717+
req
2718+
}
2719+
fn parse(gen_size: usize, max_headers: Option<usize>, should_success: bool) {
2720+
{
2721+
// server side
2722+
let mut bytes = BytesMut::from(gen_req_with_headers(gen_size).as_str());
2723+
let result = Server::parse(
2724+
&mut bytes,
2725+
ParseContext {
2726+
cached_headers: &mut None,
2727+
req_method: &mut None,
2728+
h1_parser_config: Default::default(),
2729+
h1_max_headers: max_headers.unwrap_or(DEFAULT_MAX_HEADERS),
2730+
h1_header_read_timeout: None,
2731+
h1_header_read_timeout_fut: &mut None,
2732+
h1_header_read_timeout_running: &mut false,
2733+
timer: Time::Empty,
2734+
preserve_header_case: false,
2735+
#[cfg(feature = "ffi")]
2736+
preserve_header_order: false,
2737+
h09_responses: false,
2738+
#[cfg(feature = "ffi")]
2739+
on_informational: &mut None,
2740+
},
2741+
);
2742+
if should_success {
2743+
result.expect("parse ok").expect("parse complete");
2744+
} else {
2745+
result.expect_err("parse should err");
2746+
}
2747+
}
2748+
{
2749+
// client side
2750+
let mut bytes = BytesMut::from(gen_resp_with_headers(gen_size).as_str());
2751+
let result = Client::parse(
2752+
&mut bytes,
2753+
ParseContext {
2754+
cached_headers: &mut None,
2755+
req_method: &mut None,
2756+
h1_parser_config: Default::default(),
2757+
h1_max_headers: max_headers.unwrap_or(DEFAULT_MAX_HEADERS),
2758+
h1_header_read_timeout: None,
2759+
h1_header_read_timeout_fut: &mut None,
2760+
h1_header_read_timeout_running: &mut false,
2761+
timer: Time::Empty,
2762+
preserve_header_case: false,
2763+
#[cfg(feature = "ffi")]
2764+
preserve_header_order: false,
2765+
h09_responses: false,
2766+
#[cfg(feature = "ffi")]
2767+
on_informational: &mut None,
2768+
},
2769+
);
2770+
if should_success {
2771+
result.expect("parse ok").expect("parse complete");
2772+
} else {
2773+
result.expect_err("parse should err");
2774+
}
2775+
}
2776+
}
2777+
2778+
// check generator
2779+
assert_eq!(
2780+
gen_req_with_headers(0),
2781+
String::from("GET / HTTP/1.1\r\n\r\n")
2782+
);
2783+
assert_eq!(
2784+
gen_req_with_headers(1),
2785+
String::from("GET / HTTP/1.1\r\nkey0: val0\r\n\r\n")
2786+
);
2787+
assert_eq!(
2788+
gen_req_with_headers(2),
2789+
String::from("GET / HTTP/1.1\r\nkey0: val0\r\nkey1: val1\r\n\r\n")
2790+
);
2791+
assert_eq!(
2792+
gen_req_with_headers(3),
2793+
String::from("GET / HTTP/1.1\r\nkey0: val0\r\nkey1: val1\r\nkey2: val2\r\n\r\n")
2794+
);
2795+
2796+
// default max_headers is 100
2797+
parse(0, None, true);
2798+
parse(1, None, true);
2799+
parse(50, None, true);
2800+
parse(99, None, true);
2801+
parse(100, None, true);
2802+
parse(101, None, false);
2803+
parse(102, None, false);
2804+
parse(200, None, false);
2805+
2806+
// max_headers is 0, parser does not accept headers
2807+
parse(0, Some(0), true);
2808+
parse(1, Some(0), false);
2809+
parse(100, Some(0), false);
2810+
2811+
// max_headers is 200
2812+
parse(0, Some(200), true);
2813+
parse(1, Some(200), true);
2814+
parse(100, Some(200), true);
2815+
parse(200, Some(200), true);
2816+
parse(201, Some(200), false);
2817+
parse(210, Some(200), false);
2818+
}
2819+
27012820
#[test]
27022821
fn test_write_headers_orig_case_empty_value() {
27032822
let mut headers = HeaderMap::new();

0 commit comments

Comments
 (0)