comparison asyncdreactor/protocol/Http11Parser.d @ 11:5836613d16ac

reorg! reorg!
author rick@minifunk
date Tue, 12 Aug 2008 16:59:56 -0400
parents
children
comparison
equal deleted inserted replaced
10:e75a2e506b1d 11:5836613d16ac
1 /* #line 1 "http11_parser.rl" */
2 /**
3 * Copyright (c) 2005 Zed A. Shaw,
4 * Modified for D/DReactor by Rick Richardson, 2008
5 * You can redistribute it and/or modify it under the same terms as Ruby.
6 */
7
8 alias void delegate (void *data, const char *at, size_t length) element_cb;
9 alias void delegate (void *data, const char *field, size_t flen, const char *value, size_t vlen) field_cb;
10
11 class Http11Parser
12 {
13 int cs;
14 size_t body_start;
15 int content_len;
16 size_t nread;
17 size_t mark;
18 size_t field_start;
19 size_t field_len;
20 size_t query_start;
21
22 void *data;
23
24 field_cb http_field;
25 element_cb request_method;
26 element_cb request_uri;
27 element_cb fragment;
28 element_cb request_path;
29 element_cb query_string;
30 element_cb http_version;
31 element_cb header_done;
32
33 /*
34 * capitalizes all lower-case ASCII characters,
35 * converts dashes to underscores.
36 */
37 private void snake_upcase_char(char *c)
38 {
39 if (*c >= 'a' && *c <= 'z')
40 *c &= ~0x20;
41 else if (*c == '-')
42 *c = '_';
43 }
44
45 //#define LEN(AT, FPC) (FPC - buffer - parser->AT)
46 private int LEN(char* at, char* fpc)
47 {
48 return (fpc - buffer.ptr - at);
49 }
50
51 //#define MARK(M,FPC) (parser->M = (FPC) - buffer)
52 private void MARK(size_t* item, char* fpc)
53 {
54 *item = fpc - buffer.ptr;
55 }
56
57 //#define PTR_TO(F) (buffer + parser->F)
58 private char* PTR_TO(size_t F)
59 {
60 return (buffer.ptr + F);
61 }
62 /** Machine **/
63
64 /* #line 126 "http11_parser.rl" */
65
66
67 /** Data **/
68
69 /* #line 70 "Http11Parser.d" */
70 static const int http_parser_start = 1;
71 static const int http_parser_first_final = 57;
72 static const int http_parser_error = 0;
73
74 static const int http_parser_en_main = 1;
75
76 /* #line 130 "http11_parser.rl" */
77
78 this ()
79 {
80 cs = 0;
81
82 /* #line 83 "Http11Parser.d" */
83 {
84 cs = http_parser_start;
85 }
86 /* #line 135 "http11_parser.rl" */
87
88 body_start = 0;
89 content_len = 0;
90 mark = 0;
91 nread = 0;
92 field_len = 0;
93 field_start = 0;
94 }
95
96
97 /** exec **/
98 size_t execute(const char[] buffer, size_t off) {
99 const char *p, *pe;
100 int len = buffer.length;
101
102 assert(off <= len && "offset past end of buffer");
103
104 p = buffer.ptr+off;
105 pe = buffer.ptr+len;
106
107 /* assert(*pe == '\0' && "pointer does not end on NUL"); */
108 assert(pe - p == len - off && "pointers aren't same distance");
109
110
111 /* #line 112 "Http11Parser.d" */
112 {
113 if ( p == pe )
114 goto _out;
115 switch ( cs )
116 {
117 case 1:
118 switch( (*p) ) {
119 case 36u: goto tr0;
120 case 95u: goto tr0;
121 default: break;
122 }
123 if ( (*p) < 48u ) {
124 if ( 45u <= (*p) && (*p) <= 46u )
125 goto tr0;
126 } else if ( (*p) > 57u ) {
127 if ( 65u <= (*p) && (*p) <= 90u )
128 goto tr0;
129 } else
130 goto tr0;
131 goto st0;
132 st0:
133 goto _out0;
134 tr0:
135 /* #line 67 "http11_parser.rl" */
136 {MARK(mark, p); }
137 goto st2;
138 st2:
139 if ( ++p == pe )
140 goto _out2;
141 case 2:
142 /* #line 143 "Http11Parser.d" */
143 switch( (*p) ) {
144 case 32u: goto tr2;
145 case 36u: goto st38;
146 case 95u: goto st38;
147 default: break;
148 }
149 if ( (*p) < 48u ) {
150 if ( 45u <= (*p) && (*p) <= 46u )
151 goto st38;
152 } else if ( (*p) > 57u ) {
153 if ( 65u <= (*p) && (*p) <= 90u )
154 goto st38;
155 } else
156 goto st38;
157 goto st0;
158 tr2:
159 /* #line 85 "http11_parser.rl" */
160 {
161 if(request_method)
162 request_method(data, PTR_TO(mark), LEN(mark, p));
163 }
164 goto st3;
165 st3:
166 if ( ++p == pe )
167 goto _out3;
168 case 3:
169 /* #line 170 "Http11Parser.d" */
170 switch( (*p) ) {
171 case 42u: goto tr4;
172 case 43u: goto tr5;
173 case 47u: goto tr6;
174 case 58u: goto tr7;
175 default: break;
176 }
177 if ( (*p) < 65u ) {
178 if ( 45u <= (*p) && (*p) <= 57u )
179 goto tr5;
180 } else if ( (*p) > 90u ) {
181 if ( 97u <= (*p) && (*p) <= 122u )
182 goto tr5;
183 } else
184 goto tr5;
185 goto st0;
186 tr4:
187 /* #line 67 "http11_parser.rl" */
188 {MARK(mark, p); }
189 goto st4;
190 st4:
191 if ( ++p == pe )
192 goto _out4;
193 case 4:
194 /* #line 195 "Http11Parser.d" */
195 switch( (*p) ) {
196 case 32u: goto tr8;
197 case 35u: goto tr9;
198 default: break;
199 }
200 goto st0;
201 tr8:
202 /* #line 90 "http11_parser.rl" */
203 {
204 if(request_uri)
205 request_uri(data, PTR_TO(mark), LEN(mark, p));
206 }
207 goto st5;
208 tr29:
209 /* #line 95 "http11_parser.rl" */
210 {
211 if(fragment)
212 fragment(data, PTR_TO(mark), LEN(mark, p));
213 }
214 goto st5;
215 tr39:
216 /* #line 112 "http11_parser.rl" */
217 {
218 if(request_path)
219 request_path(data, PTR_TO(mark), LEN(mark,p));
220 }
221 /* #line 90 "http11_parser.rl" */
222 {
223 if(request_uri)
224 request_uri(data, PTR_TO(mark), LEN(mark, p));
225 }
226 goto st5;
227 tr50:
228 /* #line 100 "http11_parser.rl" */
229 {MARK(query_start, p); }
230 /* #line 102 "http11_parser.rl" */
231 {
232 if(query_string)
233 query_string(data, PTR_TO(query_start), LEN(query_start, p));
234 }
235 /* #line 90 "http11_parser.rl" */
236 {
237 if(request_uri)
238 request_uri(data, PTR_TO(mark), LEN(mark, p));
239 }
240 goto st5;
241 tr54:
242 /* #line 102 "http11_parser.rl" */
243 {
244 if(query_string)
245 query_string(data, PTR_TO(query_start), LEN(query_start, p));
246 }
247 /* #line 90 "http11_parser.rl" */
248 {
249 if(request_uri)
250 request_uri(data, PTR_TO(mark), LEN(mark, p));
251 }
252 goto st5;
253 st5:
254 if ( ++p == pe )
255 goto _out5;
256 case 5:
257 /* #line 258 "Http11Parser.d" */
258 if ( (*p) == 72u )
259 goto tr10;
260 goto st0;
261 tr10:
262 /* #line 67 "http11_parser.rl" */
263 {MARK(mark, p); }
264 goto st6;
265 st6:
266 if ( ++p == pe )
267 goto _out6;
268 case 6:
269 /* #line 270 "Http11Parser.d" */
270 if ( (*p) == 84u )
271 goto st7;
272 goto st0;
273 st7:
274 if ( ++p == pe )
275 goto _out7;
276 case 7:
277 if ( (*p) == 84u )
278 goto st8;
279 goto st0;
280 st8:
281 if ( ++p == pe )
282 goto _out8;
283 case 8:
284 if ( (*p) == 80u )
285 goto st9;
286 goto st0;
287 st9:
288 if ( ++p == pe )
289 goto _out9;
290 case 9:
291 if ( (*p) == 47u )
292 goto st10;
293 goto st0;
294 st10:
295 if ( ++p == pe )
296 goto _out10;
297 case 10:
298 if ( 48u <= (*p) && (*p) <= 57u )
299 goto st11;
300 goto st0;
301 st11:
302 if ( ++p == pe )
303 goto _out11;
304 case 11:
305 if ( (*p) == 46u )
306 goto st12;
307 if ( 48u <= (*p) && (*p) <= 57u )
308 goto st11;
309 goto st0;
310 st12:
311 if ( ++p == pe )
312 goto _out12;
313 case 12:
314 if ( 48u <= (*p) && (*p) <= 57u )
315 goto st13;
316 goto st0;
317 st13:
318 if ( ++p == pe )
319 goto _out13;
320 case 13:
321 if ( (*p) == 13u )
322 goto tr18;
323 if ( 48u <= (*p) && (*p) <= 57u )
324 goto st13;
325 goto st0;
326 tr18:
327 /* #line 107 "http11_parser.rl" */
328 {
329 if(http_version)
330 http_version(data, PTR_TO(mark), LEN(mark, p));
331 }
332 goto st14;
333 tr26:
334 /* #line 77 "http11_parser.rl" */
335 {
336 if(http_field)
337 http_field(data,
338 PTR_TO(field_start),
339 field_len,
340 PTR_TO(mark),
341 LEN(mark, p));
342 }
343 goto st14;
344 st14:
345 if ( ++p == pe )
346 goto _out14;
347 case 14:
348 /* #line 349 "Http11Parser.d" */
349 if ( (*p) == 10u )
350 goto st15;
351 goto st0;
352 st15:
353 if ( ++p == pe )
354 goto _out15;
355 case 15:
356 switch( (*p) ) {
357 case 13u: goto st16;
358 case 33u: goto tr21;
359 case 124u: goto tr21;
360 case 126u: goto tr21;
361 default: break;
362 }
363 if ( (*p) < 45u ) {
364 if ( (*p) > 39u ) {
365 if ( 42u <= (*p) && (*p) <= 43u )
366 goto tr21;
367 } else if ( (*p) >= 35u )
368 goto tr21;
369 } else if ( (*p) > 46u ) {
370 if ( (*p) < 65u ) {
371 if ( 48u <= (*p) && (*p) <= 57u )
372 goto tr21;
373 } else if ( (*p) > 90u ) {
374 if ( 94u <= (*p) && (*p) <= 122u )
375 goto tr21;
376 } else
377 goto tr21;
378 } else
379 goto tr21;
380 goto st0;
381 st16:
382 if ( ++p == pe )
383 goto _out16;
384 case 16:
385 if ( (*p) == 10u )
386 goto tr22;
387 goto st0;
388 tr22:
389 /* #line 117 "http11_parser.rl" */
390 {
391 body_start = p - buffer + 1;
392 if(header_done)
393 header_done(data, p + 1, pe - p - 1);
394 if (true) goto _out57;
395 }
396 goto st57;
397 st57:
398 if ( ++p == pe )
399 goto _out57;
400 case 57:
401 /* #line 402 "Http11Parser.d" */
402 goto st0;
403 tr21:
404 /* #line 70 "http11_parser.rl" */
405 { MARK(field_start, p); }
406 /* #line 71 "http11_parser.rl" */
407 { snake_upcase_char((char *)p); }
408 goto st17;
409 tr23:
410 /* #line 71 "http11_parser.rl" */
411 { snake_upcase_char((char *)p); }
412 goto st17;
413 st17:
414 if ( ++p == pe )
415 goto _out17;
416 case 17:
417 /* #line 418 "Http11Parser.d" */
418 switch( (*p) ) {
419 case 33u: goto tr23;
420 case 58u: goto tr24;
421 case 124u: goto tr23;
422 case 126u: goto tr23;
423 default: break;
424 }
425 if ( (*p) < 45u ) {
426 if ( (*p) > 39u ) {
427 if ( 42u <= (*p) && (*p) <= 43u )
428 goto tr23;
429 } else if ( (*p) >= 35u )
430 goto tr23;
431 } else if ( (*p) > 46u ) {
432 if ( (*p) < 65u ) {
433 if ( 48u <= (*p) && (*p) <= 57u )
434 goto tr23;
435 } else if ( (*p) > 90u ) {
436 if ( 94u <= (*p) && (*p) <= 122u )
437 goto tr23;
438 } else
439 goto tr23;
440 } else
441 goto tr23;
442 goto st0;
443 tr24:
444 /* #line 72 "http11_parser.rl" */
445 {
446 field_len = LEN(field_start, p);
447 }
448 goto st18;
449 tr27:
450 /* #line 76 "http11_parser.rl" */
451 { MARK(mark, p); }
452 goto st18;
453 st18:
454 if ( ++p == pe )
455 goto _out18;
456 case 18:
457 /* #line 458 "Http11Parser.d" */
458 switch( (*p) ) {
459 case 13u: goto tr26;
460 case 32u: goto tr27;
461 default: break;
462 }
463 goto tr25;
464 tr25:
465 /* #line 76 "http11_parser.rl" */
466 { MARK(mark, p); }
467 goto st19;
468 st19:
469 if ( ++p == pe )
470 goto _out19;
471 case 19:
472 /* #line 473 "Http11Parser.d" */
473 if ( (*p) == 13u )
474 goto tr26;
475 goto st19;
476 tr9:
477 /* #line 90 "http11_parser.rl" */
478 {
479 if(request_uri)
480 request_uri(data, PTR_TO(mark), LEN(mark, p));
481 }
482 goto st20;
483 tr41:
484 /* #line 112 "http11_parser.rl" */
485 {
486 if(request_path)
487 request_path(data, PTR_TO(mark), LEN(mark,p));
488 }
489 /* #line 90 "http11_parser.rl" */
490 {
491 if(request_uri)
492 request_uri(data, PTR_TO(mark), LEN(mark, p));
493 }
494 goto st20;
495 tr52:
496 /* #line 100 "http11_parser.rl" */
497 {MARK(query_start, p); }
498 /* #line 102 "http11_parser.rl" */
499 {
500 if(query_string)
501 query_string(data, PTR_TO(query_start), LEN(query_start, p));
502 }
503 /* #line 90 "http11_parser.rl" */
504 {
505 if(request_uri)
506 request_uri(data, PTR_TO(mark), LEN(mark, p));
507 }
508 goto st20;
509 tr56:
510 /* #line 102 "http11_parser.rl" */
511 {
512 if(query_string)
513 query_string(data, PTR_TO(query_start), LEN(query_start, p));
514 }
515 /* #line 90 "http11_parser.rl" */
516 {
517 if(request_uri)
518 request_uri(data, PTR_TO(mark), LEN(mark, p));
519 }
520 goto st20;
521 st20:
522 if ( ++p == pe )
523 goto _out20;
524 case 20:
525 /* #line 526 "Http11Parser.d" */
526 switch( (*p) ) {
527 case 32u: goto tr29;
528 case 37u: goto tr31;
529 case 60u: goto st0;
530 case 62u: goto st0;
531 case 127u: goto st0;
532 default: break;
533 }
534 if ( (*p) > 31u ) {
535 if ( 34u <= (*p) && (*p) <= 35u )
536 goto st0;
537 } else
538 goto st0;
539 goto tr30;
540 tr30:
541 /* #line 67 "http11_parser.rl" */
542 {MARK(mark, p); }
543 goto st21;
544 st21:
545 if ( ++p == pe )
546 goto _out21;
547 case 21:
548 /* #line 549 "Http11Parser.d" */
549 switch( (*p) ) {
550 case 32u: goto tr29;
551 case 37u: goto st22;
552 case 60u: goto st0;
553 case 62u: goto st0;
554 case 127u: goto st0;
555 default: break;
556 }
557 if ( (*p) > 31u ) {
558 if ( 34u <= (*p) && (*p) <= 35u )
559 goto st0;
560 } else
561 goto st0;
562 goto st21;
563 tr31:
564 /* #line 67 "http11_parser.rl" */
565 {MARK(mark, p); }
566 goto st22;
567 st22:
568 if ( ++p == pe )
569 goto _out22;
570 case 22:
571 /* #line 572 "Http11Parser.d" */
572 if ( (*p) < 65u ) {
573 if ( 48u <= (*p) && (*p) <= 57u )
574 goto st23;
575 } else if ( (*p) > 70u ) {
576 if ( 97u <= (*p) && (*p) <= 102u )
577 goto st23;
578 } else
579 goto st23;
580 goto st0;
581 st23:
582 if ( ++p == pe )
583 goto _out23;
584 case 23:
585 if ( (*p) < 65u ) {
586 if ( 48u <= (*p) && (*p) <= 57u )
587 goto st21;
588 } else if ( (*p) > 70u ) {
589 if ( 97u <= (*p) && (*p) <= 102u )
590 goto st21;
591 } else
592 goto st21;
593 goto st0;
594 tr5:
595 /* #line 67 "http11_parser.rl" */
596 {MARK(mark, p); }
597 goto st24;
598 st24:
599 if ( ++p == pe )
600 goto _out24;
601 case 24:
602 /* #line 603 "Http11Parser.d" */
603 switch( (*p) ) {
604 case 43u: goto st24;
605 case 58u: goto st25;
606 default: break;
607 }
608 if ( (*p) < 48u ) {
609 if ( 45u <= (*p) && (*p) <= 46u )
610 goto st24;
611 } else if ( (*p) > 57u ) {
612 if ( (*p) > 90u ) {
613 if ( 97u <= (*p) && (*p) <= 122u )
614 goto st24;
615 } else if ( (*p) >= 65u )
616 goto st24;
617 } else
618 goto st24;
619 goto st0;
620 tr7:
621 /* #line 67 "http11_parser.rl" */
622 {MARK(mark, p); }
623 goto st25;
624 st25:
625 if ( ++p == pe )
626 goto _out25;
627 case 25:
628 /* #line 629 "Http11Parser.d" */
629 switch( (*p) ) {
630 case 32u: goto tr8;
631 case 34u: goto st0;
632 case 35u: goto tr9;
633 case 37u: goto st26;
634 case 60u: goto st0;
635 case 62u: goto st0;
636 case 127u: goto st0;
637 default: break;
638 }
639 if ( (*p) <= 31u )
640 goto st0;
641 goto st25;
642 st26:
643 if ( ++p == pe )
644 goto _out26;
645 case 26:
646 if ( (*p) < 65u ) {
647 if ( 48u <= (*p) && (*p) <= 57u )
648 goto st27;
649 } else if ( (*p) > 70u ) {
650 if ( 97u <= (*p) && (*p) <= 102u )
651 goto st27;
652 } else
653 goto st27;
654 goto st0;
655 st27:
656 if ( ++p == pe )
657 goto _out27;
658 case 27:
659 if ( (*p) < 65u ) {
660 if ( 48u <= (*p) && (*p) <= 57u )
661 goto st25;
662 } else if ( (*p) > 70u ) {
663 if ( 97u <= (*p) && (*p) <= 102u )
664 goto st25;
665 } else
666 goto st25;
667 goto st0;
668 tr6:
669 /* #line 67 "http11_parser.rl" */
670 {MARK(mark, p); }
671 goto st28;
672 st28:
673 if ( ++p == pe )
674 goto _out28;
675 case 28:
676 /* #line 677 "Http11Parser.d" */
677 switch( (*p) ) {
678 case 32u: goto tr39;
679 case 34u: goto st0;
680 case 35u: goto tr41;
681 case 37u: goto st29;
682 case 59u: goto tr43;
683 case 60u: goto st0;
684 case 62u: goto st0;
685 case 63u: goto tr44;
686 case 127u: goto st0;
687 default: break;
688 }
689 if ( (*p) <= 31u )
690 goto st0;
691 goto st28;
692 st29:
693 if ( ++p == pe )
694 goto _out29;
695 case 29:
696 if ( (*p) < 65u ) {
697 if ( 48u <= (*p) && (*p) <= 57u )
698 goto st30;
699 } else if ( (*p) > 70u ) {
700 if ( 97u <= (*p) && (*p) <= 102u )
701 goto st30;
702 } else
703 goto st30;
704 goto st0;
705 st30:
706 if ( ++p == pe )
707 goto _out30;
708 case 30:
709 if ( (*p) < 65u ) {
710 if ( 48u <= (*p) && (*p) <= 57u )
711 goto st28;
712 } else if ( (*p) > 70u ) {
713 if ( 97u <= (*p) && (*p) <= 102u )
714 goto st28;
715 } else
716 goto st28;
717 goto st0;
718 tr43:
719 /* #line 112 "http11_parser.rl" */
720 {
721 if(request_path)
722 request_path(data, PTR_TO(mark), LEN(mark,p));
723 }
724 goto st31;
725 st31:
726 if ( ++p == pe )
727 goto _out31;
728 case 31:
729 /* #line 730 "Http11Parser.d" */
730 switch( (*p) ) {
731 case 32u: goto tr8;
732 case 34u: goto st0;
733 case 35u: goto tr9;
734 case 37u: goto st32;
735 case 60u: goto st0;
736 case 62u: goto st0;
737 case 63u: goto st34;
738 case 127u: goto st0;
739 default: break;
740 }
741 if ( (*p) <= 31u )
742 goto st0;
743 goto st31;
744 st32:
745 if ( ++p == pe )
746 goto _out32;
747 case 32:
748 if ( (*p) < 65u ) {
749 if ( 48u <= (*p) && (*p) <= 57u )
750 goto st33;
751 } else if ( (*p) > 70u ) {
752 if ( 97u <= (*p) && (*p) <= 102u )
753 goto st33;
754 } else
755 goto st33;
756 goto st0;
757 st33:
758 if ( ++p == pe )
759 goto _out33;
760 case 33:
761 if ( (*p) < 65u ) {
762 if ( 48u <= (*p) && (*p) <= 57u )
763 goto st31;
764 } else if ( (*p) > 70u ) {
765 if ( 97u <= (*p) && (*p) <= 102u )
766 goto st31;
767 } else
768 goto st31;
769 goto st0;
770 tr44:
771 /* #line 112 "http11_parser.rl" */
772 {
773 if(request_path)
774 request_path(data, PTR_TO(mark), LEN(mark,p));
775 }
776 goto st34;
777 st34:
778 if ( ++p == pe )
779 goto _out34;
780 case 34:
781 /* #line 782 "Http11Parser.d" */
782 switch( (*p) ) {
783 case 32u: goto tr50;
784 case 34u: goto st0;
785 case 35u: goto tr52;
786 case 37u: goto tr53;
787 case 60u: goto st0;
788 case 62u: goto st0;
789 case 127u: goto st0;
790 default: break;
791 }
792 if ( (*p) <= 31u )
793 goto st0;
794 goto tr51;
795 tr51:
796 /* #line 100 "http11_parser.rl" */
797 {MARK(query_start, p); }
798 goto st35;
799 st35:
800 if ( ++p == pe )
801 goto _out35;
802 case 35:
803 /* #line 804 "Http11Parser.d" */
804 switch( (*p) ) {
805 case 32u: goto tr54;
806 case 34u: goto st0;
807 case 35u: goto tr56;
808 case 37u: goto st36;
809 case 60u: goto st0;
810 case 62u: goto st0;
811 case 127u: goto st0;
812 default: break;
813 }
814 if ( (*p) <= 31u )
815 goto st0;
816 goto st35;
817 tr53:
818 /* #line 100 "http11_parser.rl" */
819 {MARK(query_start, p); }
820 goto st36;
821 st36:
822 if ( ++p == pe )
823 goto _out36;
824 case 36:
825 /* #line 826 "Http11Parser.d" */
826 if ( (*p) < 65u ) {
827 if ( 48u <= (*p) && (*p) <= 57u )
828 goto st37;
829 } else if ( (*p) > 70u ) {
830 if ( 97u <= (*p) && (*p) <= 102u )
831 goto st37;
832 } else
833 goto st37;
834 goto st0;
835 st37:
836 if ( ++p == pe )
837 goto _out37;
838 case 37:
839 if ( (*p) < 65u ) {
840 if ( 48u <= (*p) && (*p) <= 57u )
841 goto st35;
842 } else if ( (*p) > 70u ) {
843 if ( 97u <= (*p) && (*p) <= 102u )
844 goto st35;
845 } else
846 goto st35;
847 goto st0;
848 st38:
849 if ( ++p == pe )
850 goto _out38;
851 case 38:
852 switch( (*p) ) {
853 case 32u: goto tr2;
854 case 36u: goto st39;
855 case 95u: goto st39;
856 default: break;
857 }
858 if ( (*p) < 48u ) {
859 if ( 45u <= (*p) && (*p) <= 46u )
860 goto st39;
861 } else if ( (*p) > 57u ) {
862 if ( 65u <= (*p) && (*p) <= 90u )
863 goto st39;
864 } else
865 goto st39;
866 goto st0;
867 st39:
868 if ( ++p == pe )
869 goto _out39;
870 case 39:
871 switch( (*p) ) {
872 case 32u: goto tr2;
873 case 36u: goto st40;
874 case 95u: goto st40;
875 default: break;
876 }
877 if ( (*p) < 48u ) {
878 if ( 45u <= (*p) && (*p) <= 46u )
879 goto st40;
880 } else if ( (*p) > 57u ) {
881 if ( 65u <= (*p) && (*p) <= 90u )
882 goto st40;
883 } else
884 goto st40;
885 goto st0;
886 st40:
887 if ( ++p == pe )
888 goto _out40;
889 case 40:
890 switch( (*p) ) {
891 case 32u: goto tr2;
892 case 36u: goto st41;
893 case 95u: goto st41;
894 default: break;
895 }
896 if ( (*p) < 48u ) {
897 if ( 45u <= (*p) && (*p) <= 46u )
898 goto st41;
899 } else if ( (*p) > 57u ) {
900 if ( 65u <= (*p) && (*p) <= 90u )
901 goto st41;
902 } else
903 goto st41;
904 goto st0;
905 st41:
906 if ( ++p == pe )
907 goto _out41;
908 case 41:
909 switch( (*p) ) {
910 case 32u: goto tr2;
911 case 36u: goto st42;
912 case 95u: goto st42;
913 default: break;
914 }
915 if ( (*p) < 48u ) {
916 if ( 45u <= (*p) && (*p) <= 46u )
917 goto st42;
918 } else if ( (*p) > 57u ) {
919 if ( 65u <= (*p) && (*p) <= 90u )
920 goto st42;
921 } else
922 goto st42;
923 goto st0;
924 st42:
925 if ( ++p == pe )
926 goto _out42;
927 case 42:
928 switch( (*p) ) {
929 case 32u: goto tr2;
930 case 36u: goto st43;
931 case 95u: goto st43;
932 default: break;
933 }
934 if ( (*p) < 48u ) {
935 if ( 45u <= (*p) && (*p) <= 46u )
936 goto st43;
937 } else if ( (*p) > 57u ) {
938 if ( 65u <= (*p) && (*p) <= 90u )
939 goto st43;
940 } else
941 goto st43;
942 goto st0;
943 st43:
944 if ( ++p == pe )
945 goto _out43;
946 case 43:
947 switch( (*p) ) {
948 case 32u: goto tr2;
949 case 36u: goto st44;
950 case 95u: goto st44;
951 default: break;
952 }
953 if ( (*p) < 48u ) {
954 if ( 45u <= (*p) && (*p) <= 46u )
955 goto st44;
956 } else if ( (*p) > 57u ) {
957 if ( 65u <= (*p) && (*p) <= 90u )
958 goto st44;
959 } else
960 goto st44;
961 goto st0;
962 st44:
963 if ( ++p == pe )
964 goto _out44;
965 case 44:
966 switch( (*p) ) {
967 case 32u: goto tr2;
968 case 36u: goto st45;
969 case 95u: goto st45;
970 default: break;
971 }
972 if ( (*p) < 48u ) {
973 if ( 45u <= (*p) && (*p) <= 46u )
974 goto st45;
975 } else if ( (*p) > 57u ) {
976 if ( 65u <= (*p) && (*p) <= 90u )
977 goto st45;
978 } else
979 goto st45;
980 goto st0;
981 st45:
982 if ( ++p == pe )
983 goto _out45;
984 case 45:
985 switch( (*p) ) {
986 case 32u: goto tr2;
987 case 36u: goto st46;
988 case 95u: goto st46;
989 default: break;
990 }
991 if ( (*p) < 48u ) {
992 if ( 45u <= (*p) && (*p) <= 46u )
993 goto st46;
994 } else if ( (*p) > 57u ) {
995 if ( 65u <= (*p) && (*p) <= 90u )
996 goto st46;
997 } else
998 goto st46;
999 goto st0;
1000 st46:
1001 if ( ++p == pe )
1002 goto _out46;
1003 case 46:
1004 switch( (*p) ) {
1005 case 32u: goto tr2;
1006 case 36u: goto st47;
1007 case 95u: goto st47;
1008 default: break;
1009 }
1010 if ( (*p) < 48u ) {
1011 if ( 45u <= (*p) && (*p) <= 46u )
1012 goto st47;
1013 } else if ( (*p) > 57u ) {
1014 if ( 65u <= (*p) && (*p) <= 90u )
1015 goto st47;
1016 } else
1017 goto st47;
1018 goto st0;
1019 st47:
1020 if ( ++p == pe )
1021 goto _out47;
1022 case 47:
1023 switch( (*p) ) {
1024 case 32u: goto tr2;
1025 case 36u: goto st48;
1026 case 95u: goto st48;
1027 default: break;
1028 }
1029 if ( (*p) < 48u ) {
1030 if ( 45u <= (*p) && (*p) <= 46u )
1031 goto st48;
1032 } else if ( (*p) > 57u ) {
1033 if ( 65u <= (*p) && (*p) <= 90u )
1034 goto st48;
1035 } else
1036 goto st48;
1037 goto st0;
1038 st48:
1039 if ( ++p == pe )
1040 goto _out48;
1041 case 48:
1042 switch( (*p) ) {
1043 case 32u: goto tr2;
1044 case 36u: goto st49;
1045 case 95u: goto st49;
1046 default: break;
1047 }
1048 if ( (*p) < 48u ) {
1049 if ( 45u <= (*p) && (*p) <= 46u )
1050 goto st49;
1051 } else if ( (*p) > 57u ) {
1052 if ( 65u <= (*p) && (*p) <= 90u )
1053 goto st49;
1054 } else
1055 goto st49;
1056 goto st0;
1057 st49:
1058 if ( ++p == pe )
1059 goto _out49;
1060 case 49:
1061 switch( (*p) ) {
1062 case 32u: goto tr2;
1063 case 36u: goto st50;
1064 case 95u: goto st50;
1065 default: break;
1066 }
1067 if ( (*p) < 48u ) {
1068 if ( 45u <= (*p) && (*p) <= 46u )
1069 goto st50;
1070 } else if ( (*p) > 57u ) {
1071 if ( 65u <= (*p) && (*p) <= 90u )
1072 goto st50;
1073 } else
1074 goto st50;
1075 goto st0;
1076 st50:
1077 if ( ++p == pe )
1078 goto _out50;
1079 case 50:
1080 switch( (*p) ) {
1081 case 32u: goto tr2;
1082 case 36u: goto st51;
1083 case 95u: goto st51;
1084 default: break;
1085 }
1086 if ( (*p) < 48u ) {
1087 if ( 45u <= (*p) && (*p) <= 46u )
1088 goto st51;
1089 } else if ( (*p) > 57u ) {
1090 if ( 65u <= (*p) && (*p) <= 90u )
1091 goto st51;
1092 } else
1093 goto st51;
1094 goto st0;
1095 st51:
1096 if ( ++p == pe )
1097 goto _out51;
1098 case 51:
1099 switch( (*p) ) {
1100 case 32u: goto tr2;
1101 case 36u: goto st52;
1102 case 95u: goto st52;
1103 default: break;
1104 }
1105 if ( (*p) < 48u ) {
1106 if ( 45u <= (*p) && (*p) <= 46u )
1107 goto st52;
1108 } else if ( (*p) > 57u ) {
1109 if ( 65u <= (*p) && (*p) <= 90u )
1110 goto st52;
1111 } else
1112 goto st52;
1113 goto st0;
1114 st52:
1115 if ( ++p == pe )
1116 goto _out52;
1117 case 52:
1118 switch( (*p) ) {
1119 case 32u: goto tr2;
1120 case 36u: goto st53;
1121 case 95u: goto st53;
1122 default: break;
1123 }
1124 if ( (*p) < 48u ) {
1125 if ( 45u <= (*p) && (*p) <= 46u )
1126 goto st53;
1127 } else if ( (*p) > 57u ) {
1128 if ( 65u <= (*p) && (*p) <= 90u )
1129 goto st53;
1130 } else
1131 goto st53;
1132 goto st0;
1133 st53:
1134 if ( ++p == pe )
1135 goto _out53;
1136 case 53:
1137 switch( (*p) ) {
1138 case 32u: goto tr2;
1139 case 36u: goto st54;
1140 case 95u: goto st54;
1141 default: break;
1142 }
1143 if ( (*p) < 48u ) {
1144 if ( 45u <= (*p) && (*p) <= 46u )
1145 goto st54;
1146 } else if ( (*p) > 57u ) {
1147 if ( 65u <= (*p) && (*p) <= 90u )
1148 goto st54;
1149 } else
1150 goto st54;
1151 goto st0;
1152 st54:
1153 if ( ++p == pe )
1154 goto _out54;
1155 case 54:
1156 switch( (*p) ) {
1157 case 32u: goto tr2;
1158 case 36u: goto st55;
1159 case 95u: goto st55;
1160 default: break;
1161 }
1162 if ( (*p) < 48u ) {
1163 if ( 45u <= (*p) && (*p) <= 46u )
1164 goto st55;
1165 } else if ( (*p) > 57u ) {
1166 if ( 65u <= (*p) && (*p) <= 90u )
1167 goto st55;
1168 } else
1169 goto st55;
1170 goto st0;
1171 st55:
1172 if ( ++p == pe )
1173 goto _out55;
1174 case 55:
1175 switch( (*p) ) {
1176 case 32u: goto tr2;
1177 case 36u: goto st56;
1178 case 95u: goto st56;
1179 default: break;
1180 }
1181 if ( (*p) < 48u ) {
1182 if ( 45u <= (*p) && (*p) <= 46u )
1183 goto st56;
1184 } else if ( (*p) > 57u ) {
1185 if ( 65u <= (*p) && (*p) <= 90u )
1186 goto st56;
1187 } else
1188 goto st56;
1189 goto st0;
1190 st56:
1191 if ( ++p == pe )
1192 goto _out56;
1193 case 56:
1194 if ( (*p) == 32u )
1195 goto tr2;
1196 goto st0;
1197 default: break;
1198 }
1199 _out0: cs = 0; goto _out;
1200 _out2: cs = 2; goto _out;
1201 _out3: cs = 3; goto _out;
1202 _out4: cs = 4; goto _out;
1203 _out5: cs = 5; goto _out;
1204 _out6: cs = 6; goto _out;
1205 _out7: cs = 7; goto _out;
1206 _out8: cs = 8; goto _out;
1207 _out9: cs = 9; goto _out;
1208 _out10: cs = 10; goto _out;
1209 _out11: cs = 11; goto _out;
1210 _out12: cs = 12; goto _out;
1211 _out13: cs = 13; goto _out;
1212 _out14: cs = 14; goto _out;
1213 _out15: cs = 15; goto _out;
1214 _out16: cs = 16; goto _out;
1215 _out57: cs = 57; goto _out;
1216 _out17: cs = 17; goto _out;
1217 _out18: cs = 18; goto _out;
1218 _out19: cs = 19; goto _out;
1219 _out20: cs = 20; goto _out;
1220 _out21: cs = 21; goto _out;
1221 _out22: cs = 22; goto _out;
1222 _out23: cs = 23; goto _out;
1223 _out24: cs = 24; goto _out;
1224 _out25: cs = 25; goto _out;
1225 _out26: cs = 26; goto _out;
1226 _out27: cs = 27; goto _out;
1227 _out28: cs = 28; goto _out;
1228 _out29: cs = 29; goto _out;
1229 _out30: cs = 30; goto _out;
1230 _out31: cs = 31; goto _out;
1231 _out32: cs = 32; goto _out;
1232 _out33: cs = 33; goto _out;
1233 _out34: cs = 34; goto _out;
1234 _out35: cs = 35; goto _out;
1235 _out36: cs = 36; goto _out;
1236 _out37: cs = 37; goto _out;
1237 _out38: cs = 38; goto _out;
1238 _out39: cs = 39; goto _out;
1239 _out40: cs = 40; goto _out;
1240 _out41: cs = 41; goto _out;
1241 _out42: cs = 42; goto _out;
1242 _out43: cs = 43; goto _out;
1243 _out44: cs = 44; goto _out;
1244 _out45: cs = 45; goto _out;
1245 _out46: cs = 46; goto _out;
1246 _out47: cs = 47; goto _out;
1247 _out48: cs = 48; goto _out;
1248 _out49: cs = 49; goto _out;
1249 _out50: cs = 50; goto _out;
1250 _out51: cs = 51; goto _out;
1251 _out52: cs = 52; goto _out;
1252 _out53: cs = 53; goto _out;
1253 _out54: cs = 54; goto _out;
1254 _out55: cs = 55; goto _out;
1255 _out56: cs = 56; goto _out;
1256
1257 _out: {}
1258 }
1259 /* #line 159 "http11_parser.rl" */
1260
1261 //parser->cs = cs;
1262 nread += p - (buffer.ptr + off);
1263
1264 assert(p <= pe && "buffer overflow after parsing execute");
1265 assert(nread <= len && "nread longer than length");
1266 assert(body_start <= len && "body starts after buffer end");
1267 assert(mark < len && "mark is after buffer end");
1268 assert(field_len <= len && "field has length longer than whole buffer");
1269 assert(field_start < len && "field starts after buffer end");
1270
1271 return(nread);
1272 }
1273
1274 int finish()
1275 {
1276 if (has_error() ) {
1277 return -1;
1278 } else if (is_finished() ) {
1279 return 1;
1280 } else {
1281 return 0;
1282 }
1283 }
1284
1285 bool has_error() {
1286 return cs == http_parser_error;
1287 }
1288
1289 bool is_finished() {
1290 return cs >= http_parser_first_final;
1291 }
1292
1293 }