Skip to content

Commit 24bef8e

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

File tree

1 file changed

+137
-0
lines changed

1 file changed

+137
-0
lines changed

src/proto/h1/role.rs

+137
Original file line numberDiff line numberDiff line change
@@ -2713,6 +2713,143 @@ mod tests {
27132713
assert_eq!(parsed.head.headers["server"], "hello\tworld");
27142714
}
27152715

2716+
#[test]
2717+
fn parse_too_large_headers() {
2718+
fn gen_req_with_headers(num: usize) -> String {
2719+
let mut req = String::from("GET / HTTP/1.1\r\n");
2720+
for i in 0..num {
2721+
req.push_str(&format!("key{i}: val{i}\r\n"));
2722+
}
2723+
req.push_str("\r\n");
2724+
req
2725+
}
2726+
fn gen_resp_with_headers(num: usize) -> String {
2727+
let mut req = String::from("HTTP/1.1 200 OK\r\n");
2728+
for i in 0..num {
2729+
req.push_str(&format!("key{i}: val{i}\r\n"));
2730+
}
2731+
req.push_str("\r\n");
2732+
req
2733+
}
2734+
fn parse(max_headers: Option<usize>, gen_size: usize, should_success: bool) {
2735+
{
2736+
// server side
2737+
let mut bytes = BytesMut::from(gen_req_with_headers(gen_size).as_str());
2738+
let result = Server::parse(
2739+
&mut bytes,
2740+
ParseContext {
2741+
cached_headers: &mut None,
2742+
req_method: &mut None,
2743+
h1_parser_config: Default::default(),
2744+
h1_max_headers: max_headers,
2745+
h1_header_read_timeout: None,
2746+
h1_header_read_timeout_fut: &mut None,
2747+
h1_header_read_timeout_running: &mut false,
2748+
timer: Time::Empty,
2749+
preserve_header_case: false,
2750+
#[cfg(feature = "ffi")]
2751+
preserve_header_order: false,
2752+
h09_responses: false,
2753+
#[cfg(feature = "ffi")]
2754+
on_informational: &mut None,
2755+
},
2756+
);
2757+
if should_success {
2758+
result.expect("parse ok").expect("parse complete");
2759+
} else {
2760+
result.expect_err("parse should err");
2761+
}
2762+
}
2763+
{
2764+
// client side
2765+
let mut bytes = BytesMut::from(gen_resp_with_headers(gen_size).as_str());
2766+
let result = Client::parse(
2767+
&mut bytes,
2768+
ParseContext {
2769+
cached_headers: &mut None,
2770+
req_method: &mut None,
2771+
h1_parser_config: Default::default(),
2772+
h1_max_headers: max_headers,
2773+
h1_header_read_timeout: None,
2774+
h1_header_read_timeout_fut: &mut None,
2775+
h1_header_read_timeout_running: &mut false,
2776+
timer: Time::Empty,
2777+
preserve_header_case: false,
2778+
#[cfg(feature = "ffi")]
2779+
preserve_header_order: false,
2780+
h09_responses: false,
2781+
#[cfg(feature = "ffi")]
2782+
on_informational: &mut None,
2783+
},
2784+
);
2785+
if should_success {
2786+
result.expect("parse ok").expect("parse complete");
2787+
} else {
2788+
result.expect_err("parse should err");
2789+
}
2790+
}
2791+
}
2792+
2793+
// check generator
2794+
assert_eq!(
2795+
gen_req_with_headers(0),
2796+
String::from("GET / HTTP/1.1\r\n\r\n")
2797+
);
2798+
assert_eq!(
2799+
gen_req_with_headers(1),
2800+
String::from("GET / HTTP/1.1\r\nkey0: val0\r\n\r\n")
2801+
);
2802+
assert_eq!(
2803+
gen_req_with_headers(2),
2804+
String::from("GET / HTTP/1.1\r\nkey0: val0\r\nkey1: val1\r\n\r\n")
2805+
);
2806+
assert_eq!(
2807+
gen_req_with_headers(3),
2808+
String::from("GET / HTTP/1.1\r\nkey0: val0\r\nkey1: val1\r\nkey2: val2\r\n\r\n")
2809+
);
2810+
2811+
// default max_headers is 100, so
2812+
//
2813+
// - less than or equal to 100, accepted
2814+
//
2815+
parse(None, 0, true);
2816+
parse(None, 1, true);
2817+
parse(None, 50, true);
2818+
parse(None, 99, true);
2819+
parse(None, 100, true);
2820+
//
2821+
// - more than 100, rejected
2822+
//
2823+
parse(None, 101, false);
2824+
parse(None, 102, false);
2825+
parse(None, 200, false);
2826+
2827+
// max_headers is 0, parser will reject any headers
2828+
//
2829+
// - without header, accepted
2830+
//
2831+
parse(Some(0), 0, true);
2832+
//
2833+
// - with header(s), rejected
2834+
//
2835+
parse(Some(0), 1, false);
2836+
parse(Some(0), 100, false);
2837+
2838+
// max_headers is 200
2839+
//
2840+
// - less than or equal to 200, accepted
2841+
//
2842+
parse(Some(200), 0, true);
2843+
parse(Some(200), 1, true);
2844+
parse(Some(200), 100, true);
2845+
parse(Some(200), 200, true);
2846+
//
2847+
// - more than 200, rejected
2848+
//
2849+
parse(Some(200), 201, false);
2850+
parse(Some(200), 210, false);
2851+
}
2852+
27162853
#[test]
27172854
fn test_write_headers_orig_case_empty_value() {
27182855
let mut headers = HeaderMap::new();

0 commit comments

Comments
 (0)