@@ -3270,6 +3270,155 @@ test_simple (const char *buf, enum http_errno err_expected)
3270
3270
}
3271
3271
}
3272
3272
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
+
3273
3422
void
3274
3423
test_header_overflow_error (int req )
3275
3424
{
@@ -3696,6 +3845,18 @@ main (void)
3696
3845
test_header_content_length_overflow_error ();
3697
3846
test_chunk_content_length_overflow_error ();
3698
3847
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
+
3699
3860
//// RESPONSES
3700
3861
3701
3862
for (i = 0 ; i < response_count ; i ++ ) {
0 commit comments