@@ -2713,6 +2713,143 @@ mod tests {
2713
2713
assert_eq ! ( parsed. head. headers[ "server" ] , "hello\t world" ) ;
2714
2714
}
2715
2715
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 \n key0: val0\r \n \r \n " )
2801
+ ) ;
2802
+ assert_eq ! (
2803
+ gen_req_with_headers( 2 ) ,
2804
+ String :: from( "GET / HTTP/1.1\r \n key0: val0\r \n key1: val1\r \n \r \n " )
2805
+ ) ;
2806
+ assert_eq ! (
2807
+ gen_req_with_headers( 3 ) ,
2808
+ String :: from( "GET / HTTP/1.1\r \n key0: val0\r \n key1: val1\r \n key2: 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
+
2716
2853
#[ test]
2717
2854
fn test_write_headers_orig_case_empty_value ( ) {
2718
2855
let mut headers = HeaderMap :: new ( ) ;
0 commit comments