1 #line 1 "src/parser.rl"
3 * Copyright (c) 2005 Zed A. Shaw
4 * You can redistribute it and/or modify it under the same terms as Ruby.
13 #define LEN(AT, FPC) (FPC - buffer - parser->AT)
14 #define MARK(M,FPC) (parser->M = (FPC) - buffer)
15 #define PTR_TO(F) (buffer + parser->F)
18 #line 122 "src/parser.rl"
23 #line 24 "src/parser.c"
24 static const int http_parser_start
= 1;
25 static const int http_parser_first_final
= 69;
26 static const int http_parser_error
= 0;
28 static const int http_parser_en_main
= 1;
30 #line 126 "src/parser.rl"
32 int http_parser_init(http_parser
*parser
) {
35 #line 36 "src/parser.c"
37 cs
= http_parser_start
;
39 #line 130 "src/parser.rl"
41 parser
->body_start
= 0;
42 parser
->content_len
= 0;
45 parser
->field_len
= 0;
46 parser
->field_start
= 0;
53 size_t http_parser_execute(http_parser
*parser
, const char *buffer
, size_t len
, size_t off
) {
57 assert(off
<= len
&& "offset past end of buffer");
62 assert(*pe
== '\0' && "pointer does not end on NUL");
63 assert(pe
- p
== len
- off
&& "pointers aren't same distance");
67 #line 68 "src/parser.c"
79 if ( 45 <= (*p
) && (*p
) <= 46 )
81 } else if ( (*p
) > 57 ) {
82 if ( 65 <= (*p
) && (*p
) <= 90 )
90 #line 20 "src/parser.rl"
97 #line 98 "src/parser.c"
104 if ( 45 <= (*p
) && (*p
) <= 46 )
106 } else if ( (*p
) > 57 ) {
107 if ( 65 <= (*p
) && (*p
) <= 90 )
113 #line 41 "src/parser.rl"
115 if(parser
->request_method
!= NULL
)
116 parser
->request_method(parser
->data
, PTR_TO(mark
), LEN(mark
, p
));
123 #line 124 "src/parser.c"
131 if ( 45 <= (*p
) && (*p
) <= 57 )
133 } else if ( (*p
) > 90 ) {
134 if ( 97 <= (*p
) && (*p
) <= 122 )
140 #line 20 "src/parser.rl"
147 #line 148 "src/parser.c"
152 #line 45 "src/parser.rl"
154 if(parser
->request_uri
!= NULL
)
155 parser
->request_uri(parser
->data
, PTR_TO(mark
), LEN(mark
, p
));
159 #line 61 "src/parser.rl"
161 if(parser
->request_path
!= NULL
)
162 parser
->request_path(parser
->data
, PTR_TO(mark
), LEN(mark
,p
));
164 #line 45 "src/parser.rl"
166 if(parser
->request_uri
!= NULL
)
167 parser
->request_uri(parser
->data
, PTR_TO(mark
), LEN(mark
, p
));
171 #line 50 "src/parser.rl"
172 {MARK(query_start
, p
); }
173 #line 51 "src/parser.rl"
175 if(parser
->query_string
!= NULL
)
176 parser
->query_string(parser
->data
, PTR_TO(query_start
), LEN(query_start
, p
));
178 #line 45 "src/parser.rl"
180 if(parser
->request_uri
!= NULL
)
181 parser
->request_uri(parser
->data
, PTR_TO(mark
), LEN(mark
, p
));
185 #line 51 "src/parser.rl"
187 if(parser
->query_string
!= NULL
)
188 parser
->query_string(parser
->data
, PTR_TO(query_start
), LEN(query_start
, p
));
190 #line 45 "src/parser.rl"
192 if(parser
->request_uri
!= NULL
)
193 parser
->request_uri(parser
->data
, PTR_TO(mark
), LEN(mark
, p
));
200 #line 201 "src/parser.c"
205 #line 20 "src/parser.rl"
212 #line 213 "src/parser.c"
241 if ( 48 <= (*p
) && (*p
) <= 57 )
250 if ( 48 <= (*p
) && (*p
) <= 57 )
257 if ( 48 <= (*p
) && (*p
) <= 57 )
266 if ( 48 <= (*p
) && (*p
) <= 57 )
270 #line 56 "src/parser.rl"
272 if(parser
->http_version
!= NULL
)
273 parser
->http_version(parser
->data
, PTR_TO(mark
), LEN(mark
, p
));
277 #line 29 "src/parser.rl"
279 if(parser
->http_field
!= NULL
) {
280 parser
->http_field(parser
->data
, PTR_TO(field_start
), parser
->field_len
, PTR_TO(mark
), LEN(mark
, p
));
285 #line 29 "src/parser.rl"
287 if(parser
->http_field
!= NULL
) {
288 parser
->http_field(parser
->data
, PTR_TO(field_start
), parser
->field_len
, PTR_TO(mark
), LEN(mark
, p
));
291 #line 35 "src/parser.rl"
293 if(parser
->content_length
!= NULL
) {
294 parser
->content_length(parser
->data
, PTR_TO(mark
), LEN(mark
, p
));
302 #line 303 "src/parser.c"
320 if ( 42 <= (*p
) && (*p
) <= 43 )
322 } else if ( (*p
) >= 35 )
324 } else if ( (*p
) > 46 ) {
326 if ( 48 <= (*p
) && (*p
) <= 57 )
328 } else if ( (*p
) > 90 ) {
329 if ( 94 <= (*p
) && (*p
) <= 122 )
344 #line 66 "src/parser.rl"
346 parser
->body_start
= p
- buffer
+ 1;
347 if(parser
->header_done
!= NULL
)
348 parser
->header_done(parser
->data
, p
+ 1, pe
- p
- 1);
356 #line 357 "src/parser.c"
359 #line 23 "src/parser.rl"
360 { MARK(field_start
, p
); }
366 #line 367 "src/parser.c"
375 if ( 42 <= (*p
) && (*p
) <= 43 )
377 } else if ( (*p
) >= 35 )
379 } else if ( (*p
) > 46 ) {
381 if ( 48 <= (*p
) && (*p
) <= 57 )
383 } else if ( (*p
) > 90 ) {
384 if ( 94 <= (*p
) && (*p
) <= 122 )
392 #line 24 "src/parser.rl"
394 parser
->field_len
= LEN(field_start
, p
);
398 #line 28 "src/parser.rl"
405 #line 406 "src/parser.c"
412 #line 28 "src/parser.rl"
419 #line 420 "src/parser.c"
424 #line 23 "src/parser.rl"
425 { MARK(field_start
, p
); }
431 #line 432 "src/parser.c"
442 if ( 42 <= (*p
) && (*p
) <= 43 )
444 } else if ( (*p
) >= 35 )
446 } else if ( (*p
) > 46 ) {
448 if ( 48 <= (*p
) && (*p
) <= 57 )
450 } else if ( (*p
) > 90 ) {
451 if ( 94 <= (*p
) && (*p
) <= 122 )
472 if ( 42 <= (*p
) && (*p
) <= 43 )
474 } else if ( (*p
) >= 35 )
476 } else if ( (*p
) > 46 ) {
478 if ( 48 <= (*p
) && (*p
) <= 57 )
480 } else if ( (*p
) > 90 ) {
481 if ( 94 <= (*p
) && (*p
) <= 122 )
502 if ( 42 <= (*p
) && (*p
) <= 43 )
504 } else if ( (*p
) >= 35 )
506 } else if ( (*p
) > 46 ) {
508 if ( 48 <= (*p
) && (*p
) <= 57 )
510 } else if ( (*p
) > 90 ) {
511 if ( 94 <= (*p
) && (*p
) <= 122 )
532 if ( 42 <= (*p
) && (*p
) <= 43 )
534 } else if ( (*p
) >= 35 )
536 } else if ( (*p
) > 46 ) {
538 if ( 48 <= (*p
) && (*p
) <= 57 )
540 } else if ( (*p
) > 90 ) {
541 if ( 94 <= (*p
) && (*p
) <= 122 )
562 if ( 42 <= (*p
) && (*p
) <= 43 )
564 } else if ( (*p
) >= 35 )
566 } else if ( (*p
) > 46 ) {
568 if ( 48 <= (*p
) && (*p
) <= 57 )
570 } else if ( (*p
) > 90 ) {
571 if ( 94 <= (*p
) && (*p
) <= 122 )
592 if ( 42 <= (*p
) && (*p
) <= 43 )
594 } else if ( (*p
) >= 35 )
596 } else if ( (*p
) > 46 ) {
598 if ( 48 <= (*p
) && (*p
) <= 57 )
600 } else if ( (*p
) > 90 ) {
601 if ( 94 <= (*p
) && (*p
) <= 122 )
622 if ( 42 <= (*p
) && (*p
) <= 43 )
624 } else if ( (*p
) >= 35 )
626 } else if ( (*p
) > 57 ) {
628 if ( 94 <= (*p
) && (*p
) <= 122 )
630 } else if ( (*p
) >= 65 )
649 if ( 42 <= (*p
) && (*p
) <= 43 )
651 } else if ( (*p
) >= 35 )
653 } else if ( (*p
) > 46 ) {
655 if ( 48 <= (*p
) && (*p
) <= 57 )
657 } else if ( (*p
) > 90 ) {
658 if ( 94 <= (*p
) && (*p
) <= 122 )
679 if ( 42 <= (*p
) && (*p
) <= 43 )
681 } else if ( (*p
) >= 35 )
683 } else if ( (*p
) > 46 ) {
685 if ( 48 <= (*p
) && (*p
) <= 57 )
687 } else if ( (*p
) > 90 ) {
688 if ( 94 <= (*p
) && (*p
) <= 122 )
709 if ( 42 <= (*p
) && (*p
) <= 43 )
711 } else if ( (*p
) >= 35 )
713 } else if ( (*p
) > 46 ) {
715 if ( 48 <= (*p
) && (*p
) <= 57 )
717 } else if ( (*p
) > 90 ) {
718 if ( 94 <= (*p
) && (*p
) <= 122 )
739 if ( 42 <= (*p
) && (*p
) <= 43 )
741 } else if ( (*p
) >= 35 )
743 } else if ( (*p
) > 46 ) {
745 if ( 48 <= (*p
) && (*p
) <= 57 )
747 } else if ( (*p
) > 90 ) {
748 if ( 94 <= (*p
) && (*p
) <= 122 )
769 if ( 42 <= (*p
) && (*p
) <= 43 )
771 } else if ( (*p
) >= 35 )
773 } else if ( (*p
) > 46 ) {
775 if ( 48 <= (*p
) && (*p
) <= 57 )
777 } else if ( (*p
) > 90 ) {
778 if ( 94 <= (*p
) && (*p
) <= 122 )
799 if ( 42 <= (*p
) && (*p
) <= 43 )
801 } else if ( (*p
) >= 35 )
803 } else if ( (*p
) > 46 ) {
805 if ( 48 <= (*p
) && (*p
) <= 57 )
807 } else if ( (*p
) > 90 ) {
808 if ( 94 <= (*p
) && (*p
) <= 122 )
827 if ( 42 <= (*p
) && (*p
) <= 43 )
829 } else if ( (*p
) >= 35 )
831 } else if ( (*p
) > 46 ) {
833 if ( 48 <= (*p
) && (*p
) <= 57 )
835 } else if ( (*p
) > 90 ) {
836 if ( 94 <= (*p
) && (*p
) <= 122 )
844 #line 24 "src/parser.rl"
846 parser
->field_len
= LEN(field_start
, p
);
850 #line 20 "src/parser.rl"
852 #line 28 "src/parser.rl"
859 #line 860 "src/parser.c"
866 #line 20 "src/parser.rl"
868 #line 28 "src/parser.rl"
875 #line 876 "src/parser.c"
880 #line 20 "src/parser.rl"
887 #line 888 "src/parser.c"
893 if ( 45 <= (*p
) && (*p
) <= 46 )
895 } else if ( (*p
) > 57 ) {
897 if ( 97 <= (*p
) && (*p
) <= 122 )
899 } else if ( (*p
) >= 65 )
905 #line 20 "src/parser.rl"
912 #line 913 "src/parser.c"
921 if ( 34 <= (*p
) && (*p
) <= 35 )
923 } else if ( (*p
) >= 0 )
931 if ( 48 <= (*p
) && (*p
) <= 57 )
933 } else if ( (*p
) > 70 ) {
934 if ( 97 <= (*p
) && (*p
) <= 102 )
944 if ( 48 <= (*p
) && (*p
) <= 57 )
946 } else if ( (*p
) > 70 ) {
947 if ( 97 <= (*p
) && (*p
) <= 102 )
953 #line 20 "src/parser.rl"
960 #line 961 "src/parser.c"
971 if ( 34 <= (*p
) && (*p
) <= 35 )
973 } else if ( (*p
) >= 0 )
981 if ( 48 <= (*p
) && (*p
) <= 57 )
983 } else if ( (*p
) > 70 ) {
984 if ( 97 <= (*p
) && (*p
) <= 102 )
994 if ( 48 <= (*p
) && (*p
) <= 57 )
996 } else if ( (*p
) > 70 ) {
997 if ( 97 <= (*p
) && (*p
) <= 102 )
1003 #line 61 "src/parser.rl"
1005 if(parser
->request_path
!= NULL
)
1006 parser
->request_path(parser
->data
, PTR_TO(mark
), LEN(mark
,p
));
1013 #line 1014 "src/parser.c"
1023 if ( 34 <= (*p
) && (*p
) <= 35 )
1025 } else if ( (*p
) >= 0 )
1033 if ( 48 <= (*p
) && (*p
) <= 57 )
1035 } else if ( (*p
) > 70 ) {
1036 if ( 97 <= (*p
) && (*p
) <= 102 )
1046 if ( 48 <= (*p
) && (*p
) <= 57 )
1048 } else if ( (*p
) > 70 ) {
1049 if ( 97 <= (*p
) && (*p
) <= 102 )
1055 #line 61 "src/parser.rl"
1057 if(parser
->request_path
!= NULL
)
1058 parser
->request_path(parser
->data
, PTR_TO(mark
), LEN(mark
,p
));
1065 #line 1066 "src/parser.c"
1074 if ( 34 <= (*p
) && (*p
) <= 35 )
1076 } else if ( (*p
) >= 0 )
1080 #line 50 "src/parser.rl"
1081 {MARK(query_start
, p
); }
1087 #line 1088 "src/parser.c"
1096 if ( 34 <= (*p
) && (*p
) <= 35 )
1098 } else if ( (*p
) >= 0 )
1102 #line 50 "src/parser.rl"
1103 {MARK(query_start
, p
); }
1109 #line 1110 "src/parser.c"
1111 if ( 48 <= (*p
) && (*p
) <= 57 )
1113 } else if ( (*p
) > 70 ) {
1114 if ( 97 <= (*p
) && (*p
) <= 102 )
1124 if ( 48 <= (*p
) && (*p
) <= 57 )
1126 } else if ( (*p
) > 70 ) {
1127 if ( 97 <= (*p
) && (*p
) <= 102 )
1142 if ( 45 <= (*p
) && (*p
) <= 46 )
1144 } else if ( (*p
) > 57 ) {
1145 if ( 65 <= (*p
) && (*p
) <= 90 )
1160 if ( 45 <= (*p
) && (*p
) <= 46 )
1162 } else if ( (*p
) > 57 ) {
1163 if ( 65 <= (*p
) && (*p
) <= 90 )
1178 if ( 45 <= (*p
) && (*p
) <= 46 )
1180 } else if ( (*p
) > 57 ) {
1181 if ( 65 <= (*p
) && (*p
) <= 90 )
1196 if ( 45 <= (*p
) && (*p
) <= 46 )
1198 } else if ( (*p
) > 57 ) {
1199 if ( 65 <= (*p
) && (*p
) <= 90 )
1214 if ( 45 <= (*p
) && (*p
) <= 46 )
1216 } else if ( (*p
) > 57 ) {
1217 if ( 65 <= (*p
) && (*p
) <= 90 )
1232 if ( 45 <= (*p
) && (*p
) <= 46 )
1234 } else if ( (*p
) > 57 ) {
1235 if ( 65 <= (*p
) && (*p
) <= 90 )
1250 if ( 45 <= (*p
) && (*p
) <= 46 )
1252 } else if ( (*p
) > 57 ) {
1253 if ( 65 <= (*p
) && (*p
) <= 90 )
1268 if ( 45 <= (*p
) && (*p
) <= 46 )
1270 } else if ( (*p
) > 57 ) {
1271 if ( 65 <= (*p
) && (*p
) <= 90 )
1286 if ( 45 <= (*p
) && (*p
) <= 46 )
1288 } else if ( (*p
) > 57 ) {
1289 if ( 65 <= (*p
) && (*p
) <= 90 )
1304 if ( 45 <= (*p
) && (*p
) <= 46 )
1306 } else if ( (*p
) > 57 ) {
1307 if ( 65 <= (*p
) && (*p
) <= 90 )
1322 if ( 45 <= (*p
) && (*p
) <= 46 )
1324 } else if ( (*p
) > 57 ) {
1325 if ( 65 <= (*p
) && (*p
) <= 90 )
1340 if ( 45 <= (*p
) && (*p
) <= 46 )
1342 } else if ( (*p
) > 57 ) {
1343 if ( 65 <= (*p
) && (*p
) <= 90 )
1358 if ( 45 <= (*p
) && (*p
) <= 46 )
1360 } else if ( (*p
) > 57 ) {
1361 if ( 65 <= (*p
) && (*p
) <= 90 )
1376 if ( 45 <= (*p
) && (*p
) <= 46 )
1378 } else if ( (*p
) > 57 ) {
1379 if ( 65 <= (*p
) && (*p
) <= 90 )
1394 if ( 45 <= (*p
) && (*p
) <= 46 )
1396 } else if ( (*p
) > 57 ) {
1397 if ( 65 <= (*p
) && (*p
) <= 90 )
1412 if ( 45 <= (*p
) && (*p
) <= 46 )
1414 } else if ( (*p
) > 57 ) {
1415 if ( 65 <= (*p
) && (*p
) <= 90 )
1430 if ( 45 <= (*p
) && (*p
) <= 46 )
1432 } else if ( (*p
) > 57 ) {
1433 if ( 65 <= (*p
) && (*p
) <= 90 )
1448 if ( 45 <= (*p
) && (*p
) <= 46 )
1450 } else if ( (*p
) > 57 ) {
1451 if ( 65 <= (*p
) && (*p
) <= 90 )
1464 _out0
: cs
= 0; goto _out
;
1465 _out2
: cs
= 2; goto _out
;
1466 _out3
: cs
= 3; goto _out
;
1467 _out4
: cs
= 4; goto _out
;
1468 _out5
: cs
= 5; goto _out
;
1469 _out6
: cs
= 6; goto _out
;
1470 _out7
: cs
= 7; goto _out
;
1471 _out8
: cs
= 8; goto _out
;
1472 _out9
: cs
= 9; goto _out
;
1473 _out10
: cs
= 10; goto _out
;
1474 _out11
: cs
= 11; goto _out
;
1475 _out12
: cs
= 12; goto _out
;
1476 _out13
: cs
= 13; goto _out
;
1477 _out14
: cs
= 14; goto _out
;
1478 _out15
: cs
= 15; goto _out
;
1479 _out16
: cs
= 16; goto _out
;
1480 _out69
: cs
= 69; goto _out
;
1481 _out17
: cs
= 17; goto _out
;
1482 _out18
: cs
= 18; goto _out
;
1483 _out19
: cs
= 19; goto _out
;
1484 _out20
: cs
= 20; goto _out
;
1485 _out21
: cs
= 21; goto _out
;
1486 _out22
: cs
= 22; goto _out
;
1487 _out23
: cs
= 23; goto _out
;
1488 _out24
: cs
= 24; goto _out
;
1489 _out25
: cs
= 25; goto _out
;
1490 _out26
: cs
= 26; goto _out
;
1491 _out27
: cs
= 27; goto _out
;
1492 _out28
: cs
= 28; goto _out
;
1493 _out29
: cs
= 29; goto _out
;
1494 _out30
: cs
= 30; goto _out
;
1495 _out31
: cs
= 31; goto _out
;
1496 _out32
: cs
= 32; goto _out
;
1497 _out33
: cs
= 33; goto _out
;
1498 _out34
: cs
= 34; goto _out
;
1499 _out35
: cs
= 35; goto _out
;
1500 _out36
: cs
= 36; goto _out
;
1501 _out37
: cs
= 37; goto _out
;
1502 _out38
: cs
= 38; goto _out
;
1503 _out39
: cs
= 39; goto _out
;
1504 _out40
: cs
= 40; goto _out
;
1505 _out41
: cs
= 41; goto _out
;
1506 _out42
: cs
= 42; goto _out
;
1507 _out43
: cs
= 43; goto _out
;
1508 _out44
: cs
= 44; goto _out
;
1509 _out45
: cs
= 45; goto _out
;
1510 _out46
: cs
= 46; goto _out
;
1511 _out47
: cs
= 47; goto _out
;
1512 _out48
: cs
= 48; goto _out
;
1513 _out49
: cs
= 49; goto _out
;
1514 _out50
: cs
= 50; goto _out
;
1515 _out51
: cs
= 51; goto _out
;
1516 _out52
: cs
= 52; goto _out
;
1517 _out53
: cs
= 53; goto _out
;
1518 _out54
: cs
= 54; goto _out
;
1519 _out55
: cs
= 55; goto _out
;
1520 _out56
: cs
= 56; goto _out
;
1521 _out57
: cs
= 57; goto _out
;
1522 _out58
: cs
= 58; goto _out
;
1523 _out59
: cs
= 59; goto _out
;
1524 _out60
: cs
= 60; goto _out
;
1525 _out61
: cs
= 61; goto _out
;
1526 _out62
: cs
= 62; goto _out
;
1527 _out63
: cs
= 63; goto _out
;
1528 _out64
: cs
= 64; goto _out
;
1529 _out65
: cs
= 65; goto _out
;
1530 _out66
: cs
= 66; goto _out
;
1531 _out67
: cs
= 67; goto _out
;
1532 _out68
: cs
= 68; goto _out
;
1536 #line 157 "src/parser.rl"
1539 parser
->nread
+= p
- (buffer
+ off
);
1541 assert(p
<= pe
&& "buffer overflow after parsing execute");
1542 assert(parser
->nread
<= len
&& "nread longer than length");
1543 assert(parser
->body_start
<= len
&& "body starts after buffer end");
1544 assert(parser
->mark
< len
&& "mark is after buffer end");
1545 assert(parser
->field_len
<= len
&& "field has length longer than whole buffer");
1546 assert(parser
->field_start
< len
&& "field starts after buffer end");
1548 if(parser
->body_start
) {
1549 /* final \r\n combo encountered so stop right here */
1551 #line 1552 "src/parser.c"
1552 #line 171 "src/parser.rl"
1556 return(parser
->nread
);
1559 int http_parser_finish(http_parser
*parser
)
1561 int cs
= parser
->cs
;
1564 #line 1565 "src/parser.c"
1565 #line 182 "src/parser.rl"
1569 if (http_parser_has_error(parser
) ) {
1571 } else if (http_parser_is_finished(parser
) ) {
1578 int http_parser_has_error(http_parser
*parser
) {
1579 return parser
->cs
== http_parser_error
;
1582 int http_parser_is_finished(http_parser
*parser
) {
1583 return parser
->cs
== http_parser_first_final
;