@@ -2698,6 +2698,125 @@ mod tests {
2698
2698
assert_eq ! ( parsed. head. headers[ "server" ] , "hello\t world" ) ;
2699
2699
}
2700
2700
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 \n key0: val0\r \n \r \n " )
2786
+ ) ;
2787
+ assert_eq ! (
2788
+ gen_req_with_headers( 2 ) ,
2789
+ String :: from( "GET / HTTP/1.1\r \n key0: val0\r \n key1: val1\r \n \r \n " )
2790
+ ) ;
2791
+ assert_eq ! (
2792
+ gen_req_with_headers( 3 ) ,
2793
+ String :: from( "GET / HTTP/1.1\r \n key0: val0\r \n key1: val1\r \n key2: 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
+
2701
2820
#[ test]
2702
2821
fn test_write_headers_orig_case_empty_value ( ) {
2703
2822
let mut headers = HeaderMap :: new ( ) ;
0 commit comments