fast_http 0.1.1

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