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)
25 static const int http_parser_start
= 1;
26 static const int http_parser_first_final
= 57;
27 static const int http_parser_error
= 0;
29 static const int http_parser_en_main
= 1;
33 int http_parser_init(http_parser
*parser
) {
38 cs
= http_parser_start
;
42 parser
->body_start
= 0;
43 parser
->content_len
= 0;
46 parser
->field_len
= 0;
47 parser
->field_start
= 0;
54 size_t http_parser_execute(http_parser
*parser
, const char *buffer
, size_t len
, size_t off
) {
58 assert(off
<= len
&& "offset past end of buffer");
63 assert(*pe
== '\0' && "pointer does not end on NUL");
64 assert(pe
- p
== len
- off
&& "pointers aren't same distance");
80 if ( 45 <= (*p
) && (*p
) <= 46 )
82 } else if ( (*p
) > 57 ) {
83 if ( 65 <= (*p
) && (*p
) <= 90 )
105 if ( 45 <= (*p
) && (*p
) <= 46 )
107 } else if ( (*p
) > 57 ) {
108 if ( 65 <= (*p
) && (*p
) <= 90 )
116 parser
->request_method(parser
->data
, PTR_TO(mark
), LEN(mark
, p
));
131 if ( 45 <= (*p
) && (*p
) <= 57 )
133 } else if ( (*p
) > 90 ) {
134 if ( 97 <= (*p
) && (*p
) <= 122 )
156 parser
->request_uri(parser
->data
, PTR_TO(mark
), LEN(mark
, p
));
162 parser
->fragment(parser
->data
, PTR_TO(mark
), LEN(mark
, p
));
168 parser
->request_path(parser
->data
, PTR_TO(mark
), LEN(mark
,p
));
172 parser
->request_uri(parser
->data
, PTR_TO(mark
), LEN(mark
, p
));
177 {MARK(query_start
, p
); }
180 parser
->query_string(parser
->data
, PTR_TO(query_start
), LEN(query_start
, p
));
184 parser
->request_uri(parser
->data
, PTR_TO(mark
), LEN(mark
, p
));
190 parser
->query_string(parser
->data
, PTR_TO(query_start
), LEN(query_start
, p
));
194 parser
->request_uri(parser
->data
, PTR_TO(mark
), LEN(mark
, p
));
242 if ( 48 <= (*p
) && (*p
) <= 57 )
251 if ( 48 <= (*p
) && (*p
) <= 57 )
258 if ( 48 <= (*p
) && (*p
) <= 57 )
267 if ( 48 <= (*p
) && (*p
) <= 57 )
273 parser
->http_version(parser
->data
, PTR_TO(mark
), LEN(mark
, p
));
279 parser
->http_field(parser
->data
, PTR_TO(field_start
), parser
->field_len
, PTR_TO(mark
), LEN(mark
, p
));
302 if ( 42 <= (*p
) && (*p
) <= 43 )
304 } else if ( (*p
) >= 35 )
306 } else if ( (*p
) > 46 ) {
308 if ( 48 <= (*p
) && (*p
) <= 57 )
310 } else if ( (*p
) > 90 ) {
311 if ( 94 <= (*p
) && (*p
) <= 122 )
328 parser
->body_start
= p
- buffer
+ 1;
329 parser
->header_done(parser
->data
, p
+ 1, pe
- p
- 1);
341 { MARK(field_start
, p
); }
356 if ( 42 <= (*p
) && (*p
) <= 43 )
358 } else if ( (*p
) >= 35 )
360 } else if ( (*p
) > 46 ) {
362 if ( 48 <= (*p
) && (*p
) <= 57 )
364 } else if ( (*p
) > 90 ) {
365 if ( 94 <= (*p
) && (*p
) <= 122 )
375 parser
->field_len
= LEN(field_start
, p
);
407 parser
->request_uri(parser
->data
, PTR_TO(mark
), LEN(mark
, p
));
413 parser
->request_path(parser
->data
, PTR_TO(mark
), LEN(mark
,p
));
417 parser
->request_uri(parser
->data
, PTR_TO(mark
), LEN(mark
, p
));
422 {MARK(query_start
, p
); }
425 parser
->query_string(parser
->data
, PTR_TO(query_start
), LEN(query_start
, p
));
429 parser
->request_uri(parser
->data
, PTR_TO(mark
), LEN(mark
, p
));
435 parser
->query_string(parser
->data
, PTR_TO(query_start
), LEN(query_start
, p
));
439 parser
->request_uri(parser
->data
, PTR_TO(mark
), LEN(mark
, p
));
455 if ( 34 <= (*p
) && (*p
) <= 35 )
457 } else if ( (*p
) >= 0 )
477 if ( 34 <= (*p
) && (*p
) <= 35 )
479 } else if ( (*p
) >= 0 )
492 if ( 48 <= (*p
) && (*p
) <= 57 )
494 } else if ( (*p
) > 70 ) {
495 if ( 97 <= (*p
) && (*p
) <= 102 )
505 if ( 48 <= (*p
) && (*p
) <= 57 )
507 } else if ( (*p
) > 70 ) {
508 if ( 97 <= (*p
) && (*p
) <= 102 )
527 if ( 45 <= (*p
) && (*p
) <= 46 )
529 } else if ( (*p
) > 57 ) {
531 if ( 97 <= (*p
) && (*p
) <= 122 )
533 } else if ( (*p
) >= 65 )
556 if ( 0 <= (*p
) && (*p
) <= 31 )
564 if ( 48 <= (*p
) && (*p
) <= 57 )
566 } else if ( (*p
) > 70 ) {
567 if ( 97 <= (*p
) && (*p
) <= 102 )
577 if ( 48 <= (*p
) && (*p
) <= 57 )
579 } else if ( (*p
) > 70 ) {
580 if ( 97 <= (*p
) && (*p
) <= 102 )
605 if ( 0 <= (*p
) && (*p
) <= 31 )
613 if ( 48 <= (*p
) && (*p
) <= 57 )
615 } else if ( (*p
) > 70 ) {
616 if ( 97 <= (*p
) && (*p
) <= 102 )
626 if ( 48 <= (*p
) && (*p
) <= 57 )
628 } else if ( (*p
) > 70 ) {
629 if ( 97 <= (*p
) && (*p
) <= 102 )
637 parser
->request_path(parser
->data
, PTR_TO(mark
), LEN(mark
,p
));
655 if ( 0 <= (*p
) && (*p
) <= 31 )
663 if ( 48 <= (*p
) && (*p
) <= 57 )
665 } else if ( (*p
) > 70 ) {
666 if ( 97 <= (*p
) && (*p
) <= 102 )
676 if ( 48 <= (*p
) && (*p
) <= 57 )
678 } else if ( (*p
) > 70 ) {
679 if ( 97 <= (*p
) && (*p
) <= 102 )
687 parser
->request_path(parser
->data
, PTR_TO(mark
), LEN(mark
,p
));
704 if ( 0 <= (*p
) && (*p
) <= 31 )
709 {MARK(query_start
, p
); }
725 if ( 0 <= (*p
) && (*p
) <= 31 )
730 {MARK(query_start
, p
); }
738 if ( 48 <= (*p
) && (*p
) <= 57 )
740 } else if ( (*p
) > 70 ) {
741 if ( 97 <= (*p
) && (*p
) <= 102 )
751 if ( 48 <= (*p
) && (*p
) <= 57 )
753 } else if ( (*p
) > 70 ) {
754 if ( 97 <= (*p
) && (*p
) <= 102 )
769 if ( 45 <= (*p
) && (*p
) <= 46 )
771 } else if ( (*p
) > 57 ) {
772 if ( 65 <= (*p
) && (*p
) <= 90 )
787 if ( 45 <= (*p
) && (*p
) <= 46 )
789 } else if ( (*p
) > 57 ) {
790 if ( 65 <= (*p
) && (*p
) <= 90 )
805 if ( 45 <= (*p
) && (*p
) <= 46 )
807 } else if ( (*p
) > 57 ) {
808 if ( 65 <= (*p
) && (*p
) <= 90 )
823 if ( 45 <= (*p
) && (*p
) <= 46 )
825 } else if ( (*p
) > 57 ) {
826 if ( 65 <= (*p
) && (*p
) <= 90 )
841 if ( 45 <= (*p
) && (*p
) <= 46 )
843 } else if ( (*p
) > 57 ) {
844 if ( 65 <= (*p
) && (*p
) <= 90 )
859 if ( 45 <= (*p
) && (*p
) <= 46 )
861 } else if ( (*p
) > 57 ) {
862 if ( 65 <= (*p
) && (*p
) <= 90 )
877 if ( 45 <= (*p
) && (*p
) <= 46 )
879 } else if ( (*p
) > 57 ) {
880 if ( 65 <= (*p
) && (*p
) <= 90 )
895 if ( 45 <= (*p
) && (*p
) <= 46 )
897 } else if ( (*p
) > 57 ) {
898 if ( 65 <= (*p
) && (*p
) <= 90 )
913 if ( 45 <= (*p
) && (*p
) <= 46 )
915 } else if ( (*p
) > 57 ) {
916 if ( 65 <= (*p
) && (*p
) <= 90 )
931 if ( 45 <= (*p
) && (*p
) <= 46 )
933 } else if ( (*p
) > 57 ) {
934 if ( 65 <= (*p
) && (*p
) <= 90 )
949 if ( 45 <= (*p
) && (*p
) <= 46 )
951 } else if ( (*p
) > 57 ) {
952 if ( 65 <= (*p
) && (*p
) <= 90 )
967 if ( 45 <= (*p
) && (*p
) <= 46 )
969 } else if ( (*p
) > 57 ) {
970 if ( 65 <= (*p
) && (*p
) <= 90 )
985 if ( 45 <= (*p
) && (*p
) <= 46 )
987 } else if ( (*p
) > 57 ) {
988 if ( 65 <= (*p
) && (*p
) <= 90 )
1003 if ( 45 <= (*p
) && (*p
) <= 46 )
1005 } else if ( (*p
) > 57 ) {
1006 if ( 65 <= (*p
) && (*p
) <= 90 )
1021 if ( 45 <= (*p
) && (*p
) <= 46 )
1023 } else if ( (*p
) > 57 ) {
1024 if ( 65 <= (*p
) && (*p
) <= 90 )
1039 if ( 45 <= (*p
) && (*p
) <= 46 )
1041 } else if ( (*p
) > 57 ) {
1042 if ( 65 <= (*p
) && (*p
) <= 90 )
1057 if ( 45 <= (*p
) && (*p
) <= 46 )
1059 } else if ( (*p
) > 57 ) {
1060 if ( 65 <= (*p
) && (*p
) <= 90 )
1075 if ( 45 <= (*p
) && (*p
) <= 46 )
1077 } else if ( (*p
) > 57 ) {
1078 if ( 65 <= (*p
) && (*p
) <= 90 )
1091 _out0
: cs
= 0; goto _out
;
1092 _out2
: cs
= 2; goto _out
;
1093 _out3
: cs
= 3; goto _out
;
1094 _out4
: cs
= 4; goto _out
;
1095 _out5
: cs
= 5; goto _out
;
1096 _out6
: cs
= 6; goto _out
;
1097 _out7
: cs
= 7; goto _out
;
1098 _out8
: cs
= 8; goto _out
;
1099 _out9
: cs
= 9; goto _out
;
1100 _out10
: cs
= 10; goto _out
;
1101 _out11
: cs
= 11; goto _out
;
1102 _out12
: cs
= 12; goto _out
;
1103 _out13
: cs
= 13; goto _out
;
1104 _out14
: cs
= 14; goto _out
;
1105 _out15
: cs
= 15; goto _out
;
1106 _out16
: cs
= 16; goto _out
;
1107 _out57
: cs
= 57; goto _out
;
1108 _out17
: cs
= 17; goto _out
;
1109 _out18
: cs
= 18; goto _out
;
1110 _out19
: cs
= 19; goto _out
;
1111 _out20
: cs
= 20; goto _out
;
1112 _out21
: cs
= 21; goto _out
;
1113 _out22
: cs
= 22; goto _out
;
1114 _out23
: cs
= 23; goto _out
;
1115 _out24
: cs
= 24; goto _out
;
1116 _out25
: cs
= 25; goto _out
;
1117 _out26
: cs
= 26; goto _out
;
1118 _out27
: cs
= 27; goto _out
;
1119 _out28
: cs
= 28; goto _out
;
1120 _out29
: cs
= 29; goto _out
;
1121 _out30
: cs
= 30; goto _out
;
1122 _out31
: cs
= 31; goto _out
;
1123 _out32
: cs
= 32; goto _out
;
1124 _out33
: cs
= 33; goto _out
;
1125 _out34
: cs
= 34; goto _out
;
1126 _out35
: cs
= 35; goto _out
;
1127 _out36
: cs
= 36; goto _out
;
1128 _out37
: cs
= 37; goto _out
;
1129 _out38
: cs
= 38; goto _out
;
1130 _out39
: cs
= 39; goto _out
;
1131 _out40
: cs
= 40; goto _out
;
1132 _out41
: cs
= 41; goto _out
;
1133 _out42
: cs
= 42; goto _out
;
1134 _out43
: cs
= 43; goto _out
;
1135 _out44
: cs
= 44; goto _out
;
1136 _out45
: cs
= 45; goto _out
;
1137 _out46
: cs
= 46; goto _out
;
1138 _out47
: cs
= 47; goto _out
;
1139 _out48
: cs
= 48; goto _out
;
1140 _out49
: cs
= 49; goto _out
;
1141 _out50
: cs
= 50; goto _out
;
1142 _out51
: cs
= 51; goto _out
;
1143 _out52
: cs
= 52; goto _out
;
1144 _out53
: cs
= 53; goto _out
;
1145 _out54
: cs
= 54; goto _out
;
1146 _out55
: cs
= 55; goto _out
;
1147 _out56
: cs
= 56; goto _out
;
1151 #line 100 "parser.rl"
1154 parser
->nread
+= p
- (buffer
+ off
);
1156 assert(p
<= pe
&& "buffer overflow after parsing execute");
1157 assert(parser
->nread
<= len
&& "nread longer than length");
1158 assert(parser
->body_start
<= len
&& "body starts after buffer end");
1159 assert(parser
->mark
< len
&& "mark is after buffer end");
1160 assert(parser
->field_len
<= len
&& "field has length longer than whole buffer");
1161 assert(parser
->field_start
< len
&& "field starts after buffer end");
1163 if(parser
->body_start
) {
1164 /* final \r\n combo encountered so stop right here */
1166 #line 1167 "parser.c"
1167 #line 114 "parser.rl"
1171 return(parser
->nread
);
1174 int http_parser_finish(http_parser
*parser
)
1176 int cs
= parser
->cs
;
1179 #line 1180 "parser.c"
1180 #line 125 "parser.rl"
1184 if (http_parser_has_error(parser
) ) {
1186 } else if (http_parser_is_finished(parser
) ) {
1193 int http_parser_has_error(http_parser
*parser
) {
1194 return parser
->cs
== http_parser_error
;
1197 int http_parser_is_finished(http_parser
*parser
) {
1198 return parser
->cs
== http_parser_first_final
;