small changes, and adding parser.c
[ebb.git] / src / parser.c
bloba9726069318de05752e3adb135d82964ac58cfdb
1 #line 1 "src/parser.rl"
2 /**
3 * Copyright (c) 2005 Zed A. Shaw
4 * You can redistribute it and/or modify it under the same terms as Ruby.
5 */
6 #include "parser.h"
7 #include <stdio.h>
8 #include <assert.h>
9 #include <stdlib.h>
10 #include <ctype.h>
11 #include <string.h>
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)
17 /** machine **/
18 #line 122 "src/parser.rl"
21 /** Data **/
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) {
33 int cs = 0;
35 #line 36 "src/parser.c"
37 cs = http_parser_start;
39 #line 130 "src/parser.rl"
40 parser->cs = cs;
41 parser->body_start = 0;
42 parser->content_len = 0;
43 parser->mark = 0;
44 parser->nread = 0;
45 parser->field_len = 0;
46 parser->field_start = 0;
48 return(1);
52 /** exec **/
53 size_t http_parser_execute(http_parser *parser, const char *buffer, size_t len, size_t off) {
54 const char *p, *pe;
55 int cs = parser->cs;
57 assert(off <= len && "offset past end of buffer");
59 p = buffer+off;
60 pe = buffer+len;
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"
69 if ( p == pe )
70 goto _out;
71 switch ( cs )
73 case 1:
74 switch( (*p) ) {
75 case 36: goto tr0;
76 case 95: goto tr0;
78 if ( (*p) < 48 ) {
79 if ( 45 <= (*p) && (*p) <= 46 )
80 goto tr0;
81 } else if ( (*p) > 57 ) {
82 if ( 65 <= (*p) && (*p) <= 90 )
83 goto tr0;
84 } else
85 goto tr0;
86 goto st0;
87 st0:
88 goto _out0;
89 tr0:
90 #line 20 "src/parser.rl"
91 {MARK(mark, p); }
92 goto st2;
93 st2:
94 if ( ++p == pe )
95 goto _out2;
96 case 2:
97 #line 98 "src/parser.c"
98 switch( (*p) ) {
99 case 32: goto tr2;
100 case 36: goto st50;
101 case 95: goto st50;
103 if ( (*p) < 48 ) {
104 if ( 45 <= (*p) && (*p) <= 46 )
105 goto st50;
106 } else if ( (*p) > 57 ) {
107 if ( 65 <= (*p) && (*p) <= 90 )
108 goto st50;
109 } else
110 goto st50;
111 goto st0;
112 tr2:
113 #line 41 "src/parser.rl"
115 if(parser->request_method != NULL)
116 parser->request_method(parser->data, PTR_TO(mark), LEN(mark, p));
118 goto st3;
119 st3:
120 if ( ++p == pe )
121 goto _out3;
122 case 3:
123 #line 124 "src/parser.c"
124 switch( (*p) ) {
125 case 42: goto tr4;
126 case 43: goto tr5;
127 case 47: goto tr6;
128 case 58: goto tr7;
130 if ( (*p) < 65 ) {
131 if ( 45 <= (*p) && (*p) <= 57 )
132 goto tr5;
133 } else if ( (*p) > 90 ) {
134 if ( 97 <= (*p) && (*p) <= 122 )
135 goto tr5;
136 } else
137 goto tr5;
138 goto st0;
139 tr4:
140 #line 20 "src/parser.rl"
141 {MARK(mark, p); }
142 goto st4;
143 st4:
144 if ( ++p == pe )
145 goto _out4;
146 case 4:
147 #line 148 "src/parser.c"
148 if ( (*p) == 32 )
149 goto tr8;
150 goto st0;
151 tr8:
152 #line 45 "src/parser.rl"
154 if(parser->request_uri != NULL)
155 parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
157 goto st5;
158 tr52:
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));
169 goto st5;
170 tr62:
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));
183 goto st5;
184 tr65:
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));
195 goto st5;
196 st5:
197 if ( ++p == pe )
198 goto _out5;
199 case 5:
200 #line 201 "src/parser.c"
201 if ( (*p) == 72 )
202 goto tr9;
203 goto st0;
204 tr9:
205 #line 20 "src/parser.rl"
206 {MARK(mark, p); }
207 goto st6;
208 st6:
209 if ( ++p == pe )
210 goto _out6;
211 case 6:
212 #line 213 "src/parser.c"
213 if ( (*p) == 84 )
214 goto st7;
215 goto st0;
216 st7:
217 if ( ++p == pe )
218 goto _out7;
219 case 7:
220 if ( (*p) == 84 )
221 goto st8;
222 goto st0;
223 st8:
224 if ( ++p == pe )
225 goto _out8;
226 case 8:
227 if ( (*p) == 80 )
228 goto st9;
229 goto st0;
230 st9:
231 if ( ++p == pe )
232 goto _out9;
233 case 9:
234 if ( (*p) == 47 )
235 goto st10;
236 goto st0;
237 st10:
238 if ( ++p == pe )
239 goto _out10;
240 case 10:
241 if ( 48 <= (*p) && (*p) <= 57 )
242 goto st11;
243 goto st0;
244 st11:
245 if ( ++p == pe )
246 goto _out11;
247 case 11:
248 if ( (*p) == 46 )
249 goto st12;
250 if ( 48 <= (*p) && (*p) <= 57 )
251 goto st11;
252 goto st0;
253 st12:
254 if ( ++p == pe )
255 goto _out12;
256 case 12:
257 if ( 48 <= (*p) && (*p) <= 57 )
258 goto st13;
259 goto st0;
260 st13:
261 if ( ++p == pe )
262 goto _out13;
263 case 13:
264 if ( (*p) == 13 )
265 goto tr17;
266 if ( 48 <= (*p) && (*p) <= 57 )
267 goto st13;
268 goto st0;
269 tr17:
270 #line 56 "src/parser.rl"
272 if(parser->http_version != NULL)
273 parser->http_version(parser->data, PTR_TO(mark), LEN(mark, p));
275 goto st14;
276 tr26:
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));
283 goto st14;
284 tr44:
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));
297 goto st14;
298 st14:
299 if ( ++p == pe )
300 goto _out14;
301 case 14:
302 #line 303 "src/parser.c"
303 if ( (*p) == 10 )
304 goto st15;
305 goto st0;
306 st15:
307 if ( ++p == pe )
308 goto _out15;
309 case 15:
310 switch( (*p) ) {
311 case 13: goto st16;
312 case 33: goto tr20;
313 case 67: goto tr21;
314 case 99: goto tr21;
315 case 124: goto tr20;
316 case 126: goto tr20;
318 if ( (*p) < 45 ) {
319 if ( (*p) > 39 ) {
320 if ( 42 <= (*p) && (*p) <= 43 )
321 goto tr20;
322 } else if ( (*p) >= 35 )
323 goto tr20;
324 } else if ( (*p) > 46 ) {
325 if ( (*p) < 65 ) {
326 if ( 48 <= (*p) && (*p) <= 57 )
327 goto tr20;
328 } else if ( (*p) > 90 ) {
329 if ( 94 <= (*p) && (*p) <= 122 )
330 goto tr20;
331 } else
332 goto tr20;
333 } else
334 goto tr20;
335 goto st0;
336 st16:
337 if ( ++p == pe )
338 goto _out16;
339 case 16:
340 if ( (*p) == 10 )
341 goto tr22;
342 goto st0;
343 tr22:
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);
349 goto _out69;
351 goto st69;
352 st69:
353 if ( ++p == pe )
354 goto _out69;
355 case 69:
356 #line 357 "src/parser.c"
357 goto st0;
358 tr20:
359 #line 23 "src/parser.rl"
360 { MARK(field_start, p); }
361 goto st17;
362 st17:
363 if ( ++p == pe )
364 goto _out17;
365 case 17:
366 #line 367 "src/parser.c"
367 switch( (*p) ) {
368 case 33: goto st17;
369 case 58: goto tr24;
370 case 124: goto st17;
371 case 126: goto st17;
373 if ( (*p) < 45 ) {
374 if ( (*p) > 39 ) {
375 if ( 42 <= (*p) && (*p) <= 43 )
376 goto st17;
377 } else if ( (*p) >= 35 )
378 goto st17;
379 } else if ( (*p) > 46 ) {
380 if ( (*p) < 65 ) {
381 if ( 48 <= (*p) && (*p) <= 57 )
382 goto st17;
383 } else if ( (*p) > 90 ) {
384 if ( 94 <= (*p) && (*p) <= 122 )
385 goto st17;
386 } else
387 goto st17;
388 } else
389 goto st17;
390 goto st0;
391 tr24:
392 #line 24 "src/parser.rl"
394 parser->field_len = LEN(field_start, p);
396 goto st18;
397 tr27:
398 #line 28 "src/parser.rl"
399 { MARK(mark, p); }
400 goto st18;
401 st18:
402 if ( ++p == pe )
403 goto _out18;
404 case 18:
405 #line 406 "src/parser.c"
406 switch( (*p) ) {
407 case 13: goto tr26;
408 case 32: goto tr27;
410 goto tr25;
411 tr25:
412 #line 28 "src/parser.rl"
413 { MARK(mark, p); }
414 goto st19;
415 st19:
416 if ( ++p == pe )
417 goto _out19;
418 case 19:
419 #line 420 "src/parser.c"
420 if ( (*p) == 13 )
421 goto tr26;
422 goto st19;
423 tr21:
424 #line 23 "src/parser.rl"
425 { MARK(field_start, p); }
426 goto st20;
427 st20:
428 if ( ++p == pe )
429 goto _out20;
430 case 20:
431 #line 432 "src/parser.c"
432 switch( (*p) ) {
433 case 33: goto st17;
434 case 58: goto tr24;
435 case 79: goto st21;
436 case 111: goto st21;
437 case 124: goto st17;
438 case 126: goto st17;
440 if ( (*p) < 45 ) {
441 if ( (*p) > 39 ) {
442 if ( 42 <= (*p) && (*p) <= 43 )
443 goto st17;
444 } else if ( (*p) >= 35 )
445 goto st17;
446 } else if ( (*p) > 46 ) {
447 if ( (*p) < 65 ) {
448 if ( 48 <= (*p) && (*p) <= 57 )
449 goto st17;
450 } else if ( (*p) > 90 ) {
451 if ( 94 <= (*p) && (*p) <= 122 )
452 goto st17;
453 } else
454 goto st17;
455 } else
456 goto st17;
457 goto st0;
458 st21:
459 if ( ++p == pe )
460 goto _out21;
461 case 21:
462 switch( (*p) ) {
463 case 33: goto st17;
464 case 58: goto tr24;
465 case 78: goto st22;
466 case 110: goto st22;
467 case 124: goto st17;
468 case 126: goto st17;
470 if ( (*p) < 45 ) {
471 if ( (*p) > 39 ) {
472 if ( 42 <= (*p) && (*p) <= 43 )
473 goto st17;
474 } else if ( (*p) >= 35 )
475 goto st17;
476 } else if ( (*p) > 46 ) {
477 if ( (*p) < 65 ) {
478 if ( 48 <= (*p) && (*p) <= 57 )
479 goto st17;
480 } else if ( (*p) > 90 ) {
481 if ( 94 <= (*p) && (*p) <= 122 )
482 goto st17;
483 } else
484 goto st17;
485 } else
486 goto st17;
487 goto st0;
488 st22:
489 if ( ++p == pe )
490 goto _out22;
491 case 22:
492 switch( (*p) ) {
493 case 33: goto st17;
494 case 58: goto tr24;
495 case 84: goto st23;
496 case 116: goto st23;
497 case 124: goto st17;
498 case 126: goto st17;
500 if ( (*p) < 45 ) {
501 if ( (*p) > 39 ) {
502 if ( 42 <= (*p) && (*p) <= 43 )
503 goto st17;
504 } else if ( (*p) >= 35 )
505 goto st17;
506 } else if ( (*p) > 46 ) {
507 if ( (*p) < 65 ) {
508 if ( 48 <= (*p) && (*p) <= 57 )
509 goto st17;
510 } else if ( (*p) > 90 ) {
511 if ( 94 <= (*p) && (*p) <= 122 )
512 goto st17;
513 } else
514 goto st17;
515 } else
516 goto st17;
517 goto st0;
518 st23:
519 if ( ++p == pe )
520 goto _out23;
521 case 23:
522 switch( (*p) ) {
523 case 33: goto st17;
524 case 58: goto tr24;
525 case 69: goto st24;
526 case 101: goto st24;
527 case 124: goto st17;
528 case 126: goto st17;
530 if ( (*p) < 45 ) {
531 if ( (*p) > 39 ) {
532 if ( 42 <= (*p) && (*p) <= 43 )
533 goto st17;
534 } else if ( (*p) >= 35 )
535 goto st17;
536 } else if ( (*p) > 46 ) {
537 if ( (*p) < 65 ) {
538 if ( 48 <= (*p) && (*p) <= 57 )
539 goto st17;
540 } else if ( (*p) > 90 ) {
541 if ( 94 <= (*p) && (*p) <= 122 )
542 goto st17;
543 } else
544 goto st17;
545 } else
546 goto st17;
547 goto st0;
548 st24:
549 if ( ++p == pe )
550 goto _out24;
551 case 24:
552 switch( (*p) ) {
553 case 33: goto st17;
554 case 58: goto tr24;
555 case 78: goto st25;
556 case 110: goto st25;
557 case 124: goto st17;
558 case 126: goto st17;
560 if ( (*p) < 45 ) {
561 if ( (*p) > 39 ) {
562 if ( 42 <= (*p) && (*p) <= 43 )
563 goto st17;
564 } else if ( (*p) >= 35 )
565 goto st17;
566 } else if ( (*p) > 46 ) {
567 if ( (*p) < 65 ) {
568 if ( 48 <= (*p) && (*p) <= 57 )
569 goto st17;
570 } else if ( (*p) > 90 ) {
571 if ( 94 <= (*p) && (*p) <= 122 )
572 goto st17;
573 } else
574 goto st17;
575 } else
576 goto st17;
577 goto st0;
578 st25:
579 if ( ++p == pe )
580 goto _out25;
581 case 25:
582 switch( (*p) ) {
583 case 33: goto st17;
584 case 58: goto tr24;
585 case 84: goto st26;
586 case 116: goto st26;
587 case 124: goto st17;
588 case 126: goto st17;
590 if ( (*p) < 45 ) {
591 if ( (*p) > 39 ) {
592 if ( 42 <= (*p) && (*p) <= 43 )
593 goto st17;
594 } else if ( (*p) >= 35 )
595 goto st17;
596 } else if ( (*p) > 46 ) {
597 if ( (*p) < 65 ) {
598 if ( 48 <= (*p) && (*p) <= 57 )
599 goto st17;
600 } else if ( (*p) > 90 ) {
601 if ( 94 <= (*p) && (*p) <= 122 )
602 goto st17;
603 } else
604 goto st17;
605 } else
606 goto st17;
607 goto st0;
608 st26:
609 if ( ++p == pe )
610 goto _out26;
611 case 26:
612 switch( (*p) ) {
613 case 33: goto st17;
614 case 45: goto st27;
615 case 46: goto st17;
616 case 58: goto tr24;
617 case 124: goto st17;
618 case 126: goto st17;
620 if ( (*p) < 48 ) {
621 if ( (*p) > 39 ) {
622 if ( 42 <= (*p) && (*p) <= 43 )
623 goto st17;
624 } else if ( (*p) >= 35 )
625 goto st17;
626 } else if ( (*p) > 57 ) {
627 if ( (*p) > 90 ) {
628 if ( 94 <= (*p) && (*p) <= 122 )
629 goto st17;
630 } else if ( (*p) >= 65 )
631 goto st17;
632 } else
633 goto st17;
634 goto st0;
635 st27:
636 if ( ++p == pe )
637 goto _out27;
638 case 27:
639 switch( (*p) ) {
640 case 33: goto st17;
641 case 58: goto tr24;
642 case 76: goto st28;
643 case 108: goto st28;
644 case 124: goto st17;
645 case 126: goto st17;
647 if ( (*p) < 45 ) {
648 if ( (*p) > 39 ) {
649 if ( 42 <= (*p) && (*p) <= 43 )
650 goto st17;
651 } else if ( (*p) >= 35 )
652 goto st17;
653 } else if ( (*p) > 46 ) {
654 if ( (*p) < 65 ) {
655 if ( 48 <= (*p) && (*p) <= 57 )
656 goto st17;
657 } else if ( (*p) > 90 ) {
658 if ( 94 <= (*p) && (*p) <= 122 )
659 goto st17;
660 } else
661 goto st17;
662 } else
663 goto st17;
664 goto st0;
665 st28:
666 if ( ++p == pe )
667 goto _out28;
668 case 28:
669 switch( (*p) ) {
670 case 33: goto st17;
671 case 58: goto tr24;
672 case 69: goto st29;
673 case 101: goto st29;
674 case 124: goto st17;
675 case 126: goto st17;
677 if ( (*p) < 45 ) {
678 if ( (*p) > 39 ) {
679 if ( 42 <= (*p) && (*p) <= 43 )
680 goto st17;
681 } else if ( (*p) >= 35 )
682 goto st17;
683 } else if ( (*p) > 46 ) {
684 if ( (*p) < 65 ) {
685 if ( 48 <= (*p) && (*p) <= 57 )
686 goto st17;
687 } else if ( (*p) > 90 ) {
688 if ( 94 <= (*p) && (*p) <= 122 )
689 goto st17;
690 } else
691 goto st17;
692 } else
693 goto st17;
694 goto st0;
695 st29:
696 if ( ++p == pe )
697 goto _out29;
698 case 29:
699 switch( (*p) ) {
700 case 33: goto st17;
701 case 58: goto tr24;
702 case 78: goto st30;
703 case 110: goto st30;
704 case 124: goto st17;
705 case 126: goto st17;
707 if ( (*p) < 45 ) {
708 if ( (*p) > 39 ) {
709 if ( 42 <= (*p) && (*p) <= 43 )
710 goto st17;
711 } else if ( (*p) >= 35 )
712 goto st17;
713 } else if ( (*p) > 46 ) {
714 if ( (*p) < 65 ) {
715 if ( 48 <= (*p) && (*p) <= 57 )
716 goto st17;
717 } else if ( (*p) > 90 ) {
718 if ( 94 <= (*p) && (*p) <= 122 )
719 goto st17;
720 } else
721 goto st17;
722 } else
723 goto st17;
724 goto st0;
725 st30:
726 if ( ++p == pe )
727 goto _out30;
728 case 30:
729 switch( (*p) ) {
730 case 33: goto st17;
731 case 58: goto tr24;
732 case 71: goto st31;
733 case 103: goto st31;
734 case 124: goto st17;
735 case 126: goto st17;
737 if ( (*p) < 45 ) {
738 if ( (*p) > 39 ) {
739 if ( 42 <= (*p) && (*p) <= 43 )
740 goto st17;
741 } else if ( (*p) >= 35 )
742 goto st17;
743 } else if ( (*p) > 46 ) {
744 if ( (*p) < 65 ) {
745 if ( 48 <= (*p) && (*p) <= 57 )
746 goto st17;
747 } else if ( (*p) > 90 ) {
748 if ( 94 <= (*p) && (*p) <= 122 )
749 goto st17;
750 } else
751 goto st17;
752 } else
753 goto st17;
754 goto st0;
755 st31:
756 if ( ++p == pe )
757 goto _out31;
758 case 31:
759 switch( (*p) ) {
760 case 33: goto st17;
761 case 58: goto tr24;
762 case 84: goto st32;
763 case 116: goto st32;
764 case 124: goto st17;
765 case 126: goto st17;
767 if ( (*p) < 45 ) {
768 if ( (*p) > 39 ) {
769 if ( 42 <= (*p) && (*p) <= 43 )
770 goto st17;
771 } else if ( (*p) >= 35 )
772 goto st17;
773 } else if ( (*p) > 46 ) {
774 if ( (*p) < 65 ) {
775 if ( 48 <= (*p) && (*p) <= 57 )
776 goto st17;
777 } else if ( (*p) > 90 ) {
778 if ( 94 <= (*p) && (*p) <= 122 )
779 goto st17;
780 } else
781 goto st17;
782 } else
783 goto st17;
784 goto st0;
785 st32:
786 if ( ++p == pe )
787 goto _out32;
788 case 32:
789 switch( (*p) ) {
790 case 33: goto st17;
791 case 58: goto tr24;
792 case 72: goto st33;
793 case 104: goto st33;
794 case 124: goto st17;
795 case 126: goto st17;
797 if ( (*p) < 45 ) {
798 if ( (*p) > 39 ) {
799 if ( 42 <= (*p) && (*p) <= 43 )
800 goto st17;
801 } else if ( (*p) >= 35 )
802 goto st17;
803 } else if ( (*p) > 46 ) {
804 if ( (*p) < 65 ) {
805 if ( 48 <= (*p) && (*p) <= 57 )
806 goto st17;
807 } else if ( (*p) > 90 ) {
808 if ( 94 <= (*p) && (*p) <= 122 )
809 goto st17;
810 } else
811 goto st17;
812 } else
813 goto st17;
814 goto st0;
815 st33:
816 if ( ++p == pe )
817 goto _out33;
818 case 33:
819 switch( (*p) ) {
820 case 33: goto st17;
821 case 58: goto tr42;
822 case 124: goto st17;
823 case 126: goto st17;
825 if ( (*p) < 45 ) {
826 if ( (*p) > 39 ) {
827 if ( 42 <= (*p) && (*p) <= 43 )
828 goto st17;
829 } else if ( (*p) >= 35 )
830 goto st17;
831 } else if ( (*p) > 46 ) {
832 if ( (*p) < 65 ) {
833 if ( 48 <= (*p) && (*p) <= 57 )
834 goto st17;
835 } else if ( (*p) > 90 ) {
836 if ( 94 <= (*p) && (*p) <= 122 )
837 goto st17;
838 } else
839 goto st17;
840 } else
841 goto st17;
842 goto st0;
843 tr42:
844 #line 24 "src/parser.rl"
846 parser->field_len = LEN(field_start, p);
848 goto st34;
849 tr45:
850 #line 20 "src/parser.rl"
851 {MARK(mark, p); }
852 #line 28 "src/parser.rl"
853 { MARK(mark, p); }
854 goto st34;
855 st34:
856 if ( ++p == pe )
857 goto _out34;
858 case 34:
859 #line 860 "src/parser.c"
860 switch( (*p) ) {
861 case 13: goto tr44;
862 case 32: goto tr45;
864 goto tr43;
865 tr43:
866 #line 20 "src/parser.rl"
867 {MARK(mark, p); }
868 #line 28 "src/parser.rl"
869 { MARK(mark, p); }
870 goto st35;
871 st35:
872 if ( ++p == pe )
873 goto _out35;
874 case 35:
875 #line 876 "src/parser.c"
876 if ( (*p) == 13 )
877 goto tr44;
878 goto st35;
879 tr5:
880 #line 20 "src/parser.rl"
881 {MARK(mark, p); }
882 goto st36;
883 st36:
884 if ( ++p == pe )
885 goto _out36;
886 case 36:
887 #line 888 "src/parser.c"
888 switch( (*p) ) {
889 case 43: goto st36;
890 case 58: goto st37;
892 if ( (*p) < 48 ) {
893 if ( 45 <= (*p) && (*p) <= 46 )
894 goto st36;
895 } else if ( (*p) > 57 ) {
896 if ( (*p) > 90 ) {
897 if ( 97 <= (*p) && (*p) <= 122 )
898 goto st36;
899 } else if ( (*p) >= 65 )
900 goto st36;
901 } else
902 goto st36;
903 goto st0;
904 tr7:
905 #line 20 "src/parser.rl"
906 {MARK(mark, p); }
907 goto st37;
908 st37:
909 if ( ++p == pe )
910 goto _out37;
911 case 37:
912 #line 913 "src/parser.c"
913 switch( (*p) ) {
914 case 32: goto tr8;
915 case 37: goto st38;
916 case 60: goto st0;
917 case 62: goto st0;
918 case 127: goto st0;
920 if ( (*p) > 31 ) {
921 if ( 34 <= (*p) && (*p) <= 35 )
922 goto st0;
923 } else if ( (*p) >= 0 )
924 goto st0;
925 goto st37;
926 st38:
927 if ( ++p == pe )
928 goto _out38;
929 case 38:
930 if ( (*p) < 65 ) {
931 if ( 48 <= (*p) && (*p) <= 57 )
932 goto st39;
933 } else if ( (*p) > 70 ) {
934 if ( 97 <= (*p) && (*p) <= 102 )
935 goto st39;
936 } else
937 goto st39;
938 goto st0;
939 st39:
940 if ( ++p == pe )
941 goto _out39;
942 case 39:
943 if ( (*p) < 65 ) {
944 if ( 48 <= (*p) && (*p) <= 57 )
945 goto st37;
946 } else if ( (*p) > 70 ) {
947 if ( 97 <= (*p) && (*p) <= 102 )
948 goto st37;
949 } else
950 goto st37;
951 goto st0;
952 tr6:
953 #line 20 "src/parser.rl"
954 {MARK(mark, p); }
955 goto st40;
956 st40:
957 if ( ++p == pe )
958 goto _out40;
959 case 40:
960 #line 961 "src/parser.c"
961 switch( (*p) ) {
962 case 32: goto tr52;
963 case 37: goto st41;
964 case 59: goto tr54;
965 case 60: goto st0;
966 case 62: goto st0;
967 case 63: goto tr55;
968 case 127: goto st0;
970 if ( (*p) > 31 ) {
971 if ( 34 <= (*p) && (*p) <= 35 )
972 goto st0;
973 } else if ( (*p) >= 0 )
974 goto st0;
975 goto st40;
976 st41:
977 if ( ++p == pe )
978 goto _out41;
979 case 41:
980 if ( (*p) < 65 ) {
981 if ( 48 <= (*p) && (*p) <= 57 )
982 goto st42;
983 } else if ( (*p) > 70 ) {
984 if ( 97 <= (*p) && (*p) <= 102 )
985 goto st42;
986 } else
987 goto st42;
988 goto st0;
989 st42:
990 if ( ++p == pe )
991 goto _out42;
992 case 42:
993 if ( (*p) < 65 ) {
994 if ( 48 <= (*p) && (*p) <= 57 )
995 goto st40;
996 } else if ( (*p) > 70 ) {
997 if ( 97 <= (*p) && (*p) <= 102 )
998 goto st40;
999 } else
1000 goto st40;
1001 goto st0;
1002 tr54:
1003 #line 61 "src/parser.rl"
1005 if(parser->request_path != NULL)
1006 parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
1008 goto st43;
1009 st43:
1010 if ( ++p == pe )
1011 goto _out43;
1012 case 43:
1013 #line 1014 "src/parser.c"
1014 switch( (*p) ) {
1015 case 32: goto tr8;
1016 case 37: goto st44;
1017 case 60: goto st0;
1018 case 62: goto st0;
1019 case 63: goto st46;
1020 case 127: goto st0;
1022 if ( (*p) > 31 ) {
1023 if ( 34 <= (*p) && (*p) <= 35 )
1024 goto st0;
1025 } else if ( (*p) >= 0 )
1026 goto st0;
1027 goto st43;
1028 st44:
1029 if ( ++p == pe )
1030 goto _out44;
1031 case 44:
1032 if ( (*p) < 65 ) {
1033 if ( 48 <= (*p) && (*p) <= 57 )
1034 goto st45;
1035 } else if ( (*p) > 70 ) {
1036 if ( 97 <= (*p) && (*p) <= 102 )
1037 goto st45;
1038 } else
1039 goto st45;
1040 goto st0;
1041 st45:
1042 if ( ++p == pe )
1043 goto _out45;
1044 case 45:
1045 if ( (*p) < 65 ) {
1046 if ( 48 <= (*p) && (*p) <= 57 )
1047 goto st43;
1048 } else if ( (*p) > 70 ) {
1049 if ( 97 <= (*p) && (*p) <= 102 )
1050 goto st43;
1051 } else
1052 goto st43;
1053 goto st0;
1054 tr55:
1055 #line 61 "src/parser.rl"
1057 if(parser->request_path != NULL)
1058 parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
1060 goto st46;
1061 st46:
1062 if ( ++p == pe )
1063 goto _out46;
1064 case 46:
1065 #line 1066 "src/parser.c"
1066 switch( (*p) ) {
1067 case 32: goto tr62;
1068 case 37: goto tr63;
1069 case 60: goto st0;
1070 case 62: goto st0;
1071 case 127: goto st0;
1073 if ( (*p) > 31 ) {
1074 if ( 34 <= (*p) && (*p) <= 35 )
1075 goto st0;
1076 } else if ( (*p) >= 0 )
1077 goto st0;
1078 goto tr61;
1079 tr61:
1080 #line 50 "src/parser.rl"
1081 {MARK(query_start, p); }
1082 goto st47;
1083 st47:
1084 if ( ++p == pe )
1085 goto _out47;
1086 case 47:
1087 #line 1088 "src/parser.c"
1088 switch( (*p) ) {
1089 case 32: goto tr65;
1090 case 37: goto st48;
1091 case 60: goto st0;
1092 case 62: goto st0;
1093 case 127: goto st0;
1095 if ( (*p) > 31 ) {
1096 if ( 34 <= (*p) && (*p) <= 35 )
1097 goto st0;
1098 } else if ( (*p) >= 0 )
1099 goto st0;
1100 goto st47;
1101 tr63:
1102 #line 50 "src/parser.rl"
1103 {MARK(query_start, p); }
1104 goto st48;
1105 st48:
1106 if ( ++p == pe )
1107 goto _out48;
1108 case 48:
1109 #line 1110 "src/parser.c"
1110 if ( (*p) < 65 ) {
1111 if ( 48 <= (*p) && (*p) <= 57 )
1112 goto st49;
1113 } else if ( (*p) > 70 ) {
1114 if ( 97 <= (*p) && (*p) <= 102 )
1115 goto st49;
1116 } else
1117 goto st49;
1118 goto st0;
1119 st49:
1120 if ( ++p == pe )
1121 goto _out49;
1122 case 49:
1123 if ( (*p) < 65 ) {
1124 if ( 48 <= (*p) && (*p) <= 57 )
1125 goto st47;
1126 } else if ( (*p) > 70 ) {
1127 if ( 97 <= (*p) && (*p) <= 102 )
1128 goto st47;
1129 } else
1130 goto st47;
1131 goto st0;
1132 st50:
1133 if ( ++p == pe )
1134 goto _out50;
1135 case 50:
1136 switch( (*p) ) {
1137 case 32: goto tr2;
1138 case 36: goto st51;
1139 case 95: goto st51;
1141 if ( (*p) < 48 ) {
1142 if ( 45 <= (*p) && (*p) <= 46 )
1143 goto st51;
1144 } else if ( (*p) > 57 ) {
1145 if ( 65 <= (*p) && (*p) <= 90 )
1146 goto st51;
1147 } else
1148 goto st51;
1149 goto st0;
1150 st51:
1151 if ( ++p == pe )
1152 goto _out51;
1153 case 51:
1154 switch( (*p) ) {
1155 case 32: goto tr2;
1156 case 36: goto st52;
1157 case 95: goto st52;
1159 if ( (*p) < 48 ) {
1160 if ( 45 <= (*p) && (*p) <= 46 )
1161 goto st52;
1162 } else if ( (*p) > 57 ) {
1163 if ( 65 <= (*p) && (*p) <= 90 )
1164 goto st52;
1165 } else
1166 goto st52;
1167 goto st0;
1168 st52:
1169 if ( ++p == pe )
1170 goto _out52;
1171 case 52:
1172 switch( (*p) ) {
1173 case 32: goto tr2;
1174 case 36: goto st53;
1175 case 95: goto st53;
1177 if ( (*p) < 48 ) {
1178 if ( 45 <= (*p) && (*p) <= 46 )
1179 goto st53;
1180 } else if ( (*p) > 57 ) {
1181 if ( 65 <= (*p) && (*p) <= 90 )
1182 goto st53;
1183 } else
1184 goto st53;
1185 goto st0;
1186 st53:
1187 if ( ++p == pe )
1188 goto _out53;
1189 case 53:
1190 switch( (*p) ) {
1191 case 32: goto tr2;
1192 case 36: goto st54;
1193 case 95: goto st54;
1195 if ( (*p) < 48 ) {
1196 if ( 45 <= (*p) && (*p) <= 46 )
1197 goto st54;
1198 } else if ( (*p) > 57 ) {
1199 if ( 65 <= (*p) && (*p) <= 90 )
1200 goto st54;
1201 } else
1202 goto st54;
1203 goto st0;
1204 st54:
1205 if ( ++p == pe )
1206 goto _out54;
1207 case 54:
1208 switch( (*p) ) {
1209 case 32: goto tr2;
1210 case 36: goto st55;
1211 case 95: goto st55;
1213 if ( (*p) < 48 ) {
1214 if ( 45 <= (*p) && (*p) <= 46 )
1215 goto st55;
1216 } else if ( (*p) > 57 ) {
1217 if ( 65 <= (*p) && (*p) <= 90 )
1218 goto st55;
1219 } else
1220 goto st55;
1221 goto st0;
1222 st55:
1223 if ( ++p == pe )
1224 goto _out55;
1225 case 55:
1226 switch( (*p) ) {
1227 case 32: goto tr2;
1228 case 36: goto st56;
1229 case 95: goto st56;
1231 if ( (*p) < 48 ) {
1232 if ( 45 <= (*p) && (*p) <= 46 )
1233 goto st56;
1234 } else if ( (*p) > 57 ) {
1235 if ( 65 <= (*p) && (*p) <= 90 )
1236 goto st56;
1237 } else
1238 goto st56;
1239 goto st0;
1240 st56:
1241 if ( ++p == pe )
1242 goto _out56;
1243 case 56:
1244 switch( (*p) ) {
1245 case 32: goto tr2;
1246 case 36: goto st57;
1247 case 95: goto st57;
1249 if ( (*p) < 48 ) {
1250 if ( 45 <= (*p) && (*p) <= 46 )
1251 goto st57;
1252 } else if ( (*p) > 57 ) {
1253 if ( 65 <= (*p) && (*p) <= 90 )
1254 goto st57;
1255 } else
1256 goto st57;
1257 goto st0;
1258 st57:
1259 if ( ++p == pe )
1260 goto _out57;
1261 case 57:
1262 switch( (*p) ) {
1263 case 32: goto tr2;
1264 case 36: goto st58;
1265 case 95: goto st58;
1267 if ( (*p) < 48 ) {
1268 if ( 45 <= (*p) && (*p) <= 46 )
1269 goto st58;
1270 } else if ( (*p) > 57 ) {
1271 if ( 65 <= (*p) && (*p) <= 90 )
1272 goto st58;
1273 } else
1274 goto st58;
1275 goto st0;
1276 st58:
1277 if ( ++p == pe )
1278 goto _out58;
1279 case 58:
1280 switch( (*p) ) {
1281 case 32: goto tr2;
1282 case 36: goto st59;
1283 case 95: goto st59;
1285 if ( (*p) < 48 ) {
1286 if ( 45 <= (*p) && (*p) <= 46 )
1287 goto st59;
1288 } else if ( (*p) > 57 ) {
1289 if ( 65 <= (*p) && (*p) <= 90 )
1290 goto st59;
1291 } else
1292 goto st59;
1293 goto st0;
1294 st59:
1295 if ( ++p == pe )
1296 goto _out59;
1297 case 59:
1298 switch( (*p) ) {
1299 case 32: goto tr2;
1300 case 36: goto st60;
1301 case 95: goto st60;
1303 if ( (*p) < 48 ) {
1304 if ( 45 <= (*p) && (*p) <= 46 )
1305 goto st60;
1306 } else if ( (*p) > 57 ) {
1307 if ( 65 <= (*p) && (*p) <= 90 )
1308 goto st60;
1309 } else
1310 goto st60;
1311 goto st0;
1312 st60:
1313 if ( ++p == pe )
1314 goto _out60;
1315 case 60:
1316 switch( (*p) ) {
1317 case 32: goto tr2;
1318 case 36: goto st61;
1319 case 95: goto st61;
1321 if ( (*p) < 48 ) {
1322 if ( 45 <= (*p) && (*p) <= 46 )
1323 goto st61;
1324 } else if ( (*p) > 57 ) {
1325 if ( 65 <= (*p) && (*p) <= 90 )
1326 goto st61;
1327 } else
1328 goto st61;
1329 goto st0;
1330 st61:
1331 if ( ++p == pe )
1332 goto _out61;
1333 case 61:
1334 switch( (*p) ) {
1335 case 32: goto tr2;
1336 case 36: goto st62;
1337 case 95: goto st62;
1339 if ( (*p) < 48 ) {
1340 if ( 45 <= (*p) && (*p) <= 46 )
1341 goto st62;
1342 } else if ( (*p) > 57 ) {
1343 if ( 65 <= (*p) && (*p) <= 90 )
1344 goto st62;
1345 } else
1346 goto st62;
1347 goto st0;
1348 st62:
1349 if ( ++p == pe )
1350 goto _out62;
1351 case 62:
1352 switch( (*p) ) {
1353 case 32: goto tr2;
1354 case 36: goto st63;
1355 case 95: goto st63;
1357 if ( (*p) < 48 ) {
1358 if ( 45 <= (*p) && (*p) <= 46 )
1359 goto st63;
1360 } else if ( (*p) > 57 ) {
1361 if ( 65 <= (*p) && (*p) <= 90 )
1362 goto st63;
1363 } else
1364 goto st63;
1365 goto st0;
1366 st63:
1367 if ( ++p == pe )
1368 goto _out63;
1369 case 63:
1370 switch( (*p) ) {
1371 case 32: goto tr2;
1372 case 36: goto st64;
1373 case 95: goto st64;
1375 if ( (*p) < 48 ) {
1376 if ( 45 <= (*p) && (*p) <= 46 )
1377 goto st64;
1378 } else if ( (*p) > 57 ) {
1379 if ( 65 <= (*p) && (*p) <= 90 )
1380 goto st64;
1381 } else
1382 goto st64;
1383 goto st0;
1384 st64:
1385 if ( ++p == pe )
1386 goto _out64;
1387 case 64:
1388 switch( (*p) ) {
1389 case 32: goto tr2;
1390 case 36: goto st65;
1391 case 95: goto st65;
1393 if ( (*p) < 48 ) {
1394 if ( 45 <= (*p) && (*p) <= 46 )
1395 goto st65;
1396 } else if ( (*p) > 57 ) {
1397 if ( 65 <= (*p) && (*p) <= 90 )
1398 goto st65;
1399 } else
1400 goto st65;
1401 goto st0;
1402 st65:
1403 if ( ++p == pe )
1404 goto _out65;
1405 case 65:
1406 switch( (*p) ) {
1407 case 32: goto tr2;
1408 case 36: goto st66;
1409 case 95: goto st66;
1411 if ( (*p) < 48 ) {
1412 if ( 45 <= (*p) && (*p) <= 46 )
1413 goto st66;
1414 } else if ( (*p) > 57 ) {
1415 if ( 65 <= (*p) && (*p) <= 90 )
1416 goto st66;
1417 } else
1418 goto st66;
1419 goto st0;
1420 st66:
1421 if ( ++p == pe )
1422 goto _out66;
1423 case 66:
1424 switch( (*p) ) {
1425 case 32: goto tr2;
1426 case 36: goto st67;
1427 case 95: goto st67;
1429 if ( (*p) < 48 ) {
1430 if ( 45 <= (*p) && (*p) <= 46 )
1431 goto st67;
1432 } else if ( (*p) > 57 ) {
1433 if ( 65 <= (*p) && (*p) <= 90 )
1434 goto st67;
1435 } else
1436 goto st67;
1437 goto st0;
1438 st67:
1439 if ( ++p == pe )
1440 goto _out67;
1441 case 67:
1442 switch( (*p) ) {
1443 case 32: goto tr2;
1444 case 36: goto st68;
1445 case 95: goto st68;
1447 if ( (*p) < 48 ) {
1448 if ( 45 <= (*p) && (*p) <= 46 )
1449 goto st68;
1450 } else if ( (*p) > 57 ) {
1451 if ( 65 <= (*p) && (*p) <= 90 )
1452 goto st68;
1453 } else
1454 goto st68;
1455 goto st0;
1456 st68:
1457 if ( ++p == pe )
1458 goto _out68;
1459 case 68:
1460 if ( (*p) == 32 )
1461 goto tr2;
1462 goto st0;
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;
1534 _out: {}
1536 #line 157 "src/parser.rl"
1538 parser->cs = cs;
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"
1553 parser->nread++;
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"
1567 parser->cs = cs;
1569 if (http_parser_has_error(parser) ) {
1570 return -1;
1571 } else if (http_parser_is_finished(parser) ) {
1572 return 1;
1573 } else {
1574 return 0;
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;