unicorn 5.5.0 → 6.1.0

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.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.manifest +8 -5
  3. data/.olddoc.yml +15 -7
  4. data/CONTRIBUTORS +6 -2
  5. data/Documentation/.gitignore +1 -3
  6. data/Documentation/unicorn.1 +222 -0
  7. data/Documentation/unicorn_rails.1 +207 -0
  8. data/FAQ +1 -1
  9. data/GIT-VERSION-FILE +1 -1
  10. data/GIT-VERSION-GEN +1 -1
  11. data/GNUmakefile +112 -57
  12. data/HACKING +2 -9
  13. data/ISSUES +24 -31
  14. data/KNOWN_ISSUES +2 -2
  15. data/LATEST +16 -22
  16. data/Links +5 -5
  17. data/NEWS +155 -0
  18. data/README +15 -9
  19. data/SIGNALS +1 -1
  20. data/Sandbox +3 -3
  21. data/archive/slrnpull.conf +1 -1
  22. data/bin/unicorn_rails +2 -2
  23. data/examples/big_app_gc.rb +1 -1
  24. data/examples/logrotate.conf +2 -2
  25. data/examples/nginx.conf +1 -1
  26. data/examples/unicorn.conf.minimal.rb +2 -2
  27. data/examples/unicorn.conf.rb +2 -2
  28. data/examples/unicorn@.service +7 -0
  29. data/ext/unicorn_http/c_util.h +5 -13
  30. data/ext/unicorn_http/common_field_optimization.h +0 -1
  31. data/ext/unicorn_http/epollexclusive.h +124 -0
  32. data/ext/unicorn_http/ext_help.h +0 -24
  33. data/ext/unicorn_http/extconf.rb +2 -6
  34. data/ext/unicorn_http/global_variables.h +1 -1
  35. data/ext/unicorn_http/httpdate.c +1 -0
  36. data/ext/unicorn_http/unicorn_http.c +258 -228
  37. data/ext/unicorn_http/unicorn_http.rl +48 -18
  38. data/lib/unicorn/configurator.rb +13 -3
  39. data/lib/unicorn/http_request.rb +11 -1
  40. data/lib/unicorn/http_server.rb +56 -29
  41. data/lib/unicorn/oob_gc.rb +5 -5
  42. data/lib/unicorn/select_waiter.rb +6 -0
  43. data/lib/unicorn/tmpio.rb +8 -2
  44. data/lib/unicorn/version.rb +1 -1
  45. data/lib/unicorn.rb +4 -3
  46. data/man/man1/unicorn.1 +89 -88
  47. data/man/man1/unicorn_rails.1 +78 -83
  48. data/t/GNUmakefile +3 -72
  49. data/t/README +1 -1
  50. data/t/test-lib.sh +2 -1
  51. data/test/benchmark/README +14 -4
  52. data/test/benchmark/ddstream.ru +50 -0
  53. data/test/benchmark/readinput.ru +40 -0
  54. data/test/benchmark/uconnect.perl +66 -0
  55. data/test/exec/test_exec.rb +14 -12
  56. data/test/test_helper.rb +38 -30
  57. data/test/unit/test_ccc.rb +4 -3
  58. data/test/unit/test_http_parser_ng.rb +81 -0
  59. data/test/unit/test_server.rb +81 -7
  60. data/test/unit/test_signals.rb +6 -6
  61. data/test/unit/test_socket_helper.rb +1 -1
  62. data/test/unit/test_upload.rb +9 -14
  63. data/test/unit/test_util.rb +5 -4
  64. data/test/unit/test_waiter.rb +34 -0
  65. data/unicorn.gemspec +8 -7
  66. metadata +16 -11
  67. data/Documentation/GNUmakefile +0 -30
  68. data/Documentation/unicorn.1.txt +0 -187
  69. data/Documentation/unicorn_rails.1.txt +0 -175
  70. data/t/hijack.ru +0 -55
  71. data/t/t0200-rack-hijack.sh +0 -51
@@ -14,6 +14,7 @@
14
14
  #include "common_field_optimization.h"
15
15
  #include "global_variables.h"
16
16
  #include "c_util.h"
17
+ #include "epollexclusive.h"
17
18
 
18
19
  void init_unicorn_httpdate(void);
19
20
 
@@ -64,19 +65,8 @@ struct http_parser {
64
65
  } len;
65
66
  };
66
67
 
67
- static ID id_set_backtrace;
68
-
69
- #ifdef HAVE_RB_HASH_CLEAR /* Ruby >= 2.0 */
70
- # define my_hash_clear(h) (void)rb_hash_clear(h)
71
- #else /* !HAVE_RB_HASH_CLEAR - Ruby <= 1.9.3 */
72
-
73
- static ID id_clear;
74
-
75
- static void my_hash_clear(VALUE h)
76
- {
77
- rb_funcall(h, id_clear, 0);
78
- }
79
- #endif /* HAVE_RB_HASH_CLEAR */
68
+ static ID id_set_backtrace, id_is_chunked_p;
69
+ static VALUE cHttpParser;
80
70
 
81
71
  static void finalize_header(struct http_parser *hp);
82
72
 
@@ -222,6 +212,19 @@ static void write_cont_value(struct http_parser *hp,
222
212
  rb_str_buf_cat(hp->cont, vptr, end + 1);
223
213
  }
224
214
 
215
+ static int is_chunked(VALUE v)
216
+ {
217
+ /* common case first */
218
+ if (STR_CSTR_CASE_EQ(v, "chunked"))
219
+ return 1;
220
+
221
+ /*
222
+ * call Ruby function in unicorn/http_request.rb to deal with unlikely
223
+ * comma-delimited case
224
+ */
225
+ return rb_funcall(cHttpParser, id_is_chunked_p, 1, v) != Qfalse;
226
+ }
227
+
225
228
  static void write_value(struct http_parser *hp,
226
229
  const char *buffer, const char *p)
227
230
  {
@@ -248,7 +251,9 @@ static void write_value(struct http_parser *hp,
248
251
  f = uncommon_field(field, flen);
249
252
  } else if (f == g_http_connection) {
250
253
  hp_keepalive_connection(hp, v);
251
- } else if (f == g_content_length) {
254
+ } else if (f == g_content_length && !HP_FL_TEST(hp, CHUNKED)) {
255
+ if (hp->len.content)
256
+ parser_raise(eHttpParserError, "Content-Length already set");
252
257
  hp->len.content = parse_length(RSTRING_PTR(v), RSTRING_LEN(v));
253
258
  if (hp->len.content < 0)
254
259
  parser_raise(eHttpParserError, "invalid Content-Length");
@@ -256,9 +261,30 @@ static void write_value(struct http_parser *hp,
256
261
  HP_FL_SET(hp, HASBODY);
257
262
  hp_invalid_if_trailer(hp);
258
263
  } else if (f == g_http_transfer_encoding) {
259
- if (STR_CSTR_CASE_EQ(v, "chunked")) {
264
+ if (is_chunked(v)) {
265
+ if (HP_FL_TEST(hp, CHUNKED))
266
+ /*
267
+ * RFC 7230 3.3.1:
268
+ * A sender MUST NOT apply chunked more than once to a message body
269
+ * (i.e., chunking an already chunked message is not allowed).
270
+ */
271
+ parser_raise(eHttpParserError, "Transfer-Encoding double chunked");
272
+
260
273
  HP_FL_SET(hp, CHUNKED);
261
274
  HP_FL_SET(hp, HASBODY);
275
+
276
+ /* RFC 7230 3.3.3, 3: favor chunked if Content-Length exists */
277
+ hp->len.content = 0;
278
+ } else if (HP_FL_TEST(hp, CHUNKED)) {
279
+ /*
280
+ * RFC 7230 3.3.3, point 3 states:
281
+ * If a Transfer-Encoding header field is present in a request and
282
+ * the chunked transfer coding is not the final encoding, the
283
+ * message body length cannot be determined reliably; the server
284
+ * MUST respond with the 400 (Bad Request) status code and then
285
+ * close the connection.
286
+ */
287
+ parser_raise(eHttpParserError, "invalid Transfer-Encoding");
262
288
  }
263
289
  hp_invalid_if_trailer(hp);
264
290
  } else if (f == g_http_trailer) {
@@ -287,12 +313,12 @@ static void write_value(struct http_parser *hp,
287
313
  /** Machine **/
288
314
 
289
315
 
290
- #line 394 "unicorn_http.rl"
316
+ #line 420 "unicorn_http.rl"
291
317
 
292
318
 
293
319
  /** Data **/
294
320
 
295
- #line 296 "unicorn_http.c"
321
+ #line 322 "unicorn_http.c"
296
322
  static const int http_parser_start = 1;
297
323
  static const int http_parser_first_final = 122;
298
324
  static const int http_parser_error = 0;
@@ -303,7 +329,7 @@ static const int http_parser_en_Trailers = 114;
303
329
  static const int http_parser_en_main = 1;
304
330
 
305
331
 
306
- #line 398 "unicorn_http.rl"
332
+ #line 424 "unicorn_http.rl"
307
333
 
308
334
  static void http_parser_init(struct http_parser *hp)
309
335
  {
@@ -316,12 +342,12 @@ static void http_parser_init(struct http_parser *hp)
316
342
  hp->len.content = 0;
317
343
  hp->cont = Qfalse; /* zero on MRI, should be optimized away by above */
318
344
 
319
- #line 320 "unicorn_http.c"
345
+ #line 346 "unicorn_http.c"
320
346
  {
321
347
  cs = http_parser_start;
322
348
  }
323
349
 
324
- #line 410 "unicorn_http.rl"
350
+ #line 436 "unicorn_http.rl"
325
351
  hp->cs = cs;
326
352
  }
327
353
 
@@ -349,7 +375,7 @@ http_parser_execute(struct http_parser *hp, char *buffer, size_t len)
349
375
  goto skip_chunk_data_hack;
350
376
  }
351
377
 
352
- #line 353 "unicorn_http.c"
378
+ #line 379 "unicorn_http.c"
353
379
  {
354
380
  if ( p == pe )
355
381
  goto _test_eof;
@@ -384,14 +410,14 @@ st0:
384
410
  cs = 0;
385
411
  goto _out;
386
412
  tr0:
387
- #line 290 "unicorn_http.rl"
413
+ #line 316 "unicorn_http.rl"
388
414
  {MARK(mark, p); }
389
415
  goto st2;
390
416
  st2:
391
417
  if ( ++p == pe )
392
418
  goto _test_eof2;
393
419
  case 2:
394
- #line 395 "unicorn_http.c"
420
+ #line 421 "unicorn_http.c"
395
421
  switch( (*p) ) {
396
422
  case 32: goto tr3;
397
423
  case 33: goto st49;
@@ -417,14 +443,14 @@ case 2:
417
443
  goto st49;
418
444
  goto st0;
419
445
  tr3:
420
- #line 299 "unicorn_http.rl"
446
+ #line 325 "unicorn_http.rl"
421
447
  { request_method(hp, PTR_TO(mark), LEN(mark, p)); }
422
448
  goto st3;
423
449
  st3:
424
450
  if ( ++p == pe )
425
451
  goto _test_eof3;
426
452
  case 3:
427
- #line 428 "unicorn_http.c"
453
+ #line 454 "unicorn_http.c"
428
454
  switch( (*p) ) {
429
455
  case 42: goto tr5;
430
456
  case 47: goto tr6;
@@ -433,21 +459,21 @@ case 3:
433
459
  }
434
460
  goto st0;
435
461
  tr5:
436
- #line 290 "unicorn_http.rl"
462
+ #line 316 "unicorn_http.rl"
437
463
  {MARK(mark, p); }
438
464
  goto st4;
439
465
  st4:
440
466
  if ( ++p == pe )
441
467
  goto _test_eof4;
442
468
  case 4:
443
- #line 444 "unicorn_http.c"
469
+ #line 470 "unicorn_http.c"
444
470
  switch( (*p) ) {
445
471
  case 32: goto tr8;
446
472
  case 35: goto tr9;
447
473
  }
448
474
  goto st0;
449
475
  tr8:
450
- #line 304 "unicorn_http.rl"
476
+ #line 330 "unicorn_http.rl"
451
477
  {
452
478
  VALUE str;
453
479
 
@@ -465,23 +491,23 @@ tr8:
465
491
  }
466
492
  goto st5;
467
493
  tr42:
468
- #line 290 "unicorn_http.rl"
494
+ #line 316 "unicorn_http.rl"
469
495
  {MARK(mark, p); }
470
- #line 319 "unicorn_http.rl"
496
+ #line 345 "unicorn_http.rl"
471
497
  {
472
498
  VALIDATE_MAX_URI_LENGTH(LEN(mark, p), FRAGMENT);
473
499
  rb_hash_aset(hp->env, g_fragment, STR_NEW(mark, p));
474
500
  }
475
501
  goto st5;
476
502
  tr45:
477
- #line 319 "unicorn_http.rl"
503
+ #line 345 "unicorn_http.rl"
478
504
  {
479
505
  VALIDATE_MAX_URI_LENGTH(LEN(mark, p), FRAGMENT);
480
506
  rb_hash_aset(hp->env, g_fragment, STR_NEW(mark, p));
481
507
  }
482
508
  goto st5;
483
509
  tr49:
484
- #line 329 "unicorn_http.rl"
510
+ #line 355 "unicorn_http.rl"
485
511
  {
486
512
  VALUE val;
487
513
 
@@ -492,7 +518,7 @@ tr49:
492
518
  if (!STR_CSTR_EQ(val, "*"))
493
519
  rb_hash_aset(hp->env, g_path_info, val);
494
520
  }
495
- #line 304 "unicorn_http.rl"
521
+ #line 330 "unicorn_http.rl"
496
522
  {
497
523
  VALUE str;
498
524
 
@@ -510,14 +536,14 @@ tr49:
510
536
  }
511
537
  goto st5;
512
538
  tr55:
513
- #line 323 "unicorn_http.rl"
539
+ #line 349 "unicorn_http.rl"
514
540
  {MARK(start.query, p); }
515
- #line 324 "unicorn_http.rl"
541
+ #line 350 "unicorn_http.rl"
516
542
  {
517
543
  VALIDATE_MAX_URI_LENGTH(LEN(start.query, p), QUERY_STRING);
518
544
  rb_hash_aset(hp->env, g_query_string, STR_NEW(start.query, p));
519
545
  }
520
- #line 304 "unicorn_http.rl"
546
+ #line 330 "unicorn_http.rl"
521
547
  {
522
548
  VALUE str;
523
549
 
@@ -535,12 +561,12 @@ tr55:
535
561
  }
536
562
  goto st5;
537
563
  tr59:
538
- #line 324 "unicorn_http.rl"
564
+ #line 350 "unicorn_http.rl"
539
565
  {
540
566
  VALIDATE_MAX_URI_LENGTH(LEN(start.query, p), QUERY_STRING);
541
567
  rb_hash_aset(hp->env, g_query_string, STR_NEW(start.query, p));
542
568
  }
543
- #line 304 "unicorn_http.rl"
569
+ #line 330 "unicorn_http.rl"
544
570
  {
545
571
  VALUE str;
546
572
 
@@ -561,19 +587,19 @@ st5:
561
587
  if ( ++p == pe )
562
588
  goto _test_eof5;
563
589
  case 5:
564
- #line 565 "unicorn_http.c"
590
+ #line 591 "unicorn_http.c"
565
591
  if ( (*p) == 72 )
566
592
  goto tr10;
567
593
  goto st0;
568
594
  tr10:
569
- #line 290 "unicorn_http.rl"
595
+ #line 316 "unicorn_http.rl"
570
596
  {MARK(mark, p); }
571
597
  goto st6;
572
598
  st6:
573
599
  if ( ++p == pe )
574
600
  goto _test_eof6;
575
601
  case 6:
576
- #line 577 "unicorn_http.c"
602
+ #line 603 "unicorn_http.c"
577
603
  if ( (*p) == 84 )
578
604
  goto st7;
579
605
  goto st0;
@@ -633,34 +659,34 @@ case 13:
633
659
  goto st13;
634
660
  goto st0;
635
661
  tr18:
636
- #line 328 "unicorn_http.rl"
662
+ #line 354 "unicorn_http.rl"
637
663
  { http_version(hp, PTR_TO(mark), LEN(mark, p)); }
638
664
  goto st14;
639
665
  tr26:
640
- #line 296 "unicorn_http.rl"
666
+ #line 322 "unicorn_http.rl"
641
667
  { MARK(mark, p); }
642
- #line 298 "unicorn_http.rl"
668
+ #line 324 "unicorn_http.rl"
643
669
  { write_cont_value(hp, buffer, p); }
644
670
  goto st14;
645
671
  tr29:
646
- #line 298 "unicorn_http.rl"
672
+ #line 324 "unicorn_http.rl"
647
673
  { write_cont_value(hp, buffer, p); }
648
674
  goto st14;
649
675
  tr36:
650
- #line 296 "unicorn_http.rl"
676
+ #line 322 "unicorn_http.rl"
651
677
  { MARK(mark, p); }
652
- #line 297 "unicorn_http.rl"
678
+ #line 323 "unicorn_http.rl"
653
679
  { write_value(hp, buffer, p); }
654
680
  goto st14;
655
681
  tr39:
656
- #line 297 "unicorn_http.rl"
682
+ #line 323 "unicorn_http.rl"
657
683
  { write_value(hp, buffer, p); }
658
684
  goto st14;
659
685
  st14:
660
686
  if ( ++p == pe )
661
687
  goto _test_eof14;
662
688
  case 14:
663
- #line 664 "unicorn_http.c"
689
+ #line 690 "unicorn_http.c"
664
690
  switch( (*p) ) {
665
691
  case 9: goto st15;
666
692
  case 10: goto tr21;
@@ -689,14 +715,14 @@ case 14:
689
715
  goto tr23;
690
716
  goto st0;
691
717
  tr25:
692
- #line 296 "unicorn_http.rl"
718
+ #line 322 "unicorn_http.rl"
693
719
  { MARK(mark, p); }
694
720
  goto st15;
695
721
  st15:
696
722
  if ( ++p == pe )
697
723
  goto _test_eof15;
698
724
  case 15:
699
- #line 700 "unicorn_http.c"
725
+ #line 726 "unicorn_http.c"
700
726
  switch( (*p) ) {
701
727
  case 9: goto tr25;
702
728
  case 10: goto tr26;
@@ -708,14 +734,14 @@ case 15:
708
734
  goto st0;
709
735
  goto tr24;
710
736
  tr24:
711
- #line 296 "unicorn_http.rl"
737
+ #line 322 "unicorn_http.rl"
712
738
  { MARK(mark, p); }
713
739
  goto st16;
714
740
  st16:
715
741
  if ( ++p == pe )
716
742
  goto _test_eof16;
717
743
  case 16:
718
- #line 719 "unicorn_http.c"
744
+ #line 745 "unicorn_http.c"
719
745
  switch( (*p) ) {
720
746
  case 10: goto tr29;
721
747
  case 13: goto tr30;
@@ -728,39 +754,39 @@ case 16:
728
754
  goto st0;
729
755
  goto st16;
730
756
  tr19:
731
- #line 328 "unicorn_http.rl"
757
+ #line 354 "unicorn_http.rl"
732
758
  { http_version(hp, PTR_TO(mark), LEN(mark, p)); }
733
759
  goto st17;
734
760
  tr27:
735
- #line 296 "unicorn_http.rl"
761
+ #line 322 "unicorn_http.rl"
736
762
  { MARK(mark, p); }
737
- #line 298 "unicorn_http.rl"
763
+ #line 324 "unicorn_http.rl"
738
764
  { write_cont_value(hp, buffer, p); }
739
765
  goto st17;
740
766
  tr30:
741
- #line 298 "unicorn_http.rl"
767
+ #line 324 "unicorn_http.rl"
742
768
  { write_cont_value(hp, buffer, p); }
743
769
  goto st17;
744
770
  tr37:
745
- #line 296 "unicorn_http.rl"
771
+ #line 322 "unicorn_http.rl"
746
772
  { MARK(mark, p); }
747
- #line 297 "unicorn_http.rl"
773
+ #line 323 "unicorn_http.rl"
748
774
  { write_value(hp, buffer, p); }
749
775
  goto st17;
750
776
  tr40:
751
- #line 297 "unicorn_http.rl"
777
+ #line 323 "unicorn_http.rl"
752
778
  { write_value(hp, buffer, p); }
753
779
  goto st17;
754
780
  st17:
755
781
  if ( ++p == pe )
756
782
  goto _test_eof17;
757
783
  case 17:
758
- #line 759 "unicorn_http.c"
784
+ #line 785 "unicorn_http.c"
759
785
  if ( (*p) == 10 )
760
786
  goto st14;
761
787
  goto st0;
762
788
  tr21:
763
- #line 344 "unicorn_http.rl"
789
+ #line 370 "unicorn_http.rl"
764
790
  {
765
791
  finalize_header(hp);
766
792
 
@@ -781,7 +807,7 @@ tr21:
781
807
  }
782
808
  goto st122;
783
809
  tr104:
784
- #line 304 "unicorn_http.rl"
810
+ #line 330 "unicorn_http.rl"
785
811
  {
786
812
  VALUE str;
787
813
 
@@ -797,7 +823,7 @@ tr104:
797
823
  rb_hash_aset(hp->env, g_request_path, str);
798
824
  }
799
825
  }
800
- #line 344 "unicorn_http.rl"
826
+ #line 370 "unicorn_http.rl"
801
827
  {
802
828
  finalize_header(hp);
803
829
 
@@ -818,14 +844,14 @@ tr104:
818
844
  }
819
845
  goto st122;
820
846
  tr108:
821
- #line 290 "unicorn_http.rl"
847
+ #line 316 "unicorn_http.rl"
822
848
  {MARK(mark, p); }
823
- #line 319 "unicorn_http.rl"
849
+ #line 345 "unicorn_http.rl"
824
850
  {
825
851
  VALIDATE_MAX_URI_LENGTH(LEN(mark, p), FRAGMENT);
826
852
  rb_hash_aset(hp->env, g_fragment, STR_NEW(mark, p));
827
853
  }
828
- #line 344 "unicorn_http.rl"
854
+ #line 370 "unicorn_http.rl"
829
855
  {
830
856
  finalize_header(hp);
831
857
 
@@ -846,12 +872,12 @@ tr108:
846
872
  }
847
873
  goto st122;
848
874
  tr112:
849
- #line 319 "unicorn_http.rl"
875
+ #line 345 "unicorn_http.rl"
850
876
  {
851
877
  VALIDATE_MAX_URI_LENGTH(LEN(mark, p), FRAGMENT);
852
878
  rb_hash_aset(hp->env, g_fragment, STR_NEW(mark, p));
853
879
  }
854
- #line 344 "unicorn_http.rl"
880
+ #line 370 "unicorn_http.rl"
855
881
  {
856
882
  finalize_header(hp);
857
883
 
@@ -872,7 +898,7 @@ tr112:
872
898
  }
873
899
  goto st122;
874
900
  tr117:
875
- #line 329 "unicorn_http.rl"
901
+ #line 355 "unicorn_http.rl"
876
902
  {
877
903
  VALUE val;
878
904
 
@@ -883,7 +909,7 @@ tr117:
883
909
  if (!STR_CSTR_EQ(val, "*"))
884
910
  rb_hash_aset(hp->env, g_path_info, val);
885
911
  }
886
- #line 304 "unicorn_http.rl"
912
+ #line 330 "unicorn_http.rl"
887
913
  {
888
914
  VALUE str;
889
915
 
@@ -899,7 +925,7 @@ tr117:
899
925
  rb_hash_aset(hp->env, g_request_path, str);
900
926
  }
901
927
  }
902
- #line 344 "unicorn_http.rl"
928
+ #line 370 "unicorn_http.rl"
903
929
  {
904
930
  finalize_header(hp);
905
931
 
@@ -920,14 +946,14 @@ tr117:
920
946
  }
921
947
  goto st122;
922
948
  tr124:
923
- #line 323 "unicorn_http.rl"
949
+ #line 349 "unicorn_http.rl"
924
950
  {MARK(start.query, p); }
925
- #line 324 "unicorn_http.rl"
951
+ #line 350 "unicorn_http.rl"
926
952
  {
927
953
  VALIDATE_MAX_URI_LENGTH(LEN(start.query, p), QUERY_STRING);
928
954
  rb_hash_aset(hp->env, g_query_string, STR_NEW(start.query, p));
929
955
  }
930
- #line 304 "unicorn_http.rl"
956
+ #line 330 "unicorn_http.rl"
931
957
  {
932
958
  VALUE str;
933
959
 
@@ -943,7 +969,7 @@ tr124:
943
969
  rb_hash_aset(hp->env, g_request_path, str);
944
970
  }
945
971
  }
946
- #line 344 "unicorn_http.rl"
972
+ #line 370 "unicorn_http.rl"
947
973
  {
948
974
  finalize_header(hp);
949
975
 
@@ -964,12 +990,12 @@ tr124:
964
990
  }
965
991
  goto st122;
966
992
  tr129:
967
- #line 324 "unicorn_http.rl"
993
+ #line 350 "unicorn_http.rl"
968
994
  {
969
995
  VALIDATE_MAX_URI_LENGTH(LEN(start.query, p), QUERY_STRING);
970
996
  rb_hash_aset(hp->env, g_query_string, STR_NEW(start.query, p));
971
997
  }
972
- #line 304 "unicorn_http.rl"
998
+ #line 330 "unicorn_http.rl"
973
999
  {
974
1000
  VALUE str;
975
1001
 
@@ -985,7 +1011,7 @@ tr129:
985
1011
  rb_hash_aset(hp->env, g_request_path, str);
986
1012
  }
987
1013
  }
988
- #line 344 "unicorn_http.rl"
1014
+ #line 370 "unicorn_http.rl"
989
1015
  {
990
1016
  finalize_header(hp);
991
1017
 
@@ -1009,10 +1035,10 @@ st122:
1009
1035
  if ( ++p == pe )
1010
1036
  goto _test_eof122;
1011
1037
  case 122:
1012
- #line 1013 "unicorn_http.c"
1038
+ #line 1039 "unicorn_http.c"
1013
1039
  goto st0;
1014
1040
  tr105:
1015
- #line 304 "unicorn_http.rl"
1041
+ #line 330 "unicorn_http.rl"
1016
1042
  {
1017
1043
  VALUE str;
1018
1044
 
@@ -1030,23 +1056,23 @@ tr105:
1030
1056
  }
1031
1057
  goto st18;
1032
1058
  tr109:
1033
- #line 290 "unicorn_http.rl"
1059
+ #line 316 "unicorn_http.rl"
1034
1060
  {MARK(mark, p); }
1035
- #line 319 "unicorn_http.rl"
1061
+ #line 345 "unicorn_http.rl"
1036
1062
  {
1037
1063
  VALIDATE_MAX_URI_LENGTH(LEN(mark, p), FRAGMENT);
1038
1064
  rb_hash_aset(hp->env, g_fragment, STR_NEW(mark, p));
1039
1065
  }
1040
1066
  goto st18;
1041
1067
  tr113:
1042
- #line 319 "unicorn_http.rl"
1068
+ #line 345 "unicorn_http.rl"
1043
1069
  {
1044
1070
  VALIDATE_MAX_URI_LENGTH(LEN(mark, p), FRAGMENT);
1045
1071
  rb_hash_aset(hp->env, g_fragment, STR_NEW(mark, p));
1046
1072
  }
1047
1073
  goto st18;
1048
1074
  tr118:
1049
- #line 329 "unicorn_http.rl"
1075
+ #line 355 "unicorn_http.rl"
1050
1076
  {
1051
1077
  VALUE val;
1052
1078
 
@@ -1057,7 +1083,7 @@ tr118:
1057
1083
  if (!STR_CSTR_EQ(val, "*"))
1058
1084
  rb_hash_aset(hp->env, g_path_info, val);
1059
1085
  }
1060
- #line 304 "unicorn_http.rl"
1086
+ #line 330 "unicorn_http.rl"
1061
1087
  {
1062
1088
  VALUE str;
1063
1089
 
@@ -1075,14 +1101,14 @@ tr118:
1075
1101
  }
1076
1102
  goto st18;
1077
1103
  tr125:
1078
- #line 323 "unicorn_http.rl"
1104
+ #line 349 "unicorn_http.rl"
1079
1105
  {MARK(start.query, p); }
1080
- #line 324 "unicorn_http.rl"
1106
+ #line 350 "unicorn_http.rl"
1081
1107
  {
1082
1108
  VALIDATE_MAX_URI_LENGTH(LEN(start.query, p), QUERY_STRING);
1083
1109
  rb_hash_aset(hp->env, g_query_string, STR_NEW(start.query, p));
1084
1110
  }
1085
- #line 304 "unicorn_http.rl"
1111
+ #line 330 "unicorn_http.rl"
1086
1112
  {
1087
1113
  VALUE str;
1088
1114
 
@@ -1100,12 +1126,12 @@ tr125:
1100
1126
  }
1101
1127
  goto st18;
1102
1128
  tr130:
1103
- #line 324 "unicorn_http.rl"
1129
+ #line 350 "unicorn_http.rl"
1104
1130
  {
1105
1131
  VALIDATE_MAX_URI_LENGTH(LEN(start.query, p), QUERY_STRING);
1106
1132
  rb_hash_aset(hp->env, g_query_string, STR_NEW(start.query, p));
1107
1133
  }
1108
- #line 304 "unicorn_http.rl"
1134
+ #line 330 "unicorn_http.rl"
1109
1135
  {
1110
1136
  VALUE str;
1111
1137
 
@@ -1126,25 +1152,25 @@ st18:
1126
1152
  if ( ++p == pe )
1127
1153
  goto _test_eof18;
1128
1154
  case 18:
1129
- #line 1130 "unicorn_http.c"
1155
+ #line 1156 "unicorn_http.c"
1130
1156
  if ( (*p) == 10 )
1131
1157
  goto tr21;
1132
1158
  goto st0;
1133
1159
  tr23:
1134
- #line 292 "unicorn_http.rl"
1160
+ #line 318 "unicorn_http.rl"
1135
1161
  { MARK(start.field, p); }
1136
- #line 293 "unicorn_http.rl"
1162
+ #line 319 "unicorn_http.rl"
1137
1163
  { snake_upcase_char(deconst(p)); }
1138
1164
  goto st19;
1139
1165
  tr32:
1140
- #line 293 "unicorn_http.rl"
1166
+ #line 319 "unicorn_http.rl"
1141
1167
  { snake_upcase_char(deconst(p)); }
1142
1168
  goto st19;
1143
1169
  st19:
1144
1170
  if ( ++p == pe )
1145
1171
  goto _test_eof19;
1146
1172
  case 19:
1147
- #line 1148 "unicorn_http.c"
1173
+ #line 1174 "unicorn_http.c"
1148
1174
  switch( (*p) ) {
1149
1175
  case 33: goto tr32;
1150
1176
  case 58: goto tr33;
@@ -1170,18 +1196,18 @@ case 19:
1170
1196
  goto tr32;
1171
1197
  goto st0;
1172
1198
  tr35:
1173
- #line 296 "unicorn_http.rl"
1199
+ #line 322 "unicorn_http.rl"
1174
1200
  { MARK(mark, p); }
1175
1201
  goto st20;
1176
1202
  tr33:
1177
- #line 295 "unicorn_http.rl"
1203
+ #line 321 "unicorn_http.rl"
1178
1204
  { hp->s.field_len = LEN(start.field, p); }
1179
1205
  goto st20;
1180
1206
  st20:
1181
1207
  if ( ++p == pe )
1182
1208
  goto _test_eof20;
1183
1209
  case 20:
1184
- #line 1185 "unicorn_http.c"
1210
+ #line 1211 "unicorn_http.c"
1185
1211
  switch( (*p) ) {
1186
1212
  case 9: goto tr35;
1187
1213
  case 10: goto tr36;
@@ -1193,14 +1219,14 @@ case 20:
1193
1219
  goto st0;
1194
1220
  goto tr34;
1195
1221
  tr34:
1196
- #line 296 "unicorn_http.rl"
1222
+ #line 322 "unicorn_http.rl"
1197
1223
  { MARK(mark, p); }
1198
1224
  goto st21;
1199
1225
  st21:
1200
1226
  if ( ++p == pe )
1201
1227
  goto _test_eof21;
1202
1228
  case 21:
1203
- #line 1204 "unicorn_http.c"
1229
+ #line 1230 "unicorn_http.c"
1204
1230
  switch( (*p) ) {
1205
1231
  case 10: goto tr39;
1206
1232
  case 13: goto tr40;
@@ -1213,7 +1239,7 @@ case 21:
1213
1239
  goto st0;
1214
1240
  goto st21;
1215
1241
  tr9:
1216
- #line 304 "unicorn_http.rl"
1242
+ #line 330 "unicorn_http.rl"
1217
1243
  {
1218
1244
  VALUE str;
1219
1245
 
@@ -1231,7 +1257,7 @@ tr9:
1231
1257
  }
1232
1258
  goto st22;
1233
1259
  tr50:
1234
- #line 329 "unicorn_http.rl"
1260
+ #line 355 "unicorn_http.rl"
1235
1261
  {
1236
1262
  VALUE val;
1237
1263
 
@@ -1242,7 +1268,7 @@ tr50:
1242
1268
  if (!STR_CSTR_EQ(val, "*"))
1243
1269
  rb_hash_aset(hp->env, g_path_info, val);
1244
1270
  }
1245
- #line 304 "unicorn_http.rl"
1271
+ #line 330 "unicorn_http.rl"
1246
1272
  {
1247
1273
  VALUE str;
1248
1274
 
@@ -1260,14 +1286,14 @@ tr50:
1260
1286
  }
1261
1287
  goto st22;
1262
1288
  tr56:
1263
- #line 323 "unicorn_http.rl"
1289
+ #line 349 "unicorn_http.rl"
1264
1290
  {MARK(start.query, p); }
1265
- #line 324 "unicorn_http.rl"
1291
+ #line 350 "unicorn_http.rl"
1266
1292
  {
1267
1293
  VALIDATE_MAX_URI_LENGTH(LEN(start.query, p), QUERY_STRING);
1268
1294
  rb_hash_aset(hp->env, g_query_string, STR_NEW(start.query, p));
1269
1295
  }
1270
- #line 304 "unicorn_http.rl"
1296
+ #line 330 "unicorn_http.rl"
1271
1297
  {
1272
1298
  VALUE str;
1273
1299
 
@@ -1285,12 +1311,12 @@ tr56:
1285
1311
  }
1286
1312
  goto st22;
1287
1313
  tr60:
1288
- #line 324 "unicorn_http.rl"
1314
+ #line 350 "unicorn_http.rl"
1289
1315
  {
1290
1316
  VALIDATE_MAX_URI_LENGTH(LEN(start.query, p), QUERY_STRING);
1291
1317
  rb_hash_aset(hp->env, g_query_string, STR_NEW(start.query, p));
1292
1318
  }
1293
- #line 304 "unicorn_http.rl"
1319
+ #line 330 "unicorn_http.rl"
1294
1320
  {
1295
1321
  VALUE str;
1296
1322
 
@@ -1311,7 +1337,7 @@ st22:
1311
1337
  if ( ++p == pe )
1312
1338
  goto _test_eof22;
1313
1339
  case 22:
1314
- #line 1315 "unicorn_http.c"
1340
+ #line 1341 "unicorn_http.c"
1315
1341
  switch( (*p) ) {
1316
1342
  case 32: goto tr42;
1317
1343
  case 35: goto st0;
@@ -1322,14 +1348,14 @@ case 22:
1322
1348
  goto st0;
1323
1349
  goto tr41;
1324
1350
  tr41:
1325
- #line 290 "unicorn_http.rl"
1351
+ #line 316 "unicorn_http.rl"
1326
1352
  {MARK(mark, p); }
1327
1353
  goto st23;
1328
1354
  st23:
1329
1355
  if ( ++p == pe )
1330
1356
  goto _test_eof23;
1331
1357
  case 23:
1332
- #line 1333 "unicorn_http.c"
1358
+ #line 1359 "unicorn_http.c"
1333
1359
  switch( (*p) ) {
1334
1360
  case 32: goto tr45;
1335
1361
  case 35: goto st0;
@@ -1340,14 +1366,14 @@ case 23:
1340
1366
  goto st0;
1341
1367
  goto st23;
1342
1368
  tr43:
1343
- #line 290 "unicorn_http.rl"
1369
+ #line 316 "unicorn_http.rl"
1344
1370
  {MARK(mark, p); }
1345
1371
  goto st24;
1346
1372
  st24:
1347
1373
  if ( ++p == pe )
1348
1374
  goto _test_eof24;
1349
1375
  case 24:
1350
- #line 1351 "unicorn_http.c"
1376
+ #line 1377 "unicorn_http.c"
1351
1377
  if ( (*p) < 65 ) {
1352
1378
  if ( 48 <= (*p) && (*p) <= 57 )
1353
1379
  goto st25;
@@ -1371,20 +1397,20 @@ case 25:
1371
1397
  goto st23;
1372
1398
  goto st0;
1373
1399
  tr6:
1374
- #line 290 "unicorn_http.rl"
1400
+ #line 316 "unicorn_http.rl"
1375
1401
  {MARK(mark, p); }
1376
1402
  goto st26;
1377
1403
  tr76:
1378
- #line 303 "unicorn_http.rl"
1404
+ #line 329 "unicorn_http.rl"
1379
1405
  { rb_hash_aset(hp->env, g_http_host, STR_NEW(mark, p)); }
1380
- #line 290 "unicorn_http.rl"
1406
+ #line 316 "unicorn_http.rl"
1381
1407
  {MARK(mark, p); }
1382
1408
  goto st26;
1383
1409
  st26:
1384
1410
  if ( ++p == pe )
1385
1411
  goto _test_eof26;
1386
1412
  case 26:
1387
- #line 1388 "unicorn_http.c"
1413
+ #line 1414 "unicorn_http.c"
1388
1414
  switch( (*p) ) {
1389
1415
  case 32: goto tr49;
1390
1416
  case 35: goto tr50;
@@ -1422,7 +1448,7 @@ case 28:
1422
1448
  goto st26;
1423
1449
  goto st0;
1424
1450
  tr52:
1425
- #line 329 "unicorn_http.rl"
1451
+ #line 355 "unicorn_http.rl"
1426
1452
  {
1427
1453
  VALUE val;
1428
1454
 
@@ -1438,7 +1464,7 @@ st29:
1438
1464
  if ( ++p == pe )
1439
1465
  goto _test_eof29;
1440
1466
  case 29:
1441
- #line 1442 "unicorn_http.c"
1467
+ #line 1468 "unicorn_http.c"
1442
1468
  switch( (*p) ) {
1443
1469
  case 32: goto tr55;
1444
1470
  case 35: goto tr56;
@@ -1449,14 +1475,14 @@ case 29:
1449
1475
  goto st0;
1450
1476
  goto tr54;
1451
1477
  tr54:
1452
- #line 323 "unicorn_http.rl"
1478
+ #line 349 "unicorn_http.rl"
1453
1479
  {MARK(start.query, p); }
1454
1480
  goto st30;
1455
1481
  st30:
1456
1482
  if ( ++p == pe )
1457
1483
  goto _test_eof30;
1458
1484
  case 30:
1459
- #line 1460 "unicorn_http.c"
1485
+ #line 1486 "unicorn_http.c"
1460
1486
  switch( (*p) ) {
1461
1487
  case 32: goto tr59;
1462
1488
  case 35: goto tr60;
@@ -1467,14 +1493,14 @@ case 30:
1467
1493
  goto st0;
1468
1494
  goto st30;
1469
1495
  tr57:
1470
- #line 323 "unicorn_http.rl"
1496
+ #line 349 "unicorn_http.rl"
1471
1497
  {MARK(start.query, p); }
1472
1498
  goto st31;
1473
1499
  st31:
1474
1500
  if ( ++p == pe )
1475
1501
  goto _test_eof31;
1476
1502
  case 31:
1477
- #line 1478 "unicorn_http.c"
1503
+ #line 1504 "unicorn_http.c"
1478
1504
  if ( (*p) < 65 ) {
1479
1505
  if ( 48 <= (*p) && (*p) <= 57 )
1480
1506
  goto st32;
@@ -1498,58 +1524,58 @@ case 32:
1498
1524
  goto st30;
1499
1525
  goto st0;
1500
1526
  tr7:
1501
- #line 290 "unicorn_http.rl"
1527
+ #line 316 "unicorn_http.rl"
1502
1528
  {MARK(mark, p); }
1503
- #line 294 "unicorn_http.rl"
1529
+ #line 320 "unicorn_http.rl"
1504
1530
  { downcase_char(deconst(p)); }
1505
1531
  goto st33;
1506
1532
  st33:
1507
1533
  if ( ++p == pe )
1508
1534
  goto _test_eof33;
1509
1535
  case 33:
1510
- #line 1511 "unicorn_http.c"
1536
+ #line 1537 "unicorn_http.c"
1511
1537
  switch( (*p) ) {
1512
1538
  case 84: goto tr63;
1513
1539
  case 116: goto tr63;
1514
1540
  }
1515
1541
  goto st0;
1516
1542
  tr63:
1517
- #line 294 "unicorn_http.rl"
1543
+ #line 320 "unicorn_http.rl"
1518
1544
  { downcase_char(deconst(p)); }
1519
1545
  goto st34;
1520
1546
  st34:
1521
1547
  if ( ++p == pe )
1522
1548
  goto _test_eof34;
1523
1549
  case 34:
1524
- #line 1525 "unicorn_http.c"
1550
+ #line 1551 "unicorn_http.c"
1525
1551
  switch( (*p) ) {
1526
1552
  case 84: goto tr64;
1527
1553
  case 116: goto tr64;
1528
1554
  }
1529
1555
  goto st0;
1530
1556
  tr64:
1531
- #line 294 "unicorn_http.rl"
1557
+ #line 320 "unicorn_http.rl"
1532
1558
  { downcase_char(deconst(p)); }
1533
1559
  goto st35;
1534
1560
  st35:
1535
1561
  if ( ++p == pe )
1536
1562
  goto _test_eof35;
1537
1563
  case 35:
1538
- #line 1539 "unicorn_http.c"
1564
+ #line 1565 "unicorn_http.c"
1539
1565
  switch( (*p) ) {
1540
1566
  case 80: goto tr65;
1541
1567
  case 112: goto tr65;
1542
1568
  }
1543
1569
  goto st0;
1544
1570
  tr65:
1545
- #line 294 "unicorn_http.rl"
1571
+ #line 320 "unicorn_http.rl"
1546
1572
  { downcase_char(deconst(p)); }
1547
1573
  goto st36;
1548
1574
  st36:
1549
1575
  if ( ++p == pe )
1550
1576
  goto _test_eof36;
1551
1577
  case 36:
1552
- #line 1553 "unicorn_http.c"
1578
+ #line 1579 "unicorn_http.c"
1553
1579
  switch( (*p) ) {
1554
1580
  case 58: goto tr66;
1555
1581
  case 83: goto tr67;
@@ -1557,7 +1583,7 @@ case 36:
1557
1583
  }
1558
1584
  goto st0;
1559
1585
  tr66:
1560
- #line 300 "unicorn_http.rl"
1586
+ #line 326 "unicorn_http.rl"
1561
1587
  {
1562
1588
  rb_hash_aset(hp->env, g_rack_url_scheme, STR_NEW(mark, p));
1563
1589
  }
@@ -1566,7 +1592,7 @@ st37:
1566
1592
  if ( ++p == pe )
1567
1593
  goto _test_eof37;
1568
1594
  case 37:
1569
- #line 1570 "unicorn_http.c"
1595
+ #line 1596 "unicorn_http.c"
1570
1596
  if ( (*p) == 47 )
1571
1597
  goto st38;
1572
1598
  goto st0;
@@ -1654,14 +1680,14 @@ case 42:
1654
1680
  goto st40;
1655
1681
  goto st0;
1656
1682
  tr72:
1657
- #line 290 "unicorn_http.rl"
1683
+ #line 316 "unicorn_http.rl"
1658
1684
  {MARK(mark, p); }
1659
1685
  goto st43;
1660
1686
  st43:
1661
1687
  if ( ++p == pe )
1662
1688
  goto _test_eof43;
1663
1689
  case 43:
1664
- #line 1665 "unicorn_http.c"
1690
+ #line 1691 "unicorn_http.c"
1665
1691
  switch( (*p) ) {
1666
1692
  case 37: goto st41;
1667
1693
  case 47: goto tr76;
@@ -1713,14 +1739,14 @@ case 44:
1713
1739
  goto st0;
1714
1740
  goto st40;
1715
1741
  tr73:
1716
- #line 290 "unicorn_http.rl"
1742
+ #line 316 "unicorn_http.rl"
1717
1743
  {MARK(mark, p); }
1718
1744
  goto st45;
1719
1745
  st45:
1720
1746
  if ( ++p == pe )
1721
1747
  goto _test_eof45;
1722
1748
  case 45:
1723
- #line 1724 "unicorn_http.c"
1749
+ #line 1750 "unicorn_http.c"
1724
1750
  switch( (*p) ) {
1725
1751
  case 37: goto st41;
1726
1752
  case 47: goto st0;
@@ -1798,14 +1824,14 @@ case 47:
1798
1824
  goto st0;
1799
1825
  goto st40;
1800
1826
  tr67:
1801
- #line 294 "unicorn_http.rl"
1827
+ #line 320 "unicorn_http.rl"
1802
1828
  { downcase_char(deconst(p)); }
1803
1829
  goto st48;
1804
1830
  st48:
1805
1831
  if ( ++p == pe )
1806
1832
  goto _test_eof48;
1807
1833
  case 48:
1808
- #line 1809 "unicorn_http.c"
1834
+ #line 1835 "unicorn_http.c"
1809
1835
  if ( (*p) == 58 )
1810
1836
  goto tr66;
1811
1837
  goto st0;
@@ -2321,14 +2347,14 @@ case 67:
2321
2347
  goto tr3;
2322
2348
  goto st0;
2323
2349
  tr2:
2324
- #line 290 "unicorn_http.rl"
2350
+ #line 316 "unicorn_http.rl"
2325
2351
  {MARK(mark, p); }
2326
2352
  goto st68;
2327
2353
  st68:
2328
2354
  if ( ++p == pe )
2329
2355
  goto _test_eof68;
2330
2356
  case 68:
2331
- #line 2332 "unicorn_http.c"
2357
+ #line 2358 "unicorn_http.c"
2332
2358
  switch( (*p) ) {
2333
2359
  case 32: goto tr3;
2334
2360
  case 33: goto st49;
@@ -2412,14 +2438,14 @@ case 70:
2412
2438
  goto st51;
2413
2439
  goto st0;
2414
2440
  tr100:
2415
- #line 299 "unicorn_http.rl"
2441
+ #line 325 "unicorn_http.rl"
2416
2442
  { request_method(hp, PTR_TO(mark), LEN(mark, p)); }
2417
2443
  goto st71;
2418
2444
  st71:
2419
2445
  if ( ++p == pe )
2420
2446
  goto _test_eof71;
2421
2447
  case 71:
2422
- #line 2423 "unicorn_http.c"
2448
+ #line 2449 "unicorn_http.c"
2423
2449
  switch( (*p) ) {
2424
2450
  case 42: goto tr101;
2425
2451
  case 47: goto tr102;
@@ -2428,14 +2454,14 @@ case 71:
2428
2454
  }
2429
2455
  goto st0;
2430
2456
  tr101:
2431
- #line 290 "unicorn_http.rl"
2457
+ #line 316 "unicorn_http.rl"
2432
2458
  {MARK(mark, p); }
2433
2459
  goto st72;
2434
2460
  st72:
2435
2461
  if ( ++p == pe )
2436
2462
  goto _test_eof72;
2437
2463
  case 72:
2438
- #line 2439 "unicorn_http.c"
2464
+ #line 2465 "unicorn_http.c"
2439
2465
  switch( (*p) ) {
2440
2466
  case 10: goto tr104;
2441
2467
  case 13: goto tr105;
@@ -2444,7 +2470,7 @@ case 72:
2444
2470
  }
2445
2471
  goto st0;
2446
2472
  tr106:
2447
- #line 304 "unicorn_http.rl"
2473
+ #line 330 "unicorn_http.rl"
2448
2474
  {
2449
2475
  VALUE str;
2450
2476
 
@@ -2462,7 +2488,7 @@ tr106:
2462
2488
  }
2463
2489
  goto st73;
2464
2490
  tr119:
2465
- #line 329 "unicorn_http.rl"
2491
+ #line 355 "unicorn_http.rl"
2466
2492
  {
2467
2493
  VALUE val;
2468
2494
 
@@ -2473,7 +2499,7 @@ tr119:
2473
2499
  if (!STR_CSTR_EQ(val, "*"))
2474
2500
  rb_hash_aset(hp->env, g_path_info, val);
2475
2501
  }
2476
- #line 304 "unicorn_http.rl"
2502
+ #line 330 "unicorn_http.rl"
2477
2503
  {
2478
2504
  VALUE str;
2479
2505
 
@@ -2491,14 +2517,14 @@ tr119:
2491
2517
  }
2492
2518
  goto st73;
2493
2519
  tr126:
2494
- #line 323 "unicorn_http.rl"
2520
+ #line 349 "unicorn_http.rl"
2495
2521
  {MARK(start.query, p); }
2496
- #line 324 "unicorn_http.rl"
2522
+ #line 350 "unicorn_http.rl"
2497
2523
  {
2498
2524
  VALIDATE_MAX_URI_LENGTH(LEN(start.query, p), QUERY_STRING);
2499
2525
  rb_hash_aset(hp->env, g_query_string, STR_NEW(start.query, p));
2500
2526
  }
2501
- #line 304 "unicorn_http.rl"
2527
+ #line 330 "unicorn_http.rl"
2502
2528
  {
2503
2529
  VALUE str;
2504
2530
 
@@ -2516,12 +2542,12 @@ tr126:
2516
2542
  }
2517
2543
  goto st73;
2518
2544
  tr131:
2519
- #line 324 "unicorn_http.rl"
2545
+ #line 350 "unicorn_http.rl"
2520
2546
  {
2521
2547
  VALIDATE_MAX_URI_LENGTH(LEN(start.query, p), QUERY_STRING);
2522
2548
  rb_hash_aset(hp->env, g_query_string, STR_NEW(start.query, p));
2523
2549
  }
2524
- #line 304 "unicorn_http.rl"
2550
+ #line 330 "unicorn_http.rl"
2525
2551
  {
2526
2552
  VALUE str;
2527
2553
 
@@ -2542,7 +2568,7 @@ st73:
2542
2568
  if ( ++p == pe )
2543
2569
  goto _test_eof73;
2544
2570
  case 73:
2545
- #line 2546 "unicorn_http.c"
2571
+ #line 2572 "unicorn_http.c"
2546
2572
  switch( (*p) ) {
2547
2573
  case 10: goto tr108;
2548
2574
  case 13: goto tr109;
@@ -2555,14 +2581,14 @@ case 73:
2555
2581
  goto st0;
2556
2582
  goto tr107;
2557
2583
  tr107:
2558
- #line 290 "unicorn_http.rl"
2584
+ #line 316 "unicorn_http.rl"
2559
2585
  {MARK(mark, p); }
2560
2586
  goto st74;
2561
2587
  st74:
2562
2588
  if ( ++p == pe )
2563
2589
  goto _test_eof74;
2564
2590
  case 74:
2565
- #line 2566 "unicorn_http.c"
2591
+ #line 2592 "unicorn_http.c"
2566
2592
  switch( (*p) ) {
2567
2593
  case 10: goto tr112;
2568
2594
  case 13: goto tr113;
@@ -2575,14 +2601,14 @@ case 74:
2575
2601
  goto st0;
2576
2602
  goto st74;
2577
2603
  tr110:
2578
- #line 290 "unicorn_http.rl"
2604
+ #line 316 "unicorn_http.rl"
2579
2605
  {MARK(mark, p); }
2580
2606
  goto st75;
2581
2607
  st75:
2582
2608
  if ( ++p == pe )
2583
2609
  goto _test_eof75;
2584
2610
  case 75:
2585
- #line 2586 "unicorn_http.c"
2611
+ #line 2612 "unicorn_http.c"
2586
2612
  if ( (*p) < 65 ) {
2587
2613
  if ( 48 <= (*p) && (*p) <= 57 )
2588
2614
  goto st76;
@@ -2606,20 +2632,20 @@ case 76:
2606
2632
  goto st74;
2607
2633
  goto st0;
2608
2634
  tr102:
2609
- #line 290 "unicorn_http.rl"
2635
+ #line 316 "unicorn_http.rl"
2610
2636
  {MARK(mark, p); }
2611
2637
  goto st77;
2612
2638
  tr147:
2613
- #line 303 "unicorn_http.rl"
2639
+ #line 329 "unicorn_http.rl"
2614
2640
  { rb_hash_aset(hp->env, g_http_host, STR_NEW(mark, p)); }
2615
- #line 290 "unicorn_http.rl"
2641
+ #line 316 "unicorn_http.rl"
2616
2642
  {MARK(mark, p); }
2617
2643
  goto st77;
2618
2644
  st77:
2619
2645
  if ( ++p == pe )
2620
2646
  goto _test_eof77;
2621
2647
  case 77:
2622
- #line 2623 "unicorn_http.c"
2648
+ #line 2649 "unicorn_http.c"
2623
2649
  switch( (*p) ) {
2624
2650
  case 10: goto tr117;
2625
2651
  case 13: goto tr118;
@@ -2659,7 +2685,7 @@ case 79:
2659
2685
  goto st77;
2660
2686
  goto st0;
2661
2687
  tr121:
2662
- #line 329 "unicorn_http.rl"
2688
+ #line 355 "unicorn_http.rl"
2663
2689
  {
2664
2690
  VALUE val;
2665
2691
 
@@ -2675,7 +2701,7 @@ st80:
2675
2701
  if ( ++p == pe )
2676
2702
  goto _test_eof80;
2677
2703
  case 80:
2678
- #line 2679 "unicorn_http.c"
2704
+ #line 2705 "unicorn_http.c"
2679
2705
  switch( (*p) ) {
2680
2706
  case 10: goto tr124;
2681
2707
  case 13: goto tr125;
@@ -2688,14 +2714,14 @@ case 80:
2688
2714
  goto st0;
2689
2715
  goto tr123;
2690
2716
  tr123:
2691
- #line 323 "unicorn_http.rl"
2717
+ #line 349 "unicorn_http.rl"
2692
2718
  {MARK(start.query, p); }
2693
2719
  goto st81;
2694
2720
  st81:
2695
2721
  if ( ++p == pe )
2696
2722
  goto _test_eof81;
2697
2723
  case 81:
2698
- #line 2699 "unicorn_http.c"
2724
+ #line 2725 "unicorn_http.c"
2699
2725
  switch( (*p) ) {
2700
2726
  case 10: goto tr129;
2701
2727
  case 13: goto tr130;
@@ -2708,14 +2734,14 @@ case 81:
2708
2734
  goto st0;
2709
2735
  goto st81;
2710
2736
  tr127:
2711
- #line 323 "unicorn_http.rl"
2737
+ #line 349 "unicorn_http.rl"
2712
2738
  {MARK(start.query, p); }
2713
2739
  goto st82;
2714
2740
  st82:
2715
2741
  if ( ++p == pe )
2716
2742
  goto _test_eof82;
2717
2743
  case 82:
2718
- #line 2719 "unicorn_http.c"
2744
+ #line 2745 "unicorn_http.c"
2719
2745
  if ( (*p) < 65 ) {
2720
2746
  if ( 48 <= (*p) && (*p) <= 57 )
2721
2747
  goto st83;
@@ -2739,58 +2765,58 @@ case 83:
2739
2765
  goto st81;
2740
2766
  goto st0;
2741
2767
  tr103:
2742
- #line 290 "unicorn_http.rl"
2768
+ #line 316 "unicorn_http.rl"
2743
2769
  {MARK(mark, p); }
2744
- #line 294 "unicorn_http.rl"
2770
+ #line 320 "unicorn_http.rl"
2745
2771
  { downcase_char(deconst(p)); }
2746
2772
  goto st84;
2747
2773
  st84:
2748
2774
  if ( ++p == pe )
2749
2775
  goto _test_eof84;
2750
2776
  case 84:
2751
- #line 2752 "unicorn_http.c"
2777
+ #line 2778 "unicorn_http.c"
2752
2778
  switch( (*p) ) {
2753
2779
  case 84: goto tr134;
2754
2780
  case 116: goto tr134;
2755
2781
  }
2756
2782
  goto st0;
2757
2783
  tr134:
2758
- #line 294 "unicorn_http.rl"
2784
+ #line 320 "unicorn_http.rl"
2759
2785
  { downcase_char(deconst(p)); }
2760
2786
  goto st85;
2761
2787
  st85:
2762
2788
  if ( ++p == pe )
2763
2789
  goto _test_eof85;
2764
2790
  case 85:
2765
- #line 2766 "unicorn_http.c"
2791
+ #line 2792 "unicorn_http.c"
2766
2792
  switch( (*p) ) {
2767
2793
  case 84: goto tr135;
2768
2794
  case 116: goto tr135;
2769
2795
  }
2770
2796
  goto st0;
2771
2797
  tr135:
2772
- #line 294 "unicorn_http.rl"
2798
+ #line 320 "unicorn_http.rl"
2773
2799
  { downcase_char(deconst(p)); }
2774
2800
  goto st86;
2775
2801
  st86:
2776
2802
  if ( ++p == pe )
2777
2803
  goto _test_eof86;
2778
2804
  case 86:
2779
- #line 2780 "unicorn_http.c"
2805
+ #line 2806 "unicorn_http.c"
2780
2806
  switch( (*p) ) {
2781
2807
  case 80: goto tr136;
2782
2808
  case 112: goto tr136;
2783
2809
  }
2784
2810
  goto st0;
2785
2811
  tr136:
2786
- #line 294 "unicorn_http.rl"
2812
+ #line 320 "unicorn_http.rl"
2787
2813
  { downcase_char(deconst(p)); }
2788
2814
  goto st87;
2789
2815
  st87:
2790
2816
  if ( ++p == pe )
2791
2817
  goto _test_eof87;
2792
2818
  case 87:
2793
- #line 2794 "unicorn_http.c"
2819
+ #line 2820 "unicorn_http.c"
2794
2820
  switch( (*p) ) {
2795
2821
  case 58: goto tr137;
2796
2822
  case 83: goto tr138;
@@ -2798,7 +2824,7 @@ case 87:
2798
2824
  }
2799
2825
  goto st0;
2800
2826
  tr137:
2801
- #line 300 "unicorn_http.rl"
2827
+ #line 326 "unicorn_http.rl"
2802
2828
  {
2803
2829
  rb_hash_aset(hp->env, g_rack_url_scheme, STR_NEW(mark, p));
2804
2830
  }
@@ -2807,7 +2833,7 @@ st88:
2807
2833
  if ( ++p == pe )
2808
2834
  goto _test_eof88;
2809
2835
  case 88:
2810
- #line 2811 "unicorn_http.c"
2836
+ #line 2837 "unicorn_http.c"
2811
2837
  if ( (*p) == 47 )
2812
2838
  goto st89;
2813
2839
  goto st0;
@@ -2895,14 +2921,14 @@ case 93:
2895
2921
  goto st91;
2896
2922
  goto st0;
2897
2923
  tr143:
2898
- #line 290 "unicorn_http.rl"
2924
+ #line 316 "unicorn_http.rl"
2899
2925
  {MARK(mark, p); }
2900
2926
  goto st94;
2901
2927
  st94:
2902
2928
  if ( ++p == pe )
2903
2929
  goto _test_eof94;
2904
2930
  case 94:
2905
- #line 2906 "unicorn_http.c"
2931
+ #line 2932 "unicorn_http.c"
2906
2932
  switch( (*p) ) {
2907
2933
  case 37: goto st92;
2908
2934
  case 47: goto tr147;
@@ -2954,14 +2980,14 @@ case 95:
2954
2980
  goto st0;
2955
2981
  goto st91;
2956
2982
  tr144:
2957
- #line 290 "unicorn_http.rl"
2983
+ #line 316 "unicorn_http.rl"
2958
2984
  {MARK(mark, p); }
2959
2985
  goto st96;
2960
2986
  st96:
2961
2987
  if ( ++p == pe )
2962
2988
  goto _test_eof96;
2963
2989
  case 96:
2964
- #line 2965 "unicorn_http.c"
2990
+ #line 2991 "unicorn_http.c"
2965
2991
  switch( (*p) ) {
2966
2992
  case 37: goto st92;
2967
2993
  case 47: goto st0;
@@ -3039,14 +3065,14 @@ case 98:
3039
3065
  goto st0;
3040
3066
  goto st91;
3041
3067
  tr138:
3042
- #line 294 "unicorn_http.rl"
3068
+ #line 320 "unicorn_http.rl"
3043
3069
  { downcase_char(deconst(p)); }
3044
3070
  goto st99;
3045
3071
  st99:
3046
3072
  if ( ++p == pe )
3047
3073
  goto _test_eof99;
3048
3074
  case 99:
3049
- #line 3050 "unicorn_http.c"
3075
+ #line 3076 "unicorn_http.c"
3050
3076
  if ( (*p) == 58 )
3051
3077
  goto tr137;
3052
3078
  goto st0;
@@ -3066,7 +3092,7 @@ case 100:
3066
3092
  goto tr152;
3067
3093
  goto st0;
3068
3094
  tr151:
3069
- #line 339 "unicorn_http.rl"
3095
+ #line 365 "unicorn_http.rl"
3070
3096
  {
3071
3097
  hp->len.chunk = step_incr(hp->len.chunk, (*p), 16);
3072
3098
  if (hp->len.chunk < 0)
@@ -3077,7 +3103,7 @@ st101:
3077
3103
  if ( ++p == pe )
3078
3104
  goto _test_eof101;
3079
3105
  case 101:
3080
- #line 3081 "unicorn_http.c"
3106
+ #line 3107 "unicorn_http.c"
3081
3107
  switch( (*p) ) {
3082
3108
  case 10: goto tr153;
3083
3109
  case 13: goto st102;
@@ -3094,7 +3120,7 @@ case 101:
3094
3120
  goto tr152;
3095
3121
  goto st0;
3096
3122
  tr153:
3097
- #line 368 "unicorn_http.rl"
3123
+ #line 394 "unicorn_http.rl"
3098
3124
  {
3099
3125
  HP_FL_SET(hp, INTRAILER);
3100
3126
  cs = http_parser_en_Trailers;
@@ -3107,7 +3133,7 @@ st123:
3107
3133
  if ( ++p == pe )
3108
3134
  goto _test_eof123;
3109
3135
  case 123:
3110
- #line 3111 "unicorn_http.c"
3136
+ #line 3137 "unicorn_http.c"
3111
3137
  goto st0;
3112
3138
  st102:
3113
3139
  if ( ++p == pe )
@@ -3117,7 +3143,7 @@ case 102:
3117
3143
  goto tr153;
3118
3144
  goto st0;
3119
3145
  tr152:
3120
- #line 339 "unicorn_http.rl"
3146
+ #line 365 "unicorn_http.rl"
3121
3147
  {
3122
3148
  hp->len.chunk = step_incr(hp->len.chunk, (*p), 16);
3123
3149
  if (hp->len.chunk < 0)
@@ -3128,7 +3154,7 @@ st103:
3128
3154
  if ( ++p == pe )
3129
3155
  goto _test_eof103;
3130
3156
  case 103:
3131
- #line 3132 "unicorn_http.c"
3157
+ #line 3158 "unicorn_http.c"
3132
3158
  switch( (*p) ) {
3133
3159
  case 10: goto st104;
3134
3160
  case 13: goto st107;
@@ -3149,7 +3175,7 @@ st104:
3149
3175
  case 104:
3150
3176
  goto tr159;
3151
3177
  tr159:
3152
- #line 376 "unicorn_http.rl"
3178
+ #line 402 "unicorn_http.rl"
3153
3179
  {
3154
3180
  skip_chunk_data_hack: {
3155
3181
  size_t nr = MIN((size_t)hp->len.chunk, REMAINING);
@@ -3171,7 +3197,7 @@ st105:
3171
3197
  if ( ++p == pe )
3172
3198
  goto _test_eof105;
3173
3199
  case 105:
3174
- #line 3175 "unicorn_http.c"
3200
+ #line 3201 "unicorn_http.c"
3175
3201
  switch( (*p) ) {
3176
3202
  case 10: goto st100;
3177
3203
  case 13: goto st106;
@@ -3378,30 +3404,30 @@ case 113:
3378
3404
  goto st113;
3379
3405
  goto st0;
3380
3406
  tr172:
3381
- #line 296 "unicorn_http.rl"
3407
+ #line 322 "unicorn_http.rl"
3382
3408
  { MARK(mark, p); }
3383
- #line 298 "unicorn_http.rl"
3409
+ #line 324 "unicorn_http.rl"
3384
3410
  { write_cont_value(hp, buffer, p); }
3385
3411
  goto st114;
3386
3412
  tr175:
3387
- #line 298 "unicorn_http.rl"
3413
+ #line 324 "unicorn_http.rl"
3388
3414
  { write_cont_value(hp, buffer, p); }
3389
3415
  goto st114;
3390
3416
  tr182:
3391
- #line 296 "unicorn_http.rl"
3417
+ #line 322 "unicorn_http.rl"
3392
3418
  { MARK(mark, p); }
3393
- #line 297 "unicorn_http.rl"
3419
+ #line 323 "unicorn_http.rl"
3394
3420
  { write_value(hp, buffer, p); }
3395
3421
  goto st114;
3396
3422
  tr185:
3397
- #line 297 "unicorn_http.rl"
3423
+ #line 323 "unicorn_http.rl"
3398
3424
  { write_value(hp, buffer, p); }
3399
3425
  goto st114;
3400
3426
  st114:
3401
3427
  if ( ++p == pe )
3402
3428
  goto _test_eof114;
3403
3429
  case 114:
3404
- #line 3405 "unicorn_http.c"
3430
+ #line 3431 "unicorn_http.c"
3405
3431
  switch( (*p) ) {
3406
3432
  case 9: goto st115;
3407
3433
  case 10: goto tr167;
@@ -3430,14 +3456,14 @@ case 114:
3430
3456
  goto tr169;
3431
3457
  goto st0;
3432
3458
  tr171:
3433
- #line 296 "unicorn_http.rl"
3459
+ #line 322 "unicorn_http.rl"
3434
3460
  { MARK(mark, p); }
3435
3461
  goto st115;
3436
3462
  st115:
3437
3463
  if ( ++p == pe )
3438
3464
  goto _test_eof115;
3439
3465
  case 115:
3440
- #line 3441 "unicorn_http.c"
3466
+ #line 3467 "unicorn_http.c"
3441
3467
  switch( (*p) ) {
3442
3468
  case 9: goto tr171;
3443
3469
  case 10: goto tr172;
@@ -3449,14 +3475,14 @@ case 115:
3449
3475
  goto st0;
3450
3476
  goto tr170;
3451
3477
  tr170:
3452
- #line 296 "unicorn_http.rl"
3478
+ #line 322 "unicorn_http.rl"
3453
3479
  { MARK(mark, p); }
3454
3480
  goto st116;
3455
3481
  st116:
3456
3482
  if ( ++p == pe )
3457
3483
  goto _test_eof116;
3458
3484
  case 116:
3459
- #line 3460 "unicorn_http.c"
3485
+ #line 3486 "unicorn_http.c"
3460
3486
  switch( (*p) ) {
3461
3487
  case 10: goto tr175;
3462
3488
  case 13: goto tr176;
@@ -3469,35 +3495,35 @@ case 116:
3469
3495
  goto st0;
3470
3496
  goto st116;
3471
3497
  tr173:
3472
- #line 296 "unicorn_http.rl"
3498
+ #line 322 "unicorn_http.rl"
3473
3499
  { MARK(mark, p); }
3474
- #line 298 "unicorn_http.rl"
3500
+ #line 324 "unicorn_http.rl"
3475
3501
  { write_cont_value(hp, buffer, p); }
3476
3502
  goto st117;
3477
3503
  tr176:
3478
- #line 298 "unicorn_http.rl"
3504
+ #line 324 "unicorn_http.rl"
3479
3505
  { write_cont_value(hp, buffer, p); }
3480
3506
  goto st117;
3481
3507
  tr183:
3482
- #line 296 "unicorn_http.rl"
3508
+ #line 322 "unicorn_http.rl"
3483
3509
  { MARK(mark, p); }
3484
- #line 297 "unicorn_http.rl"
3510
+ #line 323 "unicorn_http.rl"
3485
3511
  { write_value(hp, buffer, p); }
3486
3512
  goto st117;
3487
3513
  tr186:
3488
- #line 297 "unicorn_http.rl"
3514
+ #line 323 "unicorn_http.rl"
3489
3515
  { write_value(hp, buffer, p); }
3490
3516
  goto st117;
3491
3517
  st117:
3492
3518
  if ( ++p == pe )
3493
3519
  goto _test_eof117;
3494
3520
  case 117:
3495
- #line 3496 "unicorn_http.c"
3521
+ #line 3522 "unicorn_http.c"
3496
3522
  if ( (*p) == 10 )
3497
3523
  goto st114;
3498
3524
  goto st0;
3499
3525
  tr167:
3500
- #line 363 "unicorn_http.rl"
3526
+ #line 389 "unicorn_http.rl"
3501
3527
  {
3502
3528
  cs = http_parser_first_final;
3503
3529
  goto post_exec;
@@ -3507,7 +3533,7 @@ st124:
3507
3533
  if ( ++p == pe )
3508
3534
  goto _test_eof124;
3509
3535
  case 124:
3510
- #line 3511 "unicorn_http.c"
3536
+ #line 3537 "unicorn_http.c"
3511
3537
  goto st0;
3512
3538
  st118:
3513
3539
  if ( ++p == pe )
@@ -3517,20 +3543,20 @@ case 118:
3517
3543
  goto tr167;
3518
3544
  goto st0;
3519
3545
  tr169:
3520
- #line 292 "unicorn_http.rl"
3546
+ #line 318 "unicorn_http.rl"
3521
3547
  { MARK(start.field, p); }
3522
- #line 293 "unicorn_http.rl"
3548
+ #line 319 "unicorn_http.rl"
3523
3549
  { snake_upcase_char(deconst(p)); }
3524
3550
  goto st119;
3525
3551
  tr178:
3526
- #line 293 "unicorn_http.rl"
3552
+ #line 319 "unicorn_http.rl"
3527
3553
  { snake_upcase_char(deconst(p)); }
3528
3554
  goto st119;
3529
3555
  st119:
3530
3556
  if ( ++p == pe )
3531
3557
  goto _test_eof119;
3532
3558
  case 119:
3533
- #line 3534 "unicorn_http.c"
3559
+ #line 3560 "unicorn_http.c"
3534
3560
  switch( (*p) ) {
3535
3561
  case 33: goto tr178;
3536
3562
  case 58: goto tr179;
@@ -3556,18 +3582,18 @@ case 119:
3556
3582
  goto tr178;
3557
3583
  goto st0;
3558
3584
  tr181:
3559
- #line 296 "unicorn_http.rl"
3585
+ #line 322 "unicorn_http.rl"
3560
3586
  { MARK(mark, p); }
3561
3587
  goto st120;
3562
3588
  tr179:
3563
- #line 295 "unicorn_http.rl"
3589
+ #line 321 "unicorn_http.rl"
3564
3590
  { hp->s.field_len = LEN(start.field, p); }
3565
3591
  goto st120;
3566
3592
  st120:
3567
3593
  if ( ++p == pe )
3568
3594
  goto _test_eof120;
3569
3595
  case 120:
3570
- #line 3571 "unicorn_http.c"
3596
+ #line 3597 "unicorn_http.c"
3571
3597
  switch( (*p) ) {
3572
3598
  case 9: goto tr181;
3573
3599
  case 10: goto tr182;
@@ -3579,14 +3605,14 @@ case 120:
3579
3605
  goto st0;
3580
3606
  goto tr180;
3581
3607
  tr180:
3582
- #line 296 "unicorn_http.rl"
3608
+ #line 322 "unicorn_http.rl"
3583
3609
  { MARK(mark, p); }
3584
3610
  goto st121;
3585
3611
  st121:
3586
3612
  if ( ++p == pe )
3587
3613
  goto _test_eof121;
3588
3614
  case 121:
3589
- #line 3590 "unicorn_http.c"
3615
+ #line 3616 "unicorn_http.c"
3590
3616
  switch( (*p) ) {
3591
3617
  case 10: goto tr185;
3592
3618
  case 13: goto tr186;
@@ -3727,7 +3753,7 @@ case 121:
3727
3753
  _out: {}
3728
3754
  }
3729
3755
 
3730
- #line 437 "unicorn_http.rl"
3756
+ #line 463 "unicorn_http.rl"
3731
3757
  post_exec: /* "_out:" also goes here */
3732
3758
  if (hp->cs != http_parser_error)
3733
3759
  hp->cs = cs;
@@ -3781,7 +3807,7 @@ static void set_url_scheme(VALUE env, VALUE *server_port)
3781
3807
  * and X-Forwarded-Proto handling from this parser? We've had it
3782
3808
  * forever and nobody has said anything against it, either.
3783
3809
  * Anyways, please send comments to our public mailing list:
3784
- * unicorn-public@bogomips.org (no HTML mail, no subscription necessary)
3810
+ * unicorn-public@yhbt.net (no HTML mail, no subscription necessary)
3785
3811
  */
3786
3812
  scheme = rb_hash_aref(env, g_http_x_forwarded_ssl);
3787
3813
  if (!NIL_P(scheme) && STR_CSTR_EQ(scheme, "on")) {
@@ -3907,7 +3933,7 @@ static VALUE HttpParser_clear(VALUE self)
3907
3933
  return HttpParser_init(self);
3908
3934
 
3909
3935
  http_parser_init(hp);
3910
- my_hash_clear(hp->env);
3936
+ rb_hash_clear(hp->env);
3911
3937
 
3912
3938
  return self;
3913
3939
  }
@@ -4225,7 +4251,7 @@ static VALUE HttpParser_rssget(VALUE self)
4225
4251
 
4226
4252
  void Init_unicorn_http(void)
4227
4253
  {
4228
- VALUE mUnicorn, cHttpParser;
4254
+ VALUE mUnicorn;
4229
4255
 
4230
4256
  mUnicorn = rb_define_module("Unicorn");
4231
4257
  cHttpParser = rb_define_class_under(mUnicorn, "HttpParser", rb_cObject);
@@ -4236,6 +4262,7 @@ void Init_unicorn_http(void)
4236
4262
  e414 = rb_define_class_under(mUnicorn, "RequestURITooLongError",
4237
4263
  eHttpParserError);
4238
4264
 
4265
+ id_uminus = rb_intern("-@");
4239
4266
  init_globals();
4240
4267
  rb_define_alloc_func(cHttpParser, HttpParser_alloc);
4241
4268
  rb_define_method(cHttpParser, "initialize", HttpParser_init, 0);
@@ -4285,5 +4312,8 @@ void Init_unicorn_http(void)
4285
4312
  #ifndef HAVE_RB_HASH_CLEAR
4286
4313
  id_clear = rb_intern("clear");
4287
4314
  #endif
4315
+ id_is_chunked_p = rb_intern("is_chunked?");
4316
+
4317
+ init_epollexclusive(mUnicorn);
4288
4318
  }
4289
4319
  #undef SET_GLOBAL