@@ -2173,6 +2173,20 @@ pause_chunk_complete_cb (http_parser *p)
21732173 return chunk_complete_cb (p );
21742174}
21752175
2176+ int
2177+ connect_headers_complete_cb (http_parser * p )
2178+ {
2179+ headers_complete_cb (p );
2180+ return 1 ;
2181+ }
2182+
2183+ int
2184+ connect_message_complete_cb (http_parser * p )
2185+ {
2186+ messages [num_messages ].should_keep_alive = http_should_keep_alive (parser );
2187+ return message_complete_cb (p );
2188+ }
2189+
21762190static http_parser_settings settings_pause =
21772191 {.on_message_begin = pause_message_begin_cb
21782192 ,.on_header_field = pause_header_field_cb
@@ -2212,6 +2226,19 @@ static http_parser_settings settings_count_body =
22122226 ,.on_chunk_complete = chunk_complete_cb
22132227 };
22142228
2229+ static http_parser_settings settings_connect =
2230+ {.on_message_begin = message_begin_cb
2231+ ,.on_header_field = header_field_cb
2232+ ,.on_header_value = header_value_cb
2233+ ,.on_url = request_url_cb
2234+ ,.on_status = response_status_cb
2235+ ,.on_body = dontcall_body_cb
2236+ ,.on_headers_complete = connect_headers_complete_cb
2237+ ,.on_message_complete = connect_message_complete_cb
2238+ ,.on_chunk_header = chunk_header_cb
2239+ ,.on_chunk_complete = chunk_complete_cb
2240+ };
2241+
22152242static http_parser_settings settings_null =
22162243 {.on_message_begin = 0
22172244 ,.on_header_field = 0
@@ -2275,6 +2302,14 @@ size_t parse_pause (const char *buf, size_t len)
22752302 return nparsed ;
22762303}
22772304
2305+ size_t parse_connect (const char * buf , size_t len )
2306+ {
2307+ size_t nparsed ;
2308+ currently_parsing_eof = (len == 0 );
2309+ nparsed = http_parser_execute (parser , & settings_connect , buf , len );
2310+ return nparsed ;
2311+ }
2312+
22782313static inline int
22792314check_str_eq (const struct message * m ,
22802315 const char * prop ,
@@ -2331,7 +2366,7 @@ do { \
23312366} while(0)
23322367
23332368int
2334- message_eq (int index , const struct message * expected )
2369+ message_eq (int index , int connect , const struct message * expected )
23352370{
23362371 int i ;
23372372 struct message * m = & messages [index ];
@@ -2346,8 +2381,10 @@ message_eq (int index, const struct message *expected)
23462381 MESSAGE_CHECK_STR_EQ (expected , m , response_status );
23472382 }
23482383
2349- MESSAGE_CHECK_NUM_EQ (expected , m , should_keep_alive );
2350- MESSAGE_CHECK_NUM_EQ (expected , m , message_complete_on_eof );
2384+ if (!connect ) {
2385+ MESSAGE_CHECK_NUM_EQ (expected , m , should_keep_alive );
2386+ MESSAGE_CHECK_NUM_EQ (expected , m , message_complete_on_eof );
2387+ }
23512388
23522389 assert (m -> message_begin_cb_called );
23532390 assert (m -> headers_complete_cb_called );
@@ -2385,16 +2422,22 @@ message_eq (int index, const struct message *expected)
23852422 MESSAGE_CHECK_NUM_EQ (expected , m , port );
23862423 }
23872424
2388- if (expected -> body_size ) {
2425+ if (connect ) {
2426+ check_num_eq (m , "body_size" , 0 , m -> body_size );
2427+ } else if (expected -> body_size ) {
23892428 MESSAGE_CHECK_NUM_EQ (expected , m , body_size );
23902429 } else {
23912430 MESSAGE_CHECK_STR_EQ (expected , m , body );
23922431 }
23932432
2394- assert (m -> num_chunks == m -> num_chunks_complete );
2395- MESSAGE_CHECK_NUM_EQ (expected , m , num_chunks_complete );
2396- for (i = 0 ; i < m -> num_chunks && i < MAX_CHUNKS ; i ++ ) {
2397- MESSAGE_CHECK_NUM_EQ (expected , m , chunk_lengths [i ]);
2433+ if (connect ) {
2434+ check_num_eq (m , "num_chunks_complete" , 0 , m -> num_chunks_complete );
2435+ } else {
2436+ assert (m -> num_chunks == m -> num_chunks_complete );
2437+ MESSAGE_CHECK_NUM_EQ (expected , m , num_chunks_complete );
2438+ for (i = 0 ; i < m -> num_chunks && i < MAX_CHUNKS ; i ++ ) {
2439+ MESSAGE_CHECK_NUM_EQ (expected , m , chunk_lengths [i ]);
2440+ }
23982441 }
23992442
24002443 MESSAGE_CHECK_NUM_EQ (expected , m , num_headers );
@@ -3201,7 +3244,7 @@ test_message (const struct message *message)
32013244 abort ();
32023245 }
32033246
3204- if (!message_eq (0 , message )) abort ();
3247+ if (!message_eq (0 , 0 , message )) abort ();
32053248
32063249 parser_free ();
32073250 }
@@ -3238,7 +3281,7 @@ test_message_count_body (const struct message *message)
32383281 abort ();
32393282 }
32403283
3241- if (!message_eq (0 , message )) abort ();
3284+ if (!message_eq (0 , 0 , message )) abort ();
32423285
32433286 parser_free ();
32443287}
@@ -3589,9 +3632,9 @@ test_multiple3 (const struct message *r1, const struct message *r2, const struct
35893632 abort ();
35903633 }
35913634
3592- if (!message_eq (0 , r1 )) abort ();
3593- if (message_count > 1 && !message_eq (1 , r2 )) abort ();
3594- if (message_count > 2 && !message_eq (2 , r3 )) abort ();
3635+ if (!message_eq (0 , 0 , r1 )) abort ();
3636+ if (message_count > 1 && !message_eq (1 , 0 , r2 )) abort ();
3637+ if (message_count > 2 && !message_eq (2 , 0 , r3 )) abort ();
35953638
35963639 parser_free ();
35973640}
@@ -3687,17 +3730,17 @@ test_scan (const struct message *r1, const struct message *r2, const struct mess
36873730 goto error ;
36883731 }
36893732
3690- if (!message_eq (0 , r1 )) {
3733+ if (!message_eq (0 , 0 , r1 )) {
36913734 fprintf (stderr , "\n\nError matching messages[0] in test_scan.\n" );
36923735 goto error ;
36933736 }
36943737
3695- if (message_count > 1 && !message_eq (1 , r2 )) {
3738+ if (message_count > 1 && !message_eq (1 , 0 , r2 )) {
36963739 fprintf (stderr , "\n\nError matching messages[1] in test_scan.\n" );
36973740 goto error ;
36983741 }
36993742
3700- if (message_count > 2 && !message_eq (2 , r3 )) {
3743+ if (message_count > 2 && !message_eq (2 , 0 , r3 )) {
37013744 fprintf (stderr , "\n\nError matching messages[2] in test_scan.\n" );
37023745 goto error ;
37033746 }
@@ -3796,7 +3839,29 @@ test_message_pause (const struct message *msg)
37963839 abort ();
37973840 }
37983841
3799- if (!message_eq (0 , msg )) abort ();
3842+ if (!message_eq (0 , 0 , msg )) abort ();
3843+
3844+ parser_free ();
3845+ }
3846+
3847+ /* Verify that body and next message won't be parsed in responses to CONNECT */
3848+ void
3849+ test_message_connect (const struct message * msg )
3850+ {
3851+ char * buf = (char * ) msg -> raw ;
3852+ size_t buflen = strlen (msg -> raw );
3853+ size_t nread ;
3854+
3855+ parser_init (msg -> type );
3856+
3857+ nread = parse_connect (buf , buflen );
3858+
3859+ if (num_messages != 1 ) {
3860+ printf ("\n*** num_messages != 1 after testing '%s' ***\n\n" , msg -> name );
3861+ abort ();
3862+ }
3863+
3864+ if (!message_eq (0 , 1 , msg )) abort ();
38003865
38013866 parser_free ();
38023867}
@@ -3867,6 +3932,10 @@ main (void)
38673932 test_message_pause (& responses [i ]);
38683933 }
38693934
3935+ for (i = 0 ; i < response_count ; i ++ ) {
3936+ test_message_connect (& responses [i ]);
3937+ }
3938+
38703939 for (i = 0 ; i < response_count ; i ++ ) {
38713940 if (!responses [i ].should_keep_alive ) continue ;
38723941 for (j = 0 ; j < response_count ; j ++ ) {
0 commit comments