root/tags/rel_1-0-1/ext/http11/http11_parser.c

Revision 335, 20.6 kB (checked in by zedshaw, 2 years ago)

Finally a solution to the damn memory leak. It's a leak in ruby http://pastie.caboo.se/10194 which is fixed with http://pastie.caboo.se/10317

Line 
1 #line 1 "ext/http11/http11_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 "http11_parser.h"
7 #include <stdio.h>
8 #include <assert.h>
9 #include <stdlib.h>
10 #include <ctype.h>
11 #include <string.h>
12
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)
16
17 /** machine **/
18 #line 114 "ext/http11/http11_parser.rl"
19
20
21 /** Data **/
22
23 #line 24 "ext/http11/http11_parser.c"
24 static const int http_parser_start = 0;
25
26 static const int http_parser_first_final = 53;
27
28 static const int http_parser_error = 1;
29
30 #line 118 "ext/http11/http11_parser.rl"
31
32 int http_parser_init(http_parser *parser)  {
33   int cs = 0;
34  
35 #line 36 "ext/http11/http11_parser.c"
36         {
37         cs = http_parser_start;
38         }
39 #line 122 "ext/http11/http11_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;   
47
48   return(1);
49 }
50
51
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;
56
57   assert(off <= len && "offset past end of buffer");
58
59   p = buffer+off;
60   pe = buffer+len;
61
62   assert(*pe == '\0' && "pointer does not end on NUL");
63   assert(pe - p == len - off && "pointers aren't same distance");
64
65
66  
67 #line 68 "ext/http11/http11_parser.c"
68         {
69         if ( p == pe )
70                 goto _out;
71         switch ( cs )
72         {
73 case 0:
74         switch( (*p) ) {
75                 case 36: goto tr14;
76                 case 95: goto tr14;
77         }
78         if ( (*p) < 48 ) {
79                 if ( 45 <= (*p) && (*p) <= 46 )
80                         goto tr14;
81         } else if ( (*p) > 57 ) {
82                 if ( 65 <= (*p) && (*p) <= 90 )
83                         goto tr14;
84         } else
85                 goto tr14;
86         goto st1;
87 st1:
88         goto _out1;
89 tr14:
90 #line 20 "ext/http11/http11_parser.rl"
91         {MARK(mark, p); }
92         goto st2;
93 st2:
94         if ( ++p == pe )
95                 goto _out2;
96 case 2:
97 #line 98 "ext/http11/http11_parser.c"
98         switch( (*p) ) {
99                 case 32: goto tr17;
100                 case 36: goto st34;
101                 case 95: goto st34;
102         }
103         if ( (*p) < 48 ) {
104                 if ( 45 <= (*p) && (*p) <= 46 )
105                         goto st34;
106         } else if ( (*p) > 57 ) {
107                 if ( 65 <= (*p) && (*p) <= 90 )
108                         goto st34;
109         } else
110                 goto st34;
111         goto st1;
112 tr17:
113 #line 34 "ext/http11/http11_parser.rl"
114         {
115     if(parser->request_method != NULL)
116       parser->request_method(parser->data, PTR_TO(mark), LEN(mark, p));
117   }
118         goto st3;
119 st3:
120         if ( ++p == pe )
121                 goto _out3;
122 case 3:
123 #line 124 "ext/http11/http11_parser.c"
124         switch( (*p) ) {
125                 case 42: goto tr10;
126                 case 43: goto tr11;
127                 case 47: goto tr12;
128                 case 58: goto tr13;
129         }
130         if ( (*p) < 65 ) {
131                 if ( 45 <= (*p) && (*p) <= 57 )
132                         goto tr11;
133         } else if ( (*p) > 90 ) {
134                 if ( 97 <= (*p) && (*p) <= 122 )
135                         goto tr11;
136         } else
137                 goto tr11;
138         goto st1;
139 tr10:
140 #line 20 "ext/http11/http11_parser.rl"
141         {MARK(mark, p); }
142         goto st4;
143 st4:
144         if ( ++p == pe )
145                 goto _out4;
146 case 4:
147 #line 148 "ext/http11/http11_parser.c"
148         if ( (*p) == 32 )
149                 goto tr19;
150         goto st1;
151 tr19:
152 #line 38 "ext/http11/http11_parser.rl"
153         {
154     if(parser->request_uri != NULL)
155       parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
156   }
157         goto st5;
158 tr28:
159 #line 44 "ext/http11/http11_parser.rl"
160         {
161     if(parser->query_string != NULL)
162       parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p));
163   }
164 #line 38 "ext/http11/http11_parser.rl"
165         {
166     if(parser->request_uri != NULL)
167       parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
168   }
169         goto st5;
170 tr31:
171 #line 54 "ext/http11/http11_parser.rl"
172         {
173     if(parser->request_path != NULL)
174       parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
175   }
176 #line 38 "ext/http11/http11_parser.rl"
177         {
178     if(parser->request_uri != NULL)
179       parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
180   }
181         goto st5;
182 tr40:
183 #line 43 "ext/http11/http11_parser.rl"
184         {MARK(query_start, p); }
185 #line 44 "ext/http11/http11_parser.rl"
186         {
187     if(parser->query_string != NULL)
188       parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p));
189   }
190 #line 38 "ext/http11/http11_parser.rl"
191         {
192     if(parser->request_uri != NULL)
193       parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
194   }
195         goto st5;
196 st5:
197         if ( ++p == pe )
198                 goto _out5;
199 case 5:
200 #line 201 "ext/http11/http11_parser.c"
201         if ( (*p) == 72 )
202                 goto tr3;
203         goto st1;
204 tr3:
205 #line 20 "ext/http11/http11_parser.rl"
206         {MARK(mark, p); }
207         goto st6;
208 st6:
209         if ( ++p == pe )
210                 goto _out6;
211 case 6:
212 #line 213 "ext/http11/http11_parser.c"
213         if ( (*p) == 84 )
214                 goto st7;
215         goto st1;
216 st7:
217         if ( ++p == pe )
218                 goto _out7;
219 case 7:
220         if ( (*p) == 84 )
221                 goto st8;
222         goto st1;
223 st8:
224         if ( ++p == pe )
225                 goto _out8;
226 case 8:
227         if ( (*p) == 80 )
228                 goto st9;
229         goto st1;
230 st9:
231         if ( ++p == pe )
232                 goto _out9;
233 case 9:
234         if ( (*p) == 47 )
235                 goto st10;
236         goto st1;
237 st10:
238         if ( ++p == pe )
239                 goto _out10;
240 case 10:
241         if ( 48 <= (*p) && (*p) <= 57 )
242                 goto st11;
243         goto st1;
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 st1;
253 st12:
254         if ( ++p == pe )
255                 goto _out12;
256 case 12:
257         if ( 48 <= (*p) && (*p) <= 57 )
258                 goto st13;
259         goto st1;
260 st13:
261         if ( ++p == pe )
262                 goto _out13;
263 case 13:
264         if ( (*p) == 13 )
265                 goto tr22;
266         if ( 48 <= (*p) && (*p) <= 57 )
267                 goto st13;
268         goto st1;
269 tr22:
270 #line 49 "ext/http11/http11_parser.rl"
271         {       
272     if(parser->http_version != NULL)
273       parser->http_version(parser->data, PTR_TO(mark), LEN(mark, p));
274   }
275         goto st14;
276 tr36:
277 #line 29 "ext/http11/http11_parser.rl"
278         {
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));
281     }
282   }
283         goto st14;
284 st14:
285         if ( ++p == pe )
286                 goto _out14;
287 case 14:
288 #line 289 "ext/http11/http11_parser.c"
289         if ( (*p) == 10 )
290                 goto st15;
291         goto st1;
292 st15:
293         if ( ++p == pe )
294                 goto _out15;
295 case 15:
296         switch( (*p) ) {
297                 case 13: goto st16;
298                 case 33: goto tr21;
299                 case 124: goto tr21;
300                 case 126: goto tr21;
301         }
302         if ( (*p) < 45 ) {
303                 if ( (*p) > 39 ) {
304                         if ( 42 <= (*p) && (*p) <= 43 )
305                                 goto tr21;
306                 } else if ( (*p) >= 35 )
307                         goto tr21;
308         } else if ( (*p) > 46 ) {
309                 if ( (*p) < 65 ) {
310                         if ( 48 <= (*p) && (*p) <= 57 )
311                                 goto tr21;
312                 } else if ( (*p) > 90 ) {
313                         if ( 94 <= (*p) && (*p) <= 122 )
314                                 goto tr21;
315                 } else
316                         goto tr21;
317         } else
318                 goto tr21;
319         goto st1;
320 st16:
321         if ( ++p == pe )
322                 goto _out16;
323 case 16:
324         if ( (*p) == 10 )
325                 goto tr25;
326         goto st1;
327 tr25:
328 #line 59 "ext/http11/http11_parser.rl"
329         {
330     parser->body_start = p - buffer + 1;
331     if(parser->header_done != NULL)
332       parser->header_done(parser->data, p + 1, pe - p - 1);
333     goto _out53;
334   }
335         goto st53;
336 st53:
337         if ( ++p == pe )
338                 goto _out53;
339 case 53:
340 #line 341 "ext/http11/http11_parser.c"
341         goto st1;
342 tr21:
343 #line 23 "ext/http11/http11_parser.rl"
344         { MARK(field_start, p); }
345         goto st17;
346 st17:
347         if ( ++p == pe )
348                 goto _out17;
349 case 17:
350 #line 351 "ext/http11/http11_parser.c"
351         switch( (*p) ) {
352                 case 33: goto st17;
353                 case 58: goto tr16;
354                 case 124: goto st17;
355                 case 126: goto st17;
356         }
357         if ( (*p) < 45 ) {
358                 if ( (*p) > 39 ) {
359                         if ( 42 <= (*p) && (*p) <= 43 )
360                                 goto st17;
361                 } else if ( (*p) >= 35 )
362                         goto st17;
363         } else if ( (*p) > 46 ) {
364                 if ( (*p) < 65 ) {
365                         if ( 48 <= (*p) && (*p) <= 57 )
366                                 goto st17;
367                 } else if ( (*p) > 90 ) {
368                         if ( 94 <= (*p) && (*p) <= 122 )
369                                 goto st17;
370                 } else
371                         goto st17;
372         } else
373                 goto st17;
374         goto st1;
375 tr16:
376 #line 24 "ext/http11/http11_parser.rl"
377         {
378     parser->field_len = LEN(field_start, p);
379   }
380         goto st18;
381 tr38:
382 #line 28 "ext/http11/http11_parser.rl"
383         { MARK(mark, p); }
384         goto st18;
385 st18:
386         if ( ++p == pe )
387                 goto _out18;
388 case 18:
389 #line 390 "ext/http11/http11_parser.c"
390         switch( (*p) ) {
391                 case 13: goto tr36;
392                 case 32: goto tr38;
393         }
394         goto tr37;
395 tr37:
396 #line 28 "ext/http11/http11_parser.rl"
397         { MARK(mark, p); }
398         goto st19;
399 st19:
400         if ( ++p == pe )
401                 goto _out19;
402 case 19:
403 #line 404 "ext/http11/http11_parser.c"
404         if ( (*p) == 13 )
405                 goto tr36;
406         goto st19;
407 tr11:
408 #line 20 "ext/http11/http11_parser.rl"
409         {MARK(mark, p); }
410         goto st20;
411 st20:
412         if ( ++p == pe )
413                 goto _out20;
414 case 20:
415 #line 416 "ext/http11/http11_parser.c"
416         switch( (*p) ) {
417                 case 43: goto st20;
418                 case 58: goto st21;
419         }
420         if ( (*p) < 48 ) {
421                 if ( 45 <= (*p) && (*p) <= 46 )
422                         goto st20;
423         } else if ( (*p) > 57 ) {
424                 if ( (*p) > 90 ) {
425                         if ( 97 <= (*p) && (*p) <= 122 )
426                                 goto st20;
427                 } else if ( (*p) >= 65 )
428                         goto st20;
429         } else
430                 goto st20;
431         goto st1;
432 tr13:
433 #line 20 "ext/http11/http11_parser.rl"
434         {MARK(mark, p); }
435         goto st21;
436 st21:
437         if ( ++p == pe )
438                 goto _out21;
439 case 21:
440 #line 441 "ext/http11/http11_parser.c"
441         switch( (*p) ) {
442                 case 32: goto tr19;
443                 case 37: goto st22;
444                 case 60: goto st1;
445                 case 62: goto st1;
446                 case 127: goto st1;
447         }
448         if ( (*p) > 31 ) {
449                 if ( 34 <= (*p) && (*p) <= 35 )
450                         goto st1;
451         } else if ( (*p) >= 0 )
452                 goto st1;
453         goto st21;
454 st22:
455         if ( ++p == pe )
456                 goto _out22;
457 case 22:
458         if ( (*p) < 65 ) {
459                 if ( 48 <= (*p) && (*p) <= 57 )
460                         goto st23;
461         } else if ( (*p) > 70 ) {
462                 if ( 97 <= (*p) && (*p) <= 102 )
463                         goto st23;
464         } else
465                 goto st23;
466         goto st1;
467 st23:
468         if ( ++p == pe )
469                 goto _out23;
470 case 23:
471         if ( (*p) < 65 ) {
472                 if ( 48 <= (*p) && (*p) <= 57 )
473                         goto st21;
474         } else if ( (*p) > 70 ) {
475                 if ( 97 <= (*p) && (*p) <= 102 )
476                         goto st21;
477         } else
478                 goto st21;
479         goto st1;
480 tr12:
481 #line 20 "ext/http11/http11_parser.rl"
482         {MARK(mark, p); }
483         goto st24;
484 st24:
485         if ( ++p == pe )
486                 goto _out24;
487 case 24:
488 #line 489 "ext/http11/http11_parser.c"
489         switch( (*p) ) {
490                 case 32: goto tr31;
491                 case 37: goto st25;
492                 case 59: goto tr33;
493                 case 60: goto st1;
494                 case 62: goto st1;
495                 case 63: goto tr34;
496                 case 127: goto st1;
497         }
498         if ( (*p) > 31 ) {
499                 if ( 34 <= (*p) && (*p) <= 35 )
500                         goto st1;
501         } else if ( (*p) >= 0 )
502                 goto st1;
503         goto st24;
504 st25:
505         if ( ++p == pe )
506                 goto _out25;
507 case 25:
508         if ( (*p) < 65 ) {
509                 if ( 48 <= (*p) && (*p) <= 57 )
510                         goto st26;
511         } else if ( (*p) > 70 ) {
512                 if ( 97 <= (*p) && (*p) <= 102 )
513                         goto st26;
514         } else
515                 goto st26;
516         goto st1;
517 st26:
518         if ( ++p == pe )
519                 goto _out26;
520 case 26:
521         if ( (*p) < 65 ) {
522                 if ( 48 <= (*p) && (*p) <= 57 )
523                         goto st24;
524         } else if ( (*p) > 70 ) {
525                 if ( 97 <= (*p) && (*p) <= 102 )
526                         goto st24;
527         } else
528                 goto st24;
529         goto st1;
530 tr33:
531 #line 54 "ext/http11/http11_parser.rl"
532         {
533     if(parser->request_path != NULL)
534       parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
535   }
536         goto st27;
537 st27:
538         if ( ++p == pe )
539                 goto _out27;
540 case 27:
541 #line 542 "ext/http11/http11_parser.c"
542         switch( (*p) ) {
543                 case 32: goto tr19;
544                 case 37: goto st28;
545                 case 60: goto st1;
546                 case 62: goto st1;
547                 case 63: goto st30;
548                 case 127: goto st1;
549         }
550         if ( (*p) > 31 ) {
551                 if ( 34 <= (*p) && (*p) <= 35 )
552                         goto st1;
553         } else if ( (*p) >= 0 )
554                 goto st1;
555         goto st27;
556 st28:
557         if ( ++p == pe )
558                 goto _out28;
559 case 28:
560         if ( (*p) < 65 ) {
561                 if ( 48 <= (*p) && (*p) <= 57 )
562                         goto st29;
563         } else if ( (*p) > 70 ) {
564                 if ( 97 <= (*p) && (*p) <= 102 )
565                         goto st29;
566         } else
567                 goto st29;
568         goto st1;
569 st29:
570         if ( ++p == pe )
571                 goto _out29;
572 case 29:
573         if ( (*p) < 65 ) {
574                 if ( 48 <= (*p) && (*p) <= 57 )
575                         goto st27;
576         } else if ( (*p) > 70 ) {
577                 if ( 97 <= (*p) && (*p) <= 102 )
578                         goto st27;
579         } else
580                 goto st27;
581         goto st1;
582 tr34:
583 #line 54 "ext/http11/http11_parser.rl"
584         {
585     if(parser->request_path != NULL)
586       parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
587   }
588         goto st30;
589 st30:
590         if ( ++p == pe )
591                 goto _out30;
592 case 30:
593 #line 594 "ext/http11/http11_parser.c"
594         switch( (*p) ) {
595                 case 32: goto tr40;
596                 case 37: goto tr41;
597                 case 60: goto st1;
598                 case 62: goto st1;
599                 case 127: goto st1;
600         }
601         if ( (*p) > 31 ) {
602                 if ( 34 <= (*p) && (*p) <= 35 )
603                         goto st1;
604         } else if ( (*p) >= 0 )
605                 goto st1;
606         goto tr39;
607 tr39:
608 #line 43 "ext/http11/http11_parser.rl"
609         {MARK(query_start, p); }
610         goto st31;
611 st31:
612         if ( ++p == pe )
613                 goto _out31;
614 case 31:
615 #line 616 "ext/http11/http11_parser.c"
616         switch( (*p) ) {
617                 case 32: goto tr28;
618                 case 37: goto st32;
619                 case 60: goto st1;
620                 case 62: goto st1;
621                 case 127: goto st1;
622         }
623         if ( (*p) > 31 ) {
624                 if ( 34 <= (*p) && (*p) <= 35 )
625                         goto st1;
626         } else if ( (*p) >= 0 )
627                 goto st1;
628         goto st31;
629 tr41:
630 #line 43 "ext/http11/http11_parser.rl"
631         {MARK(query_start, p); }
632         goto st32;
633 st32:
634         if ( ++p == pe )
635                 goto _out32;
636 case 32:
637 #line 638 "ext/http11/http11_parser.c"
638         if ( (*p) < 65 ) {
639                 if ( 48 <= (*p) && (*p) <= 57 )
640                         goto st33;
641         } else if ( (*p) > 70 ) {
642                 if ( 97 <= (*p) && (*p) <= 102 )
643                         goto st33;
644         } else
645                 goto st33;
646         goto st1;
647 st33:
648         if ( ++p == pe )
649                 goto _out33;
650 case 33:
651         if ( (*p) < 65 ) {
652                 if ( 48 <= (*p) && (*p) <= 57 )
653                         goto st31;
654         } else if ( (*p) > 70 ) {
655                 if ( 97 <= (*p) && (*p) <= 102 )
656                         goto st31;
657         } else
658                 goto st31;
659         goto st1;
660 st34:
661         if ( ++p == pe )
662                 goto _out34;
663 case 34:
664         switch( (*p) ) {
665                 case 32: goto tr17;
666                 case 36: goto st35;
667                 case 95: goto st35;
668         }
669         if ( (*p) < 48 ) {
670                 if ( 45 <= (*p) && (*p) <= 46 )
671                         goto st35;
672         } else if ( (*p) > 57 ) {
673                 if ( 65 <= (*p) && (*p) <= 90 )
674                         goto st35;
675         } else
676                 goto st35;
677         goto st1;
678 st35:
679         if ( ++p == pe )
680                 goto _out35;
681 case 35:
682         switch( (*p) ) {
683                 case 32: goto tr17;
684                 case 36: goto st36;
685                 case 95: goto st36;
686         }
687         if ( (*p) < 48 ) {
688                 if ( 45 <= (*p) && (*p) <= 46 )
689                         goto st36;
690         } else if ( (*p) > 57 ) {
691                 if ( 65 <= (*p) && (*p) <= 90 )
692                         goto st36;
693         } else
694                 goto st36;
695         goto st1;
696 st36:
697         if ( ++p == pe )
698                 goto _out36;
699 case 36:
700         switch( (*p) ) {
701                 case 32: goto tr17;
702                 case 36: goto st37;
703                 case 95: goto st37;
704         }
705         if ( (*p) < 48 ) {
706                 if ( 45 <= (*p) && (*p) <= 46 )
707                         goto st37;
708         } else if ( (*p) > 57 ) {
709                 if ( 65 <= (*p) && (*p) <= 90 )
710                         goto st37;
711         } else
712                 goto st37;
713         goto st1;
714 st37:
715         if ( ++p == pe )
716                 goto _out37;
717 case 37:
718         switch( (*p) ) {
719                 case 32: goto tr17;
720                 case 36: goto st38;
721                 case 95: goto st38;
722         }
723         if ( (*p) < 48 ) {
724                 if ( 45 <= (*p) && (*p) <= 46 )
725                         goto st38;
726         } else if ( (*p) > 57 ) {
727                 if ( 65 <= (*p) && (*p) <= 90 )
728                         goto st38;
729         } else
730                 goto st38;
731         goto st1;
732 st38:
733         if ( ++p == pe )
734                 goto _out38;
735 case 38:
736         switch( (*p) ) {
737                 case 32: goto tr17;
738                 case 36: goto st39;
739                 case 95: goto st39;
740         }
741         if ( (*p) < 48 ) {
742                 if ( 45 <= (*p) && (*p) <= 46 )
743                         goto st39;
744         } else if ( (*p) > 57 ) {
745                 if ( 65 <= (*p) && (*p) <= 90 )
746                         goto st39;
747         } else
748                 goto st39;
749         goto st1;
750 st39:
751         if ( ++p == pe )
752                 goto _out39;
753 case 39:
754         switch( (*p) ) {
755                 case 32: goto tr17;
756                 case 36: goto st40;
757                 case 95: goto st40;
758         }
759         if ( (*p) < 48 ) {
760                 if ( 45 <= (*p) && (*p) <= 46 )
761                         goto st40;
762         } else if ( (*p) > 57 ) {
763                 if ( 65 <= (*p) && (*p) <= 90 )
764                         goto st40;
765         } else
766                 goto st40;
767         goto st1;
768 st40:
769         if ( ++p == pe )
770                 goto _out40;
771 case 40:
772         switch( (*p) ) {
773                 case 32: goto tr17;
774                 case 36: goto st41;
775                 case 95: goto st41;
776         }
777         if ( (*p) < 48 ) {
778                 if ( 45 <= (*p) && (*p) <= 46 )
779                         goto st41;
780         } else if ( (*p) > 57 ) {
781                 if ( 65 <= (*p) && (*p) <= 90 )
782                         goto st41;
783         } else
784                 goto st41;
785         goto st1;
786 st41:
787         if ( ++p == pe )
788                 goto _out41;
789 case 41:
790         switch( (*p) ) {
791                 case 32: goto tr17;
792                 case 36: goto st42;
793                 case 95: goto st42;
794         }
795         if ( (*p) < 48 ) {
796                 if ( 45 <= (*p) && (*p) <= 46 )
797                         goto st42;
798         } else if ( (*p) > 57 ) {
799                 if ( 65 <= (*p) && (*p) <= 90 )
800                         goto st42;
801         } else
802                 goto st42;
803         goto st1;
804 st42:
805         if ( ++p == pe )
806                 goto _out42;
807 case 42:
808         switch( (*p) ) {
809                 case 32: goto tr17;
810                 case 36: goto st43;
811                 case 95: goto st43;
812         }
813         if ( (*p) < 48 ) {
814                 if ( 45 <= (*p) && (*p) <= 46 )
815                         goto st43;
816         } else if ( (*p) > 57 ) {
817                 if ( 65 <= (*p) && (*p) <= 90 )
818                         goto st43;
819         } else
820                 goto st43;
821         goto st1;
822 st43:
823         if ( ++p == pe )
824                 goto _out43;
825 case 43:
826         switch( (*p) ) {
827                 case 32: goto tr17;
828                 case 36: goto st44;
829                 case 95: goto st44;
830         }
831         if ( (*p) < 48 ) {
832                 if ( 45 <= (*p) && (*p) <= 46 )
833                         goto st44;
834         } else if ( (*p) > 57 ) {
835                 if ( 65 <= (*p) && (*p) <= 90 )
836                         goto st44;
837         } else
838                 goto st44;
839         goto st1;
840 st44:
841         if ( ++p == pe )
842                 goto _out44;
843 case 44:
844         switch( (*p) ) {
845                 case 32: goto tr17;
846                 case 36: goto st45;
847                 case 95: goto st45;
848         }
849         if ( (*p) < 48 ) {
850                 if ( 45 <= (*p) && (*p) <= 46 )
851                         goto st45;
852         } else if ( (*p) > 57 ) {
853                 if ( 65 <= (*p) && (*p) <= 90 )
854                         goto st45;
855         } else
856                 goto st45;
857         goto st1;
858 st45:
859         if ( ++p == pe )
860                 goto _out45;
861 case 45:
862         switch( (*p) ) {
863                 case 32: goto tr17;
864                 case 36: goto st46;
865                 case 95: goto st46;
866         }
867         if ( (*p) < 48 ) {
868                 if ( 45 <= (*p) && (*p) <= 46 )
869                         goto st46;
870         } else if ( (*p) > 57 ) {
871                 if ( 65 <= (*p) && (*p) <= 90 )
872                         goto st46;
873         } else
874                 goto st46;
875         goto st1;
876 st46:
877         if ( ++p == pe )
878                 goto _out46;
879 case 46:
880         switch( (*p) ) {
881                 case 32: goto tr17;
882                 case 36: goto st47;
883                 case 95: goto st47;
884         }
885         if ( (*p) < 48 ) {
886                 if ( 45 <= (*p) && (*p) <= 46 )
887                         goto st47;
888         } else if ( (*p) > 57 ) {
889                 if ( 65 <= (*p) && (*p) <= 90 )
890                         goto st47;
891         } else
892                 goto st47;
893         goto st1;
894 st47:
895         if ( ++p == pe )
896                 goto _out47;
897 case 47:
898         switch( (*p) ) {
899                 case 32: goto tr17;
900                 case 36: goto st48;
901                 case 95: goto st48;
902         }
903         if ( (*p) < 48 ) {
904                 if ( 45 <= (*p) && (*p) <= 46 )
905                         goto st48;
906         } else if ( (*p) > 57 ) {
907                 if ( 65 <= (*p) && (*p) <= 90 )
908                         goto st48;
909         } else
910                 goto st48;
911         goto st1;
912 st48:
913         if ( ++p == pe )
914                 goto _out48;
915 case 48:
916         switch( (*p) ) {
917                 case 32: goto tr17;
918                 case 36: goto st49;
919                 case 95: goto st49;
920         }
921         if ( (*p) < 48 ) {
922                 if ( 45 <= (*p) && (*p) <= 46 )
923                         goto st49;
924         } else if ( (*p) > 57 ) {
925                 if ( 65 <= (*p) && (*p) <= 90 )
926                         goto st49;
927         } else
928                 goto st49;
929         goto st1;
930 st49:
931         if ( ++p == pe )
932                 goto _out49;
933 case 49:
934         switch( (*p) ) {
935                 case 32: goto tr17;
936                 case 36: goto st50;
937                 case 95: goto st50;
938         }
939         if ( (*p) < 48 ) {
940                 if ( 45 <= (*p) && (*p) <= 46 )
941                         goto st50;
942         } else if ( (*p) > 57 ) {
943                 if ( 65 <= (*p) && (*p) <= 90 )
944                         goto st50;
945         } else
946                 goto st50;
947         goto st1;
948 st50:
949         if ( ++p == pe )
950                 goto _out50;
951 case 50:
952         switch( (*p) ) {
953                 case 32: goto tr17;
954                 case 36: goto st51;
955                 case 95: goto st51;
956         }
957         if ( (*p) < 48 ) {
958                 if ( 45 <= (*p) && (*p) <= 46 )
959                         goto st51;
960         } else if ( (*p) > 57 ) {
961                 if ( 65 <= (*p) && (*p) <= 90 )
962                         goto st51;
963         } else
964                 goto st51;
965         goto st1;
966 st51:
967         if ( ++p == pe )
968                 goto _out51;
969 case 51:
970         switch( (*p) ) {
971                 case 32: goto tr17;
972                 case 36: goto st52;
973                 case 95: goto st52;
974         }
975         if ( (*p) < 48 ) {
976                 if ( 45 <= (*p) && (*p) <= 46 )
977                         goto st52;
978         } else if ( (*p) > 57 ) {
979                 if ( 65 <= (*p) && (*p) <= 90 )
980                         goto st52;
981         } else
982                 goto st52;
983         goto st1;
984 st52:
985         if ( ++p == pe )
986                 goto _out52;
987 case 52:
988         if ( (*p) == 32 )
989                 goto tr17;
990         goto st1;
991         }
992         _out1: cs = 1; goto _out;
993         _out2: cs = 2; goto _out;
994         _out3: cs = 3; goto _out;
995         _out4: cs = 4; goto _out;
996         _out5: cs = 5; goto _out;
997         _out6: cs = 6; goto _out;
998         _out7: cs = 7; goto _out;
999         _out8: cs = 8; goto _out;
1000         _out9: cs = 9; goto _out;
1001         _out10: cs = 10; goto _out;
1002         _out11: cs = 11; goto _out;
1003         _out12: cs = 12; goto _out;
1004         _out13: cs = 13; goto _out;
1005         _out14: cs = 14; goto _out;
1006         _out15: cs = 15; goto _out;
1007         _out16: cs = 16; goto _out;
1008         _out53: cs = 53; goto _out;
1009         _out17: cs = 17; goto _out;
1010         _out18: cs = 18; goto _out;
1011         _out19: cs = 19; goto _out;
1012         _out20: cs = 20; goto _out;
1013         _out21: cs = 21; goto _out;
1014         _out22: cs = 22; goto _out;
1015         _out23: cs = 23; goto _out;
1016         _out24: cs = 24; goto _out;
1017         _out25: cs = 25; goto _out;
1018         _out26: cs = 26; goto _out;
1019         _out27: cs = 27; goto _out;
1020         _out28: cs = 28; goto _out;
1021         _out29: cs = 29; goto _out;
1022         _out30: cs = 30; goto _out;
1023         _out31: cs = 31; goto _out;
1024         _out32: cs = 32; goto _out;
1025         _out33: cs = 33; goto _out;
1026         _out34: cs = 34; goto _out;
1027         _out35: cs = 35; goto _out;
1028         _out36: cs = 36; goto _out;
1029         _out37: cs = 37; goto _out;
1030         _out38: cs = 38; goto _out;
1031         _out39: cs = 39; goto _out;
1032         _out40: cs = 40; goto _out;
1033         _out41: cs = 41; goto _out;
1034         _out42: cs = 42; goto _out;
1035         _out43: cs = 43; goto _out;
1036         _out44: cs = 44; goto _out;
1037         _out45: cs = 45; goto _out;
1038         _out46: cs = 46; goto _out;
1039         _out47: cs = 47; goto _out;
1040         _out48: cs = 48; goto _out;
1041         _out49: cs = 49; goto _out;
1042         _out50: cs = 50; goto _out;
1043         _out51: cs = 51; goto _out;
1044         _out52: cs = 52; goto _out;
1045
1046         _out: {}
1047         }
1048 #line 149 "ext/http11/http11_parser.rl"
1049
1050   parser->cs = cs;
1051   parser->nread += p - (buffer + off);
1052
1053   assert(p <= pe && "buffer overflow after parsing execute");
1054   assert(parser->nread <= len && "nread longer than length");
1055   assert(parser->body_start <= len && "body starts after buffer end");
1056   assert(parser->mark < len && "mark is after buffer end");
1057   assert(parser->field_len <= len && "field has length longer than whole buffer");
1058   assert(parser->field_start < len && "field starts after buffer end");
1059
1060   if(parser->body_start) {
1061     /* final \r\n combo encountered so stop right here */
1062    
1063 #line 1064 "ext/http11/http11_parser.c"
1064 #line 163 "ext/http11/http11_parser.rl"
1065     parser->nread++;
1066   }
1067
1068   return(parser->nread);
1069 }
1070
1071 int http_parser_finish(http_parser *parser)
1072 {
1073   int cs = parser->cs;
1074
1075  
1076 #line 1077 "ext/http11/http11_parser.c"
1077 #line 174 "ext/http11/http11_parser.rl"
1078
1079   parser->cs = cs;
1080
1081   if (http_parser_has_error(parser) ) {
1082     return -1;
1083   } else if (http_parser_is_finished(parser) ) {
1084     return 1;
1085   } else {
1086     return 0;
1087   }
1088 }
1089
1090 int http_parser_has_error(http_parser *parser) {
1091   return parser->cs == http_parser_error;
1092 }
1093
1094 int http_parser_is_finished(http_parser *parser) {
1095   return parser->cs == http_parser_first_final;
1096 }
Note: See TracBrowser for help on using the browser.