public
Description: A very fast & simple Ruby web server
Homepage: http://code.macournoyer.com/thin/
Clone URL: git://github.com/macournoyer/thin.git
Search Repo:
Put parser state machine action null checks back in
following Zed recommendation: 
http://rubyforge.org/pipermail/mongrel-users/2008-January/004889.html
macournoyer (author)
Thu Jan 24 14:32:35 -0800 2008
commit  d9fddd014c5a664c32238e4b16a8103446d6941a
tree    44214cc43e09002b691441f97ce88b0c03907b3c
parent  27c724dc1719c2bd3d4b6f9a23149f66de43b018
...
16
17
18
19
 
20
21
22
...
28
29
30
31
 
32
33
34
...
37
38
39
40
 
41
42
43
44
45
...
111
112
113
114
 
115
116
 
 
 
117
118
119
120
121
122
123
 
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
...
144
145
146
147
 
148
149
150
151
152
153
154
155
156
 
 
 
 
 
157
158
159
160
 
161
162
 
 
 
163
164
165
166
 
167
168
 
 
 
169
170
171
172
 
 
 
 
 
173
174
175
176
 
177
178
 
179
180
 
 
 
181
182
183
184
 
 
 
 
 
185
186
187
188
 
189
190
 
 
 
191
192
193
194
 
 
 
 
 
195
196
197
198
199
200
201
 
202
203
204
...
210
211
212
213
 
214
215
216
217
218
219
...
268
269
270
271
 
272
273
 
 
 
274
275
276
277
278
279
 
 
 
280
281
282
283
284
285
286
 
287
288
289
290
...
323
324
325
326
 
327
328
329
 
 
 
330
331
332
...
334
335
336
337
 
338
339
340
...
344
345
346
347
 
348
349
350
...
383
384
385
386
 
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
...
397
398
399
400
 
401
402
403
404
405
406
407
 
 
 
 
 
408
409
410
411
 
412
413
 
 
 
414
415
416
417
 
 
 
 
 
418
419
420
421
 
422
423
 
424
425
 
 
 
426
427
428
429
 
 
 
 
 
430
431
432
433
 
434
435
 
 
 
436
437
438
439
 
 
 
 
 
440
441
442
443
444
445
446
 
447
448
449
...
465
466
467
468
 
469
470
471
...
487
488
489
490
 
491
492
493
...
518
519
520
521
 
522
523
524
...
543
544
545
546
 
547
548
549
...
590
591
592
593
 
594
595
596
597
598
...
632
633
634
635
 
636
637
 
 
 
638
639
640
641
642
643
644
 
645
646
647
648
649
...
682
683
684
685
 
686
687
 
 
 
688
689
690
691
692
693
694
 
695
696
697
698
...
705
706
707
708
 
709
710
711
712
713
714
715
 
716
717
718
719
...
726
727
728
729
 
730
731
732
733
734
735
736
 
737
738
739
...
1148
1149
1150
1151
 
1152
1153
1154
...
1163
1164
1165
1166
1167
 
 
1168
1169
1170
...
1176
1177
1178
1179
1180
 
 
1181
1182
1183
...
16
17
18
 
19
20
21
22
...
28
29
30
 
31
32
33
34
...
37
38
39
 
40
41
42
43
44
45
...
111
112
113
 
114
115
 
116
117
118
119
120
121
122
123
124
 
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
...
146
147
148
 
149
150
151
152
153
154
155
 
 
 
156
157
158
159
160
161
162
163
 
164
165
 
166
167
168
169
170
171
 
172
173
 
174
175
176
177
 
 
 
178
179
180
181
182
183
184
185
 
186
187
 
188
189
 
190
191
192
193
 
 
 
194
195
196
197
198
199
200
201
 
202
203
 
204
205
206
207
 
 
 
208
209
210
211
212
213
214
215
216
217
218
 
219
220
221
222
...
228
229
230
 
231
232
233
234
235
236
237
...
286
287
288
 
289
290
 
291
292
293
294
295
296
297
298
 
299
300
301
302
303
304
305
306
307
 
308
309
310
311
312
...
345
346
347
 
348
349
350
 
351
352
353
354
355
356
...
358
359
360
 
361
362
363
364
...
368
369
370
 
371
372
373
374
...
407
408
409
 
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
...
421
422
423
 
424
425
426
427
428
 
 
 
429
430
431
432
433
434
435
436
 
437
438
 
439
440
441
442
 
 
 
443
444
445
446
447
448
449
450
 
451
452
 
453
454
 
455
456
457
458
 
 
 
459
460
461
462
463
464
465
466
 
467
468
 
469
470
471
472
 
 
 
473
474
475
476
477
478
479
480
481
482
483
 
484
485
486
487
...
503
504
505
 
506
507
508
509
...
525
526
527
 
528
529
530
531
...
556
557
558
 
559
560
561
562
...
581
582
583
 
584
585
586
587
...
628
629
630
 
631
632
633
634
635
636
...
670
671
672
 
673
674
 
675
676
677
678
679
680
681
682
683
 
684
685
686
687
688
689
...
722
723
724
 
725
726
 
727
728
729
730
731
732
733
734
735
 
736
737
738
739
740
...
747
748
749
 
750
751
752
753
754
755
756
 
757
758
759
760
761
...
768
769
770
 
771
772
773
774
775
776
777
 
778
779
780
781
...
1190
1191
1192
 
1193
1194
1195
1196
...
1205
1206
1207
 
 
1208
1209
1210
1211
1212
...
1218
1219
1220
 
 
1221
1222
1223
1224
1225
0
@@ -16,7 +16,7 @@
0
 
0
 /** Machine **/
0
 
0
-#line 65 "parser.rl"
0
+#line 81 "parser.rl"
0
 
0
 
0
 /** Data **/
0
@@ -28,7 +28,7 @@
0
 
0
 static const int http_parser_en_main = 1;
0
 
0
-#line 69 "parser.rl"
0
+#line 85 "parser.rl"
0
 
0
 int http_parser_init(http_parser *parser) {
0
   int cs = 0;
0
@@ -37,7 +37,7 @@
0
   {
0
   cs = http_parser_start;
0
   }
0
-#line 73 "parser.rl"
0
+#line 89 "parser.rl"
0
   parser->cs = cs;
0
   parser->body_start = 0;
0
   parser->content_len = 0;
0
0
0
@@ -111,16 +111,18 @@
0
     goto st38;
0
   goto st0;
0
 tr2:
0
-#line 34 "parser.rl"
0
+#line 36 "parser.rl"
0
   {
0
- parser->request_method(parser->data, PTR_TO(mark), LEN(mark, p));
0
+ if (parser->request_method != NULL) {
0
+ parser->request_method(parser->data, PTR_TO(mark), LEN(mark, p));
0
+ }
0
   }
0
   goto st3;
0
 st3:
0
   if ( ++p == pe )
0
     goto _out3;
0
 case 3:
0
-#line 124 "parser.c"
0
+#line 126 "parser.c"
0
   switch( (*p) ) {
0
     case 42: goto tr4;
0
     case 43: goto tr5;
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
@@ -144,61 +146,77 @@
0
   if ( ++p == pe )
0
     goto _out4;
0
 case 4:
0
-#line 148 "parser.c"
0
+#line 150 "parser.c"
0
   switch( (*p) ) {
0
     case 32: goto tr8;
0
     case 35: goto tr9;
0
   }
0
   goto st0;
0
 tr8:
0
-#line 37 "parser.rl"
0
- {
0
- parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
0
+#line 41 "parser.rl"
0
+ {
0
+ if (parser->request_uri != NULL) {
0
+ parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
0
+ }
0
   }
0
   goto st5;
0
 tr30:
0
-#line 40 "parser.rl"
0
+#line 46 "parser.rl"
0
   {
0
- parser->fragment(parser->data, PTR_TO(mark), LEN(mark, p));
0
+ if (parser->fragment != NULL) {
0
+ parser->fragment(parser->data, PTR_TO(mark), LEN(mark, p));
0
+ }
0
   }
0
   goto st5;
0
 tr40:
0
-#line 53 "parser.rl"
0
+#line 65 "parser.rl"
0
   {
0
- parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
0
+ if (parser->request_path != NULL) {
0
+ parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
0
+ }
0
   }
0
-#line 37 "parser.rl"
0
- {
0
- parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
0
+#line 41 "parser.rl"
0
+ {
0
+ if (parser->request_uri != NULL) {
0
+ parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
0
+ }
0
   }
0
   goto st5;
0
 tr51:
0
-#line 44 "parser.rl"
0
+#line 52 "parser.rl"
0
   {MARK(query_start, p); }
0
-#line 45 "parser.rl"
0
+#line 53 "parser.rl"
0
   {
0
- parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p));
0
+ if (parser->query_string != NULL) {
0
+ parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p));
0
+ }
0
   }
0
-#line 37 "parser.rl"
0
- {
0
- parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
0
+#line 41 "parser.rl"
0
+ {
0
+ if (parser->request_uri != NULL) {
0
+ parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
0
+ }
0
   }
0
   goto st5;
0
 tr55:
0
-#line 45 "parser.rl"
0
+#line 53 "parser.rl"
0
   {
0
- parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p));
0
+ if (parser->query_string != NULL) {
0
+ parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p));
0
+ }
0
   }
0
-#line 37 "parser.rl"
0
- {
0
- parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
0
+#line 41 "parser.rl"
0
+ {
0
+ if (parser->request_uri != NULL) {
0
+ parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
0
+ }
0
   }
0
   goto st5;
0
 st5:
0
   if ( ++p == pe )
0
     goto _out5;
0
 case 5:
0
-#line 202 "parser.c"
0
+#line 220 "parser.c"
0
   if ( (*p) == 72 )
0
     goto tr10;
0
   goto st0;
0
@@ -210,7 +228,7 @@
0
   if ( ++p == pe )
0
     goto _out6;
0
 case 6:
0
-#line 214 "parser.c"
0
+#line 232 "parser.c"
0
   if ( (*p) == 84 )
0
     goto st7;
0
   goto st0;
0
0
0
0
@@ -268,22 +286,26 @@
0
     goto st13;
0
   goto st0;
0
 tr18:
0
-#line 49 "parser.rl"
0
+#line 59 "parser.rl"
0
   {  
0
- parser->http_version(parser->data, PTR_TO(mark), LEN(mark, p));
0
+ if (parser->http_version != NULL) {
0
+ parser->http_version(parser->data, PTR_TO(mark), LEN(mark, p));
0
+ }
0
   }
0
   goto st14;
0
 tr26:
0
 #line 31 "parser.rl"
0
   {
0
- parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p));
0
+ if (parser->http_field != NULL) {
0
+ parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p));
0
+ }
0
   }
0
   goto st14;
0
 st14:
0
   if ( ++p == pe )
0
     goto _out14;
0
 case 14:
0
-#line 287 "parser.c"
0
+#line 309 "parser.c"
0
   if ( (*p) == 10 )
0
     goto st15;
0
   goto st0;
0
0
@@ -323,10 +345,12 @@
0
     goto tr22;
0
   goto st0;
0
 tr22:
0
-#line 57 "parser.rl"
0
+#line 71 "parser.rl"
0
   {
0
     parser->body_start = p - buffer + 1;
0
- parser->header_done(parser->data, p + 1, pe - p - 1);
0
+ if (parser->header_done != NULL) {
0
+ parser->header_done(parser->data, p + 1, pe - p - 1);
0
+ }
0
     goto _out57;
0
   }
0
   goto st57;
0
@@ -334,7 +358,7 @@
0
   if ( ++p == pe )
0
     goto _out57;
0
 case 57:
0
-#line 338 "parser.c"
0
+#line 362 "parser.c"
0
   goto st0;
0
 tr21:
0
 #line 25 "parser.rl"
0
@@ -344,7 +368,7 @@
0
   if ( ++p == pe )
0
     goto _out17;
0
 case 17:
0
-#line 348 "parser.c"
0
+#line 372 "parser.c"
0
   switch( (*p) ) {
0
     case 33: goto st17;
0
     case 58: goto tr24;
0
@@ -383,7 +407,7 @@
0
   if ( ++p == pe )
0
     goto _out18;
0
 case 18:
0
-#line 387 "parser.c"
0
+#line 411 "parser.c"
0
   switch( (*p) ) {
0
     case 13: goto tr26;
0
     case 32: goto tr27;
0
0
0
0
0
0
0
0
0
0
0
0
0
@@ -397,53 +421,67 @@
0
   if ( ++p == pe )
0
     goto _out19;
0
 case 19:
0
-#line 401 "parser.c"
0
+#line 425 "parser.c"
0
   if ( (*p) == 13 )
0
     goto tr26;
0
   goto st19;
0
 tr9:
0
-#line 37 "parser.rl"
0
- {
0
- parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
0
+#line 41 "parser.rl"
0
+ {
0
+ if (parser->request_uri != NULL) {
0
+ parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
0
+ }
0
   }
0
   goto st20;
0
 tr41:
0
-#line 53 "parser.rl"
0
+#line 65 "parser.rl"
0
   {
0
- parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
0
+ if (parser->request_path != NULL) {
0
+ parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
0
+ }
0
   }
0
-#line 37 "parser.rl"
0
- {
0
- parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
0
+#line 41 "parser.rl"
0
+ {
0
+ if (parser->request_uri != NULL) {
0
+ parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
0
+ }
0
   }
0
   goto st20;
0
 tr52:
0
-#line 44 "parser.rl"
0
+#line 52 "parser.rl"
0
   {MARK(query_start, p); }
0
-#line 45 "parser.rl"
0
+#line 53 "parser.rl"
0
   {
0
- parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p));
0
+ if (parser->query_string != NULL) {
0
+ parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p));
0
+ }
0
   }
0
-#line 37 "parser.rl"
0
- {
0
- parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
0
+#line 41 "parser.rl"
0
+ {
0
+ if (parser->request_uri != NULL) {
0
+ parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
0
+ }
0
   }
0
   goto st20;
0
 tr56:
0
-#line 45 "parser.rl"
0
+#line 53 "parser.rl"
0
   {
0
- parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p));
0
+ if (parser->query_string != NULL) {
0
+ parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p));
0
+ }
0
   }
0
-#line 37 "parser.rl"
0
- {
0
- parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
0
+#line 41 "parser.rl"
0
+ {
0
+ if (parser->request_uri != NULL) {
0
+ parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
0
+ }
0
   }
0
   goto st20;
0
 st20:
0
   if ( ++p == pe )
0
     goto _out20;
0
 case 20:
0
-#line 447 "parser.c"
0
+#line 485 "parser.c"
0
   switch( (*p) ) {
0
     case 32: goto tr30;
0
     case 37: goto tr31;
0
@@ -465,7 +503,7 @@
0
   if ( ++p == pe )
0
     goto _out21;
0
 case 21:
0
-#line 469 "parser.c"
0
+#line 507 "parser.c"
0
   switch( (*p) ) {
0
     case 32: goto tr30;
0
     case 37: goto st22;
0
@@ -487,7 +525,7 @@
0
   if ( ++p == pe )
0
     goto _out22;
0
 case 22:
0
-#line 491 "parser.c"
0
+#line 529 "parser.c"
0
   if ( (*p) < 65 ) {
0
     if ( 48 <= (*p) && (*p) <= 57 )
0
       goto st23;
0
@@ -518,7 +556,7 @@
0
   if ( ++p == pe )
0
     goto _out24;
0
 case 24:
0
-#line 522 "parser.c"
0
+#line 560 "parser.c"
0
   switch( (*p) ) {
0
     case 43: goto st24;
0
     case 58: goto st25;
0
@@ -543,7 +581,7 @@
0
   if ( ++p == pe )
0
     goto _out25;
0
 case 25:
0
-#line 547 "parser.c"
0
+#line 585 "parser.c"
0
   switch( (*p) ) {
0
     case 32: goto tr8;
0
     case 34: goto st0;
0
@@ -590,7 +628,7 @@
0
   if ( ++p == pe )
0
     goto _out28;
0
 case 28:
0
-#line 594 "parser.c"
0
+#line 632 "parser.c"
0
   switch( (*p) ) {
0
     case 32: goto tr40;
0
     case 34: goto st0;
0
0
0
@@ -632,16 +670,18 @@
0
     goto st28;
0
   goto st0;
0
 tr43:
0
-#line 53 "parser.rl"
0
+#line 65 "parser.rl"
0
   {
0
- parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
0
+ if (parser->request_path != NULL) {
0
+ parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
0
+ }
0
   }
0
   goto st31;
0
 st31:
0
   if ( ++p == pe )
0
     goto _out31;
0
 case 31:
0
-#line 645 "parser.c"
0
+#line 685 "parser.c"
0
   switch( (*p) ) {
0
     case 32: goto tr8;
0
     case 34: goto st0;
0
0
0
@@ -682,16 +722,18 @@
0
     goto st31;
0
   goto st0;
0
 tr44:
0
-#line 53 "parser.rl"
0
+#line 65 "parser.rl"
0
   {
0
- parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
0
+ if (parser->request_path != NULL) {
0
+ parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
0
+ }
0
   }
0
   goto st34;
0
 st34:
0
   if ( ++p == pe )
0
     goto _out34;
0
 case 34:
0
-#line 695 "parser.c"
0
+#line 737 "parser.c"
0
   switch( (*p) ) {
0
     case 32: goto tr51;
0
     case 34: goto st0;
0
0
@@ -705,14 +747,14 @@
0
     goto st0;
0
   goto tr50;
0
 tr50:
0
-#line 44 "parser.rl"
0
+#line 52 "parser.rl"
0
   {MARK(query_start, p); }
0
   goto st35;
0
 st35:
0
   if ( ++p == pe )
0
     goto _out35;
0
 case 35:
0
-#line 716 "parser.c"
0
+#line 758 "parser.c"
0
   switch( (*p) ) {
0
     case 32: goto tr55;
0
     case 34: goto st0;
0
0
@@ -726,14 +768,14 @@
0
     goto st0;
0
   goto st35;
0
 tr53:
0
-#line 44 "parser.rl"
0
+#line 52 "parser.rl"
0
   {MARK(query_start, p); }
0
   goto st36;
0
 st36:
0
   if ( ++p == pe )
0
     goto _out36;
0
 case 36:
0
-#line 737 "parser.c"
0
+#line 779 "parser.c"
0
   if ( (*p) < 65 ) {
0
     if ( 48 <= (*p) && (*p) <= 57 )
0
       goto st37;
0
@@ -1148,7 +1190,7 @@
0
 
0
   _out: {}
0
   }
0
-#line 100 "parser.rl"
0
+#line 116 "parser.rl"
0
 
0
   parser->cs = cs;
0
   parser->nread += p - (buffer + off);
0
@@ -1163,8 +1205,8 @@
0
   if(parser->body_start) {
0
     /* final \r\n combo encountered so stop right here */
0
     
0
-#line 1167 "parser.c"
0
-#line 114 "parser.rl"
0
+#line 1209 "parser.c"
0
+#line 130 "parser.rl"
0
     parser->nread++;
0
   }
0
 
0
@@ -1176,8 +1218,8 @@
0
   int cs = parser->cs;
0
 
0
   
0
-#line 1180 "parser.c"
0
-#line 125 "parser.rl"
0
+#line 1222 "parser.c"
0
+#line 141 "parser.rl"
0
 
0
   parser->cs = cs;
0
 
...
29
30
31
32
 
 
 
33
34
35
 
 
 
36
37
38
 
 
 
 
39
40
41
 
 
 
42
43
44
45
46
 
 
 
47
48
49
50
 
 
 
51
52
53
54
 
 
 
55
56
57
58
59
 
 
 
60
61
62
...
29
30
31
 
32
33
34
35
36
 
37
38
39
40
 
 
41
42
43
44
45
46
 
47
48
49
50
51
52
53
 
54
55
56
57
58
59
 
60
61
62
63
64
65
 
66
67
68
69
70
71
72
 
73
74
75
76
77
78
0
@@ -29,34 +29,50 @@
0
 
0
   action start_value { MARK(mark, fpc); }
0
   action write_value {
0
- parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, fpc));
0
+ if (parser->http_field != NULL) {
0
+ parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, fpc));
0
+ }
0
   }
0
   action request_method {
0
- parser->request_method(parser->data, PTR_TO(mark), LEN(mark, fpc));
0
+ if (parser->request_method != NULL) {
0
+ parser->request_method(parser->data, PTR_TO(mark), LEN(mark, fpc));
0
+ }
0
   }
0
- action request_uri {
0
- parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, fpc));
0
+ action request_uri {
0
+ if (parser->request_uri != NULL) {
0
+ parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, fpc));
0
+ }
0
   }
0
   action fragment {
0
- parser->fragment(parser->data, PTR_TO(mark), LEN(mark, fpc));
0
+ if (parser->fragment != NULL) {
0
+ parser->fragment(parser->data, PTR_TO(mark), LEN(mark, fpc));
0
+ }
0
   }
0
 
0
   action start_query {MARK(query_start, fpc); }
0
   action query_string {
0
- parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, fpc));
0
+ if (parser->query_string != NULL) {
0
+ parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, fpc));
0
+ }
0
   }
0
 
0
   action http_version {  
0
- parser->http_version(parser->data, PTR_TO(mark), LEN(mark, fpc));
0
+ if (parser->http_version != NULL) {
0
+ parser->http_version(parser->data, PTR_TO(mark), LEN(mark, fpc));
0
+ }
0
   }
0
 
0
   action request_path {
0
- parser->request_path(parser->data, PTR_TO(mark), LEN(mark,fpc));
0
+ if (parser->request_path != NULL) {
0
+ parser->request_path(parser->data, PTR_TO(mark), LEN(mark,fpc));
0
+ }
0
   }
0
 
0
   action done {
0
     parser->body_start = fpc - buffer + 1;
0
- parser->header_done(parser->data, fpc + 1, pe - fpc - 1);
0
+ if (parser->header_done != NULL) {
0
+ parser->header_done(parser->data, fpc + 1, pe - fpc - 1);
0
+ }
0
     fbreak;
0
   }
0
 

Comments

    No one has commented yet.