@@ -2651,6 +2651,156 @@ test_simple (const char *buf, enum http_errno err_expected)
26512651 }
26522652}
26532653
2654+ void
2655+ test_invalid_header_content (int req , const char * str )
2656+ {
2657+ http_parser parser ;
2658+ http_parser_init (& parser , req ? HTTP_REQUEST : HTTP_RESPONSE );
2659+ size_t parsed ;
2660+ const char * buf ;
2661+ buf = req ?
2662+ "GET / HTTP/1.1\r\n" :
2663+ "HTTP/1.1 200 OK\r\n" ;
2664+ parsed = http_parser_execute (& parser , & settings_null , buf , strlen (buf ));
2665+ assert (parsed == strlen (buf ));
2666+
2667+ buf = str ;
2668+ size_t buflen = strlen (buf );
2669+
2670+ parsed = http_parser_execute (& parser , & settings_null , buf , buflen );
2671+ if (parsed != buflen ) {
2672+ assert (HTTP_PARSER_ERRNO (& parser ) == HPE_INVALID_HEADER_TOKEN );
2673+ return ;
2674+ }
2675+
2676+ fprintf (stderr ,
2677+ "\n*** Error expected but none in invalid header content test ***\n" );
2678+ abort ();
2679+ }
2680+
2681+ void
2682+ test_invalid_header_field_content_error (int req )
2683+ {
2684+ test_invalid_header_content (req , "Foo: F\01ailure" );
2685+ test_invalid_header_content (req , "Foo: B\02ar" );
2686+ }
2687+
2688+ void
2689+ test_invalid_header_field (int req , const char * str )
2690+ {
2691+ http_parser parser ;
2692+ http_parser_init (& parser , req ? HTTP_REQUEST : HTTP_RESPONSE );
2693+ size_t parsed ;
2694+ const char * buf ;
2695+ buf = req ?
2696+ "GET / HTTP/1.1\r\n" :
2697+ "HTTP/1.1 200 OK\r\n" ;
2698+ parsed = http_parser_execute (& parser , & settings_null , buf , strlen (buf ));
2699+ assert (parsed == strlen (buf ));
2700+
2701+ buf = str ;
2702+ size_t buflen = strlen (buf );
2703+
2704+ parsed = http_parser_execute (& parser , & settings_null , buf , buflen );
2705+ if (parsed != buflen ) {
2706+ assert (HTTP_PARSER_ERRNO (& parser ) == HPE_INVALID_HEADER_TOKEN );
2707+ return ;
2708+ }
2709+
2710+ fprintf (stderr ,
2711+ "\n*** Error expected but none in invalid header token test ***\n" );
2712+ abort ();
2713+ }
2714+
2715+ void
2716+ test_invalid_header_field_token_error (int req )
2717+ {
2718+ test_invalid_header_field (req , "Fo@: Failure" );
2719+ test_invalid_header_field (req , "Foo\01\test: Bar" );
2720+ }
2721+
2722+ void
2723+ test_double_content_length_error (int req )
2724+ {
2725+ http_parser parser ;
2726+ http_parser_init (& parser , req ? HTTP_REQUEST : HTTP_RESPONSE );
2727+ size_t parsed ;
2728+ const char * buf ;
2729+ buf = req ?
2730+ "GET / HTTP/1.1\r\n" :
2731+ "HTTP/1.1 200 OK\r\n" ;
2732+ parsed = http_parser_execute (& parser , & settings_null , buf , strlen (buf ));
2733+ assert (parsed == strlen (buf ));
2734+
2735+ buf = "Content-Length: 0\r\nContent-Length: 1\r\n\r\n" ;
2736+ size_t buflen = strlen (buf );
2737+
2738+ parsed = http_parser_execute (& parser , & settings_null , buf , buflen );
2739+ if (parsed != buflen ) {
2740+ assert (HTTP_PARSER_ERRNO (& parser ) == HPE_UNEXPECTED_CONTENT_LENGTH );
2741+ return ;
2742+ }
2743+
2744+ fprintf (stderr ,
2745+ "\n*** Error expected but none in double content-length test ***\n" );
2746+ abort ();
2747+ }
2748+
2749+ void
2750+ test_chunked_content_length_error (int req )
2751+ {
2752+ http_parser parser ;
2753+ http_parser_init (& parser , req ? HTTP_REQUEST : HTTP_RESPONSE );
2754+ size_t parsed ;
2755+ const char * buf ;
2756+ buf = req ?
2757+ "GET / HTTP/1.1\r\n" :
2758+ "HTTP/1.1 200 OK\r\n" ;
2759+ parsed = http_parser_execute (& parser , & settings_null , buf , strlen (buf ));
2760+ assert (parsed == strlen (buf ));
2761+
2762+ buf = "Transfer-Encoding: chunked\r\nContent-Length: 1\r\n\r\n" ;
2763+ size_t buflen = strlen (buf );
2764+
2765+ parsed = http_parser_execute (& parser , & settings_null , buf , buflen );
2766+ if (parsed != buflen ) {
2767+ assert (HTTP_PARSER_ERRNO (& parser ) == HPE_UNEXPECTED_CONTENT_LENGTH );
2768+ return ;
2769+ }
2770+
2771+ fprintf (stderr ,
2772+ "\n*** Error expected but none in chunked content-length test ***\n" );
2773+ abort ();
2774+ }
2775+
2776+ void
2777+ test_header_cr_no_lf_error (int req )
2778+ {
2779+ http_parser parser ;
2780+ http_parser_init (& parser , req ? HTTP_REQUEST : HTTP_RESPONSE );
2781+ size_t parsed ;
2782+ const char * buf ;
2783+ buf = req ?
2784+ "GET / HTTP/1.1\r\n" :
2785+ "HTTP/1.1 200 OK\r\n" ;
2786+ parsed = http_parser_execute (& parser , & settings_null , buf , strlen (buf ));
2787+ assert (parsed == strlen (buf ));
2788+
2789+ buf = "Foo: 1\rBar: 1\r\n\r\n" ;
2790+ size_t buflen = strlen (buf );
2791+
2792+ parsed = http_parser_execute (& parser , & settings_null , buf , buflen );
2793+ if (parsed != buflen ) {
2794+ assert (HTTP_PARSER_ERRNO (& parser ) == HPE_LF_EXPECTED );
2795+ return ;
2796+ }
2797+
2798+ fprintf (stderr ,
2799+ "\n*** Error expected but none in header whitespace test ***\n" );
2800+ abort ();
2801+ }
2802+
2803+
26542804void
26552805test_header_overflow_error (int req )
26562806{
@@ -3048,6 +3198,19 @@ main (void)
30483198 test_header_content_length_overflow_error ();
30493199 test_chunk_content_length_overflow_error ();
30503200
3201+ //// HEADER FIELD CONDITIONS
3202+ test_double_content_length_error (HTTP_REQUEST );
3203+ test_chunked_content_length_error (HTTP_REQUEST );
3204+ test_header_cr_no_lf_error (HTTP_REQUEST );
3205+ test_invalid_header_field_token_error (HTTP_REQUEST );
3206+ test_invalid_header_field_content_error (HTTP_REQUEST );
3207+ test_double_content_length_error (HTTP_RESPONSE );
3208+ test_chunked_content_length_error (HTTP_RESPONSE );
3209+ test_header_cr_no_lf_error (HTTP_RESPONSE );
3210+ test_invalid_header_field_token_error (HTTP_RESPONSE );
3211+ test_invalid_header_field_content_error (HTTP_RESPONSE );
3212+
3213+
30513214 //// RESPONSES
30523215
30533216 for (i = 0 ; i < response_count ; i ++ ) {
0 commit comments