@@ -3165,6 +3165,155 @@ test_simple (const char *buf, enum http_errno err_expected)
31653165 }
31663166}
31673167
3168+ void
3169+ test_invalid_header_content (int req , const char * str )
3170+ {
3171+ http_parser parser ;
3172+ http_parser_init (& parser , req ? HTTP_REQUEST : HTTP_RESPONSE );
3173+ size_t parsed ;
3174+ const char * buf ;
3175+ buf = req ?
3176+ "GET / HTTP/1.1\r\n" :
3177+ "HTTP/1.1 200 OK\r\n" ;
3178+ parsed = http_parser_execute (& parser , & settings_null , buf , strlen (buf ));
3179+ assert (parsed == strlen (buf ));
3180+
3181+ buf = str ;
3182+ size_t buflen = strlen (buf );
3183+
3184+ parsed = http_parser_execute (& parser , & settings_null , buf , buflen );
3185+ if (parsed != buflen ) {
3186+ assert (HTTP_PARSER_ERRNO (& parser ) == HPE_INVALID_HEADER_TOKEN );
3187+ return ;
3188+ }
3189+
3190+ fprintf (stderr ,
3191+ "\n*** Error expected but none in invalid header content test ***\n" );
3192+ abort ();
3193+ }
3194+
3195+ void
3196+ test_invalid_header_field_content_error (int req )
3197+ {
3198+ test_invalid_header_content (req , "Foo: F\01ailure" );
3199+ test_invalid_header_content (req , "Foo: B\02ar" );
3200+ }
3201+
3202+ void
3203+ test_invalid_header_field (int req , const char * str )
3204+ {
3205+ http_parser parser ;
3206+ http_parser_init (& parser , req ? HTTP_REQUEST : HTTP_RESPONSE );
3207+ size_t parsed ;
3208+ const char * buf ;
3209+ buf = req ?
3210+ "GET / HTTP/1.1\r\n" :
3211+ "HTTP/1.1 200 OK\r\n" ;
3212+ parsed = http_parser_execute (& parser , & settings_null , buf , strlen (buf ));
3213+ assert (parsed == strlen (buf ));
3214+
3215+ buf = str ;
3216+ size_t buflen = strlen (buf );
3217+
3218+ parsed = http_parser_execute (& parser , & settings_null , buf , buflen );
3219+ if (parsed != buflen ) {
3220+ assert (HTTP_PARSER_ERRNO (& parser ) == HPE_INVALID_HEADER_TOKEN );
3221+ return ;
3222+ }
3223+
3224+ fprintf (stderr ,
3225+ "\n*** Error expected but none in invalid header token test ***\n" );
3226+ abort ();
3227+ }
3228+
3229+ void
3230+ test_invalid_header_field_token_error (int req )
3231+ {
3232+ test_invalid_header_field (req , "Fo@: Failure" );
3233+ test_invalid_header_field (req , "Foo\01\test: Bar" );
3234+ }
3235+
3236+ void
3237+ test_double_content_length_error (int req )
3238+ {
3239+ http_parser parser ;
3240+ http_parser_init (& parser , req ? HTTP_REQUEST : HTTP_RESPONSE );
3241+ size_t parsed ;
3242+ const char * buf ;
3243+ buf = req ?
3244+ "GET / HTTP/1.1\r\n" :
3245+ "HTTP/1.1 200 OK\r\n" ;
3246+ parsed = http_parser_execute (& parser , & settings_null , buf , strlen (buf ));
3247+ assert (parsed == strlen (buf ));
3248+
3249+ buf = "Content-Length: 0\r\nContent-Length: 1\r\n\r\n" ;
3250+ size_t buflen = strlen (buf );
3251+
3252+ parsed = http_parser_execute (& parser , & settings_null , buf , buflen );
3253+ if (parsed != buflen ) {
3254+ assert (HTTP_PARSER_ERRNO (& parser ) == HPE_MULTIPLE_CONTENT_LENGTH );
3255+ return ;
3256+ }
3257+
3258+ fprintf (stderr ,
3259+ "\n*** Error expected but none in double content-length test ***\n" );
3260+ abort ();
3261+ }
3262+
3263+ void
3264+ test_chunked_content_length_error (int req )
3265+ {
3266+ http_parser parser ;
3267+ http_parser_init (& parser , req ? HTTP_REQUEST : HTTP_RESPONSE );
3268+ size_t parsed ;
3269+ const char * buf ;
3270+ buf = req ?
3271+ "GET / HTTP/1.1\r\n" :
3272+ "HTTP/1.1 200 OK\r\n" ;
3273+ parsed = http_parser_execute (& parser , & settings_null , buf , strlen (buf ));
3274+ assert (parsed == strlen (buf ));
3275+
3276+ buf = "Transfer-Encoding: chunked\r\nContent-Length: 1\r\n\r\n" ;
3277+ size_t buflen = strlen (buf );
3278+
3279+ parsed = http_parser_execute (& parser , & settings_null , buf , buflen );
3280+ if (parsed != buflen ) {
3281+ assert (HTTP_PARSER_ERRNO (& parser ) == HPE_CHUNKED_WITH_CONTENT_LENGTH );
3282+ return ;
3283+ }
3284+
3285+ fprintf (stderr ,
3286+ "\n*** Error expected but none in chunked content-length test ***\n" );
3287+ abort ();
3288+ }
3289+
3290+ void
3291+ test_header_cr_no_lf_error (int req )
3292+ {
3293+ http_parser parser ;
3294+ http_parser_init (& parser , req ? HTTP_REQUEST : HTTP_RESPONSE );
3295+ size_t parsed ;
3296+ const char * buf ;
3297+ buf = req ?
3298+ "GET / HTTP/1.1\r\n" :
3299+ "HTTP/1.1 200 OK\r\n" ;
3300+ parsed = http_parser_execute (& parser , & settings_null , buf , strlen (buf ));
3301+ assert (parsed == strlen (buf ));
3302+
3303+ buf = "Foo: 1\rBar: 1\r\n\r\n" ;
3304+ size_t buflen = strlen (buf );
3305+
3306+ parsed = http_parser_execute (& parser , & settings_null , buf , buflen );
3307+ if (parsed != buflen ) {
3308+ assert (HTTP_PARSER_ERRNO (& parser ) == HPE_LF_EXPECTED );
3309+ return ;
3310+ }
3311+
3312+ fprintf (stderr ,
3313+ "\n*** Error expected but none in header whitespace test ***\n" );
3314+ abort ();
3315+ }
3316+
31683317void
31693318test_header_overflow_error (int req )
31703319{
@@ -3591,6 +3740,18 @@ main (void)
35913740 test_header_content_length_overflow_error ();
35923741 test_chunk_content_length_overflow_error ();
35933742
3743+ //// HEADER FIELD CONDITIONS
3744+ test_double_content_length_error (HTTP_REQUEST );
3745+ test_chunked_content_length_error (HTTP_REQUEST );
3746+ test_header_cr_no_lf_error (HTTP_REQUEST );
3747+ test_invalid_header_field_token_error (HTTP_REQUEST );
3748+ test_invalid_header_field_content_error (HTTP_REQUEST );
3749+ test_double_content_length_error (HTTP_RESPONSE );
3750+ test_chunked_content_length_error (HTTP_RESPONSE );
3751+ test_header_cr_no_lf_error (HTTP_RESPONSE );
3752+ test_invalid_header_field_token_error (HTTP_RESPONSE );
3753+ test_invalid_header_field_content_error (HTTP_RESPONSE );
3754+
35943755 //// RESPONSES
35953756
35963757 for (i = 0 ; i < response_count ; i ++ ) {
0 commit comments