1
- /* Copyright 2009 Ryan Dahl <[email protected] >
1
+ /* Copyright 2009,2010 Ryan Dahl <[email protected] >
2
2
*
3
3
* Some parts of this source file were taken from NGINX
4
4
* (src/http/ngx_http_parser.c) copyright (C) 2002-2009 Igor Sysoev.
@@ -97,6 +97,7 @@ static inline int message_complete_callback (http_parser *parser)
97
97
return parser -> on_message_complete (parser );
98
98
}
99
99
100
+ #define PROXY_CONNECTION "proxy-connection"
100
101
#define CONNECTION "connection"
101
102
#define CONTENT_LENGTH "content-length"
102
103
#define TRANSFER_ENCODING "transfer-encoding"
@@ -218,6 +219,7 @@ enum header_states
218
219
, h_CON
219
220
220
221
, h_matching_connection
222
+ , h_matching_proxy_connection
221
223
, h_matching_content_length
222
224
, h_matching_transfer_encoding
223
225
@@ -245,6 +247,8 @@ enum flags
245
247
#define LF '\n'
246
248
#define LOWER (c ) (unsigned char)(c | 0x20)
247
249
250
+ #define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res)
251
+
248
252
#if HTTP_PARSER_STRICT
249
253
# define STRICT_CHECK (cond ) if (cond) goto error
250
254
# define NEW_MESSAGE () (http_should_keep_alive(parser) ? start_state : s_dead)
@@ -253,8 +257,9 @@ enum flags
253
257
# define NEW_MESSAGE () start_state
254
258
#endif
255
259
256
- static inline
257
- size_t parse (http_parser * parser , const char * data , size_t len , int start_state )
260
+ size_t http_parser_execute (http_parser * parser ,
261
+ const char * data ,
262
+ size_t len )
258
263
{
259
264
char c , ch ;
260
265
const char * p , * pe ;
@@ -950,6 +955,10 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
950
955
header_state = h_C ;
951
956
break ;
952
957
958
+ case 'p' :
959
+ header_state = h_matching_proxy_connection ;
960
+ break ;
961
+
953
962
case 't' :
954
963
header_state = h_matching_transfer_encoding ;
955
964
break ;
@@ -1007,6 +1016,18 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
1007
1016
}
1008
1017
break ;
1009
1018
1019
+ /* proxy-connection */
1020
+
1021
+ case h_matching_proxy_connection :
1022
+ index ++ ;
1023
+ if (index > sizeof (PROXY_CONNECTION )- 1
1024
+ || c != PROXY_CONNECTION [index ]) {
1025
+ header_state = h_general ;
1026
+ } else if (index == sizeof (PROXY_CONNECTION )- 2 ) {
1027
+ header_state = h_connection ;
1028
+ }
1029
+ break ;
1030
+
1010
1031
/* content-length */
1011
1032
1012
1033
case h_matching_content_length :
@@ -1256,7 +1277,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
1256
1277
/* Content-Length header given and non-zero */
1257
1278
state = s_body_identity ;
1258
1279
} else {
1259
- if (start_state == s_start_req || http_should_keep_alive (parser )) {
1280
+ if (parser -> type == HTTP_REQUEST || http_should_keep_alive (parser )) {
1260
1281
/* Assume content-length 0 - read the next */
1261
1282
CALLBACK2 (message_complete );
1262
1283
state = NEW_MESSAGE ();
@@ -1408,22 +1429,6 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
1408
1429
}
1409
1430
1410
1431
1411
- size_t
1412
- http_parse_requests (http_parser * parser , const char * data , size_t len )
1413
- {
1414
- if (!parser -> state ) parser -> state = s_start_req ;
1415
- return parse (parser , data , len , s_start_req );
1416
- }
1417
-
1418
-
1419
- size_t
1420
- http_parse_responses (http_parser * parser , const char * data , size_t len )
1421
- {
1422
- if (!parser -> state ) parser -> state = s_start_res ;
1423
- return parse (parser , data , len , s_start_res );
1424
- }
1425
-
1426
-
1427
1432
int
1428
1433
http_should_keep_alive (http_parser * parser )
1429
1434
{
@@ -1446,9 +1451,10 @@ http_should_keep_alive (http_parser *parser)
1446
1451
1447
1452
1448
1453
void
1449
- http_parser_init (http_parser * parser )
1454
+ http_parser_init (http_parser * parser , enum http_parser_type t )
1450
1455
{
1451
- parser -> state = 0 ;
1456
+ parser -> type = t ;
1457
+ parser -> state = (t == HTTP_REQUEST ? s_start_req : s_start_res );
1452
1458
parser -> on_message_begin = NULL ;
1453
1459
parser -> on_path = NULL ;
1454
1460
parser -> on_query_string = NULL ;
0 commit comments