@@ -3270,6 +3270,155 @@ test_simple (const char *buf, enum http_errno err_expected)
32703270 }
32713271}
32723272
3273+ void
3274+ test_invalid_header_content (int req , const char * str )
3275+ {
3276+ http_parser parser ;
3277+ http_parser_init (& parser , req ? HTTP_REQUEST : HTTP_RESPONSE );
3278+ size_t parsed ;
3279+ const char * buf ;
3280+ buf = req ?
3281+ "GET / HTTP/1.1\r\n" :
3282+ "HTTP/1.1 200 OK\r\n" ;
3283+ parsed = http_parser_execute (& parser , & settings_null , buf , strlen (buf ));
3284+ assert (parsed == strlen (buf ));
3285+
3286+ buf = str ;
3287+ size_t buflen = strlen (buf );
3288+
3289+ parsed = http_parser_execute (& parser , & settings_null , buf , buflen );
3290+ if (parsed != buflen ) {
3291+ assert (HTTP_PARSER_ERRNO (& parser ) == HPE_INVALID_HEADER_TOKEN );
3292+ return ;
3293+ }
3294+
3295+ fprintf (stderr ,
3296+ "\n*** Error expected but none in invalid header content test ***\n" );
3297+ abort ();
3298+ }
3299+
3300+ void
3301+ test_invalid_header_field_content_error (int req )
3302+ {
3303+ test_invalid_header_content (req , "Foo: F\01ailure" );
3304+ test_invalid_header_content (req , "Foo: B\02ar" );
3305+ }
3306+
3307+ void
3308+ test_invalid_header_field (int req , const char * str )
3309+ {
3310+ http_parser parser ;
3311+ http_parser_init (& parser , req ? HTTP_REQUEST : HTTP_RESPONSE );
3312+ size_t parsed ;
3313+ const char * buf ;
3314+ buf = req ?
3315+ "GET / HTTP/1.1\r\n" :
3316+ "HTTP/1.1 200 OK\r\n" ;
3317+ parsed = http_parser_execute (& parser , & settings_null , buf , strlen (buf ));
3318+ assert (parsed == strlen (buf ));
3319+
3320+ buf = str ;
3321+ size_t buflen = strlen (buf );
3322+
3323+ parsed = http_parser_execute (& parser , & settings_null , buf , buflen );
3324+ if (parsed != buflen ) {
3325+ assert (HTTP_PARSER_ERRNO (& parser ) == HPE_INVALID_HEADER_TOKEN );
3326+ return ;
3327+ }
3328+
3329+ fprintf (stderr ,
3330+ "\n*** Error expected but none in invalid header token test ***\n" );
3331+ abort ();
3332+ }
3333+
3334+ void
3335+ test_invalid_header_field_token_error (int req )
3336+ {
3337+ test_invalid_header_field (req , "Fo@: Failure" );
3338+ test_invalid_header_field (req , "Foo\01\test: Bar" );
3339+ }
3340+
3341+ void
3342+ test_double_content_length_error (int req )
3343+ {
3344+ http_parser parser ;
3345+ http_parser_init (& parser , req ? HTTP_REQUEST : HTTP_RESPONSE );
3346+ size_t parsed ;
3347+ const char * buf ;
3348+ buf = req ?
3349+ "GET / HTTP/1.1\r\n" :
3350+ "HTTP/1.1 200 OK\r\n" ;
3351+ parsed = http_parser_execute (& parser , & settings_null , buf , strlen (buf ));
3352+ assert (parsed == strlen (buf ));
3353+
3354+ buf = "Content-Length: 0\r\nContent-Length: 1\r\n\r\n" ;
3355+ size_t buflen = strlen (buf );
3356+
3357+ parsed = http_parser_execute (& parser , & settings_null , buf , buflen );
3358+ if (parsed != buflen ) {
3359+ assert (HTTP_PARSER_ERRNO (& parser ) == HPE_MULTIPLE_CONTENT_LENGTH );
3360+ return ;
3361+ }
3362+
3363+ fprintf (stderr ,
3364+ "\n*** Error expected but none in double content-length test ***\n" );
3365+ abort ();
3366+ }
3367+
3368+ void
3369+ test_chunked_content_length_error (int req )
3370+ {
3371+ http_parser parser ;
3372+ http_parser_init (& parser , req ? HTTP_REQUEST : HTTP_RESPONSE );
3373+ size_t parsed ;
3374+ const char * buf ;
3375+ buf = req ?
3376+ "GET / HTTP/1.1\r\n" :
3377+ "HTTP/1.1 200 OK\r\n" ;
3378+ parsed = http_parser_execute (& parser , & settings_null , buf , strlen (buf ));
3379+ assert (parsed == strlen (buf ));
3380+
3381+ buf = "Transfer-Encoding: chunked\r\nContent-Length: 1\r\n\r\n" ;
3382+ size_t buflen = strlen (buf );
3383+
3384+ parsed = http_parser_execute (& parser , & settings_null , buf , buflen );
3385+ if (parsed != buflen ) {
3386+ assert (HTTP_PARSER_ERRNO (& parser ) == HPE_CHUNKED_WITH_CONTENT_LENGTH );
3387+ return ;
3388+ }
3389+
3390+ fprintf (stderr ,
3391+ "\n*** Error expected but none in chunked content-length test ***\n" );
3392+ abort ();
3393+ }
3394+
3395+ void
3396+ test_header_cr_no_lf_error (int req )
3397+ {
3398+ http_parser parser ;
3399+ http_parser_init (& parser , req ? HTTP_REQUEST : HTTP_RESPONSE );
3400+ size_t parsed ;
3401+ const char * buf ;
3402+ buf = req ?
3403+ "GET / HTTP/1.1\r\n" :
3404+ "HTTP/1.1 200 OK\r\n" ;
3405+ parsed = http_parser_execute (& parser , & settings_null , buf , strlen (buf ));
3406+ assert (parsed == strlen (buf ));
3407+
3408+ buf = "Foo: 1\rBar: 1\r\n\r\n" ;
3409+ size_t buflen = strlen (buf );
3410+
3411+ parsed = http_parser_execute (& parser , & settings_null , buf , buflen );
3412+ if (parsed != buflen ) {
3413+ assert (HTTP_PARSER_ERRNO (& parser ) == HPE_LF_EXPECTED );
3414+ return ;
3415+ }
3416+
3417+ fprintf (stderr ,
3418+ "\n*** Error expected but none in header whitespace test ***\n" );
3419+ abort ();
3420+ }
3421+
32733422void
32743423test_header_overflow_error (int req )
32753424{
@@ -3696,6 +3845,18 @@ main (void)
36963845 test_header_content_length_overflow_error ();
36973846 test_chunk_content_length_overflow_error ();
36983847
3848+ //// HEADER FIELD CONDITIONS
3849+ test_double_content_length_error (HTTP_REQUEST );
3850+ test_chunked_content_length_error (HTTP_REQUEST );
3851+ test_header_cr_no_lf_error (HTTP_REQUEST );
3852+ test_invalid_header_field_token_error (HTTP_REQUEST );
3853+ test_invalid_header_field_content_error (HTTP_REQUEST );
3854+ test_double_content_length_error (HTTP_RESPONSE );
3855+ test_chunked_content_length_error (HTTP_RESPONSE );
3856+ test_header_cr_no_lf_error (HTTP_RESPONSE );
3857+ test_invalid_header_field_token_error (HTTP_RESPONSE );
3858+ test_invalid_header_field_content_error (HTTP_RESPONSE );
3859+
36993860 //// RESPONSES
37003861
37013862 for (i = 0 ; i < response_count ; i ++ ) {
0 commit comments