Mercurial > projects > dreactor
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 } |