thin 1.2.7-x86-mingw32 → 1.2.8-x86-mingw32

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.
data/CHANGELOG CHANGED
@@ -1,3 +1,32 @@
1
+ == 1.2.8 Black Keys
2
+ * Allow the connection to remain open for 1xx statuses [timshadel]
3
+
4
+ Both the 100 and 101 status codes require that the connection to the
5
+ server remain open. The 100 status code is used to tell the client that
6
+ the server is still receiving its request, and will continue to read
7
+ request input on the connection. The 101 status code is used to upgrade
8
+ the existing connection to another protocol, and specifically is NOT
9
+ used to upgrade a separate connection. Therefore, the connection must
10
+ remain open after this response in order to facilitate that.
11
+
12
+ * Accept IE7 badly encoded URL (eg.: %uEEEE)
13
+ * Fix gemspec to work w/ Bundler [smparkes]
14
+ * Add SSL support [tmm1]
15
+ * Catch Errno::EPERM in Process.running? [Tony Kemp]
16
+ On some systems (e.g. OpenBSD) you receive an EPERM exception if
17
+ you try to Process.getpgid on a process you do not own (even if you
18
+ are root). But it does mean that the process exists, so return true.
19
+ * Fix Rails version check that select which Rack adapter to use. Was using CGI adapter in Rails 3.
20
+ * Ignore SIGHUP when no restart block is given
21
+ * Add SSL options to thin command line tool [goldmann]
22
+
23
+ --ssl Enables SSL
24
+ --ssl-key-file PATH Path to private key
25
+ --ssl-cert-file PATH Path to certificate
26
+ --ssl-verify Enables SSL certificate verification
27
+ * Expose peer SSL certificate in env (rack.peer_cert) [fd]
28
+ * Adjusting unix socket permissions to be more open [mbj]
29
+
1
30
  == 1.2.7 No Hup
2
31
  * Support multiple Ruby version (fat binaries under windows)
3
32
  * Do not trap unsupported HUP signal on Windows
data/Rakefile CHANGED
@@ -37,7 +37,7 @@ end
37
37
 
38
38
  desc "Build gem packages"
39
39
  task :gems do
40
- sh "rvm use 1.8.6; rake clean gem && rake cross native gem RUBY_CC_VERSION=1.8.6:1.9.1"
40
+ sh "rake clean gem && rake cross native gem RUBY_CC_VERSION=1.8.6:1.9.1"
41
41
  end
42
42
 
43
43
  desc "Release version #{Thin::VERSION::STRING} gems to rubyforge"
@@ -1,7 +1,7 @@
1
1
  check process blog1
2
2
  with pidfile /u/apps/blog/shared/pids/thin.14000.pid
3
- start program = "/usr/local/bin/ruby /usr/local/bin/thin start -d -e production -u nobody -g nobody -p 14000 -a 127.0.0.1 -P tmp/pids/thin.14000.pid -c /u/apps/blog/current"
4
- stop program = "/usr/local/bin/ruby /usr/local/bin/thin stop -P /u/apps/blog/shared/pids/thin.14000.pid"
3
+ start program = "ruby thin start -d -e production -u nobody -g nobody -p 14000 -a 127.0.0.1 -P tmp/pids/thin.14000.pid -c /u/apps/blog/current"
4
+ stop program = "ruby thin stop -P /u/apps/blog/shared/pids/thin.14000.pid"
5
5
  if totalmem > 90.0 MB for 5 cycles then restart
6
6
  if failed port 14000 then restart
7
7
  if cpu usage > 95% for 3 cycles then restart
@@ -10,8 +10,8 @@ check process blog1
10
10
 
11
11
  check process blog2
12
12
  with pidfile /u/apps/blog/shared/pids/thin.14001.pid
13
- start program = "/usr/local/bin/ruby /usr/local/bin/thin start -d -e production -u nobody -g nobody -p 14001 -a 127.0.0.1 -P tmp/pids/thin.14001.pid -c /u/apps/blog/current"
14
- stop program = "/usr/local/bin/ruby /usr/local/bin/thin stop -P /u/apps/blog/shared/pids/thin.14001.pid"
13
+ start program = "ruby thin start -d -e production -u nobody -g nobody -p 14001 -a 127.0.0.1 -P tmp/pids/thin.14001.pid -c /u/apps/blog/current"
14
+ stop program = "ruby thin stop -P /u/apps/blog/shared/pids/thin.14001.pid"
15
15
  if totalmem > 90.0 MB for 5 cycles then restart
16
16
  if failed port 14001 then restart
17
17
  if cpu usage > 95% for 3 cycles then restart
@@ -1,7 +1,7 @@
1
1
  check process blog1
2
2
  with pidfile /u/apps/blog/shared/pids/thin.1.pid
3
- start program = "/usr/local/bin/ruby /usr/local/bin/thin start -d -e production -S /u/apps/blog/shared/pids/thin.1.sock -P tmp/pids/thin.1.pid -c /u/apps/blog/current"
4
- stop program = "/usr/local/bin/ruby /usr/local/bin/thin stop -P /u/apps/blog/shared/pids/thin.1.pid"
3
+ start program = "ruby thin start -d -e production -S /u/apps/blog/shared/pids/thin.1.sock -P tmp/pids/thin.1.pid -c /u/apps/blog/current"
4
+ stop program = "ruby thin stop -P /u/apps/blog/shared/pids/thin.1.pid"
5
5
  if totalmem > 90.0 MB for 5 cycles then restart
6
6
  if failed unixsocket /u/apps/blog/shared/pids/thin.1.sock then restart
7
7
  if cpu usage > 95% for 3 cycles then restart
@@ -10,8 +10,8 @@ check process blog1
10
10
 
11
11
  check process blog2
12
12
  with pidfile /u/apps/blog/shared/pids/thin.2.pid
13
- start program = "/usr/local/bin/ruby /usr/local/bin/thin start -d -e production -S /u/apps/blog/shared/pids/thin.2.sock -P tmp/pids/thin.2.pid -c /u/apps/blog/current"
14
- stop program = "/usr/local/bin/ruby /usr/local/bin/thin stop -P /u/apps/blog/shared/pids/thin.2.pid"
13
+ start program = "ruby thin start -d -e production -S /u/apps/blog/shared/pids/thin.2.sock -P tmp/pids/thin.2.pid -c /u/apps/blog/current"
14
+ stop program = "ruby thin stop -P /u/apps/blog/shared/pids/thin.2.pid"
15
15
  if totalmem > 90.0 MB for 5 cycles then restart
16
16
  if failed unixsocket /u/apps/blog/shared/pids/thin.2.sock then restart
17
17
  if cpu usage > 95% for 3 cycles then restart
@@ -15,7 +15,7 @@
15
15
  unsafe = (CTL | " " | "#" | "%" | sorta_safe);
16
16
  national = any -- (alpha | digit | reserved | extra | safe | unsafe);
17
17
  unreserved = (alpha | digit | safe | extra | national);
18
- escape = ("%" xdigit xdigit);
18
+ escape = ("%" "u"? xdigit xdigit);
19
19
  uchar = (unreserved | escape | sorta_safe);
20
20
  pchar = (uchar | ":" | "@" | "&" | "=" | "+");
21
21
  tspecials = ("(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\\" | "\"" | "/" | "[" | "]" | "?" | "=" | "{" | "}" | " " | "\t");
@@ -25,7 +25,7 @@
25
25
 
26
26
  #line 27 "parser.c"
27
27
  static const int http_parser_start = 1;
28
- static const int http_parser_first_final = 54;
28
+ static const int http_parser_first_final = 58;
29
29
  static const int http_parser_error = 0;
30
30
 
31
31
  static const int http_parser_en_main = 1;
@@ -103,17 +103,17 @@ case 2:
103
103
  #line 104 "parser.c"
104
104
  switch( (*p) ) {
105
105
  case 32: goto tr2;
106
- case 36: goto st35;
107
- case 95: goto st35;
106
+ case 36: goto st39;
107
+ case 95: goto st39;
108
108
  }
109
109
  if ( (*p) < 48 ) {
110
110
  if ( 45 <= (*p) && (*p) <= 46 )
111
- goto st35;
111
+ goto st39;
112
112
  } else if ( (*p) > 57 ) {
113
113
  if ( 65 <= (*p) && (*p) <= 90 )
114
- goto st35;
114
+ goto st39;
115
115
  } else
116
- goto st35;
116
+ goto st39;
117
117
  goto st0;
118
118
  tr2:
119
119
  #line 36 "parser.rl"
@@ -183,7 +183,7 @@ tr34:
183
183
  }
184
184
  }
185
185
  goto st5;
186
- tr42:
186
+ tr44:
187
187
  #line 65 "parser.rl"
188
188
  {
189
189
  if (parser->request_path != NULL) {
@@ -197,7 +197,7 @@ tr42:
197
197
  }
198
198
  }
199
199
  goto st5;
200
- tr48:
200
+ tr51:
201
201
  #line 52 "parser.rl"
202
202
  {MARK(query_start, p); }
203
203
  #line 53 "parser.rl"
@@ -213,7 +213,7 @@ tr48:
213
213
  }
214
214
  }
215
215
  goto st5;
216
- tr52:
216
+ tr55:
217
217
  #line 53 "parser.rl"
218
218
  {
219
219
  if (parser->query_string != NULL) {
@@ -376,13 +376,13 @@ tr22:
376
376
  if (parser->header_done != NULL) {
377
377
  parser->header_done(parser->data, p + 1, pe - p - 1);
378
378
  }
379
- {p++; cs = 54; goto _out;}
379
+ {p++; cs = 58; goto _out;}
380
380
  }
381
- goto st54;
382
- st54:
381
+ goto st58;
382
+ st58:
383
383
  if ( ++p == pe )
384
- goto _test_eof54;
385
- case 54:
384
+ goto _test_eof58;
385
+ case 58:
386
386
  #line 387 "parser.c"
387
387
  goto st0;
388
388
  tr21:
@@ -458,7 +458,7 @@ tr9:
458
458
  }
459
459
  }
460
460
  goto st20;
461
- tr43:
461
+ tr45:
462
462
  #line 65 "parser.rl"
463
463
  {
464
464
  if (parser->request_path != NULL) {
@@ -472,7 +472,7 @@ tr43:
472
472
  }
473
473
  }
474
474
  goto st20;
475
- tr49:
475
+ tr52:
476
476
  #line 52 "parser.rl"
477
477
  {MARK(query_start, p); }
478
478
  #line 53 "parser.rl"
@@ -488,7 +488,7 @@ tr49:
488
488
  }
489
489
  }
490
490
  goto st20;
491
- tr53:
491
+ tr56:
492
492
  #line 53 "parser.rl"
493
493
  {
494
494
  if (parser->query_string != NULL) {
@@ -543,6 +543,8 @@ st22:
543
543
  goto _test_eof22;
544
544
  case 22:
545
545
  #line 546 "parser.c"
546
+ if ( (*p) == 117 )
547
+ goto st24;
546
548
  if ( (*p) < 65 ) {
547
549
  if ( 48 <= (*p) && (*p) <= 57 )
548
550
  goto st23;
@@ -565,111 +567,94 @@ case 23:
565
567
  } else
566
568
  goto st21;
567
569
  goto st0;
568
- tr5:
569
- #line 22 "parser.rl"
570
- {MARK(mark, p); }
571
- goto st24;
572
570
  st24:
573
571
  if ( ++p == pe )
574
572
  goto _test_eof24;
575
573
  case 24:
576
- #line 577 "parser.c"
574
+ if ( (*p) < 65 ) {
575
+ if ( 48 <= (*p) && (*p) <= 57 )
576
+ goto st23;
577
+ } else if ( (*p) > 70 ) {
578
+ if ( 97 <= (*p) && (*p) <= 102 )
579
+ goto st23;
580
+ } else
581
+ goto st23;
582
+ goto st0;
583
+ tr5:
584
+ #line 22 "parser.rl"
585
+ {MARK(mark, p); }
586
+ goto st25;
587
+ st25:
588
+ if ( ++p == pe )
589
+ goto _test_eof25;
590
+ case 25:
591
+ #line 592 "parser.c"
577
592
  switch( (*p) ) {
578
- case 43: goto st24;
579
- case 58: goto st25;
593
+ case 43: goto st25;
594
+ case 58: goto st26;
580
595
  }
581
596
  if ( (*p) < 48 ) {
582
597
  if ( 45 <= (*p) && (*p) <= 46 )
583
- goto st24;
598
+ goto st25;
584
599
  } else if ( (*p) > 57 ) {
585
600
  if ( (*p) > 90 ) {
586
601
  if ( 97 <= (*p) && (*p) <= 122 )
587
- goto st24;
602
+ goto st25;
588
603
  } else if ( (*p) >= 65 )
589
- goto st24;
604
+ goto st25;
590
605
  } else
591
- goto st24;
606
+ goto st25;
592
607
  goto st0;
593
608
  tr7:
594
609
  #line 22 "parser.rl"
595
610
  {MARK(mark, p); }
596
- goto st25;
597
- st25:
611
+ goto st26;
612
+ st26:
598
613
  if ( ++p == pe )
599
- goto _test_eof25;
600
- case 25:
601
- #line 602 "parser.c"
614
+ goto _test_eof26;
615
+ case 26:
616
+ #line 617 "parser.c"
602
617
  switch( (*p) ) {
603
618
  case 32: goto tr8;
604
619
  case 35: goto tr9;
605
- case 37: goto st26;
620
+ case 37: goto st27;
606
621
  case 127: goto st0;
607
622
  }
608
623
  if ( 0 <= (*p) && (*p) <= 31 )
609
624
  goto st0;
610
- goto st25;
611
- st26:
612
- if ( ++p == pe )
613
- goto _test_eof26;
614
- case 26:
615
- if ( (*p) < 65 ) {
616
- if ( 48 <= (*p) && (*p) <= 57 )
617
- goto st27;
618
- } else if ( (*p) > 70 ) {
619
- if ( 97 <= (*p) && (*p) <= 102 )
620
- goto st27;
621
- } else
622
- goto st27;
623
- goto st0;
625
+ goto st26;
624
626
  st27:
625
627
  if ( ++p == pe )
626
628
  goto _test_eof27;
627
629
  case 27:
630
+ if ( (*p) == 117 )
631
+ goto st29;
628
632
  if ( (*p) < 65 ) {
629
633
  if ( 48 <= (*p) && (*p) <= 57 )
630
- goto st25;
634
+ goto st28;
631
635
  } else if ( (*p) > 70 ) {
632
636
  if ( 97 <= (*p) && (*p) <= 102 )
633
- goto st25;
637
+ goto st28;
634
638
  } else
635
- goto st25;
639
+ goto st28;
636
640
  goto st0;
637
- tr6:
638
- #line 22 "parser.rl"
639
- {MARK(mark, p); }
640
- goto st28;
641
641
  st28:
642
642
  if ( ++p == pe )
643
643
  goto _test_eof28;
644
644
  case 28:
645
- #line 646 "parser.c"
646
- switch( (*p) ) {
647
- case 32: goto tr42;
648
- case 35: goto tr43;
649
- case 37: goto st29;
650
- case 63: goto tr45;
651
- case 127: goto st0;
652
- }
653
- if ( 0 <= (*p) && (*p) <= 31 )
654
- goto st0;
655
- goto st28;
656
- st29:
657
- if ( ++p == pe )
658
- goto _test_eof29;
659
- case 29:
660
645
  if ( (*p) < 65 ) {
661
646
  if ( 48 <= (*p) && (*p) <= 57 )
662
- goto st30;
647
+ goto st26;
663
648
  } else if ( (*p) > 70 ) {
664
649
  if ( 97 <= (*p) && (*p) <= 102 )
665
- goto st30;
650
+ goto st26;
666
651
  } else
667
- goto st30;
652
+ goto st26;
668
653
  goto st0;
669
- st30:
654
+ st29:
670
655
  if ( ++p == pe )
671
- goto _test_eof30;
672
- case 30:
656
+ goto _test_eof29;
657
+ case 29:
673
658
  if ( (*p) < 65 ) {
674
659
  if ( 48 <= (*p) && (*p) <= 57 )
675
660
  goto st28;
@@ -679,68 +664,57 @@ case 30:
679
664
  } else
680
665
  goto st28;
681
666
  goto st0;
682
- tr45:
683
- #line 65 "parser.rl"
684
- {
685
- if (parser->request_path != NULL) {
686
- parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
687
- }
688
- }
689
- goto st31;
690
- st31:
667
+ tr6:
668
+ #line 22 "parser.rl"
669
+ {MARK(mark, p); }
670
+ goto st30;
671
+ st30:
691
672
  if ( ++p == pe )
692
- goto _test_eof31;
693
- case 31:
694
- #line 695 "parser.c"
673
+ goto _test_eof30;
674
+ case 30:
675
+ #line 676 "parser.c"
695
676
  switch( (*p) ) {
696
- case 32: goto tr48;
697
- case 35: goto tr49;
698
- case 37: goto tr50;
677
+ case 32: goto tr44;
678
+ case 35: goto tr45;
679
+ case 37: goto st31;
680
+ case 63: goto tr47;
699
681
  case 127: goto st0;
700
682
  }
701
683
  if ( 0 <= (*p) && (*p) <= 31 )
702
684
  goto st0;
703
- goto tr47;
704
- tr47:
705
- #line 52 "parser.rl"
706
- {MARK(query_start, p); }
707
- goto st32;
685
+ goto st30;
686
+ st31:
687
+ if ( ++p == pe )
688
+ goto _test_eof31;
689
+ case 31:
690
+ if ( (*p) == 117 )
691
+ goto st33;
692
+ if ( (*p) < 65 ) {
693
+ if ( 48 <= (*p) && (*p) <= 57 )
694
+ goto st32;
695
+ } else if ( (*p) > 70 ) {
696
+ if ( 97 <= (*p) && (*p) <= 102 )
697
+ goto st32;
698
+ } else
699
+ goto st32;
700
+ goto st0;
708
701
  st32:
709
702
  if ( ++p == pe )
710
703
  goto _test_eof32;
711
704
  case 32:
712
- #line 713 "parser.c"
713
- switch( (*p) ) {
714
- case 32: goto tr52;
715
- case 35: goto tr53;
716
- case 37: goto st33;
717
- case 127: goto st0;
718
- }
719
- if ( 0 <= (*p) && (*p) <= 31 )
720
- goto st0;
721
- goto st32;
722
- tr50:
723
- #line 52 "parser.rl"
724
- {MARK(query_start, p); }
725
- goto st33;
726
- st33:
727
- if ( ++p == pe )
728
- goto _test_eof33;
729
- case 33:
730
- #line 731 "parser.c"
731
705
  if ( (*p) < 65 ) {
732
706
  if ( 48 <= (*p) && (*p) <= 57 )
733
- goto st34;
707
+ goto st30;
734
708
  } else if ( (*p) > 70 ) {
735
709
  if ( 97 <= (*p) && (*p) <= 102 )
736
- goto st34;
710
+ goto st30;
737
711
  } else
738
- goto st34;
712
+ goto st30;
739
713
  goto st0;
740
- st34:
714
+ st33:
741
715
  if ( ++p == pe )
742
- goto _test_eof34;
743
- case 34:
716
+ goto _test_eof33;
717
+ case 33:
744
718
  if ( (*p) < 65 ) {
745
719
  if ( 48 <= (*p) && (*p) <= 57 )
746
720
  goto st32;
@@ -750,38 +724,62 @@ case 34:
750
724
  } else
751
725
  goto st32;
752
726
  goto st0;
727
+ tr47:
728
+ #line 65 "parser.rl"
729
+ {
730
+ if (parser->request_path != NULL) {
731
+ parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
732
+ }
733
+ }
734
+ goto st34;
735
+ st34:
736
+ if ( ++p == pe )
737
+ goto _test_eof34;
738
+ case 34:
739
+ #line 740 "parser.c"
740
+ switch( (*p) ) {
741
+ case 32: goto tr51;
742
+ case 35: goto tr52;
743
+ case 37: goto tr53;
744
+ case 127: goto st0;
745
+ }
746
+ if ( 0 <= (*p) && (*p) <= 31 )
747
+ goto st0;
748
+ goto tr50;
749
+ tr50:
750
+ #line 52 "parser.rl"
751
+ {MARK(query_start, p); }
752
+ goto st35;
753
753
  st35:
754
754
  if ( ++p == pe )
755
755
  goto _test_eof35;
756
756
  case 35:
757
+ #line 758 "parser.c"
757
758
  switch( (*p) ) {
758
- case 32: goto tr2;
759
- case 36: goto st36;
760
- case 95: goto st36;
759
+ case 32: goto tr55;
760
+ case 35: goto tr56;
761
+ case 37: goto st36;
762
+ case 127: goto st0;
761
763
  }
762
- if ( (*p) < 48 ) {
763
- if ( 45 <= (*p) && (*p) <= 46 )
764
- goto st36;
765
- } else if ( (*p) > 57 ) {
766
- if ( 65 <= (*p) && (*p) <= 90 )
767
- goto st36;
768
- } else
769
- goto st36;
770
- goto st0;
764
+ if ( 0 <= (*p) && (*p) <= 31 )
765
+ goto st0;
766
+ goto st35;
767
+ tr53:
768
+ #line 52 "parser.rl"
769
+ {MARK(query_start, p); }
770
+ goto st36;
771
771
  st36:
772
772
  if ( ++p == pe )
773
773
  goto _test_eof36;
774
774
  case 36:
775
- switch( (*p) ) {
776
- case 32: goto tr2;
777
- case 36: goto st37;
778
- case 95: goto st37;
779
- }
780
- if ( (*p) < 48 ) {
781
- if ( 45 <= (*p) && (*p) <= 46 )
775
+ #line 776 "parser.c"
776
+ if ( (*p) == 117 )
777
+ goto st38;
778
+ if ( (*p) < 65 ) {
779
+ if ( 48 <= (*p) && (*p) <= 57 )
782
780
  goto st37;
783
- } else if ( (*p) > 57 ) {
784
- if ( 65 <= (*p) && (*p) <= 90 )
781
+ } else if ( (*p) > 70 ) {
782
+ if ( 97 <= (*p) && (*p) <= 102 )
785
783
  goto st37;
786
784
  } else
787
785
  goto st37;
@@ -790,37 +788,27 @@ st37:
790
788
  if ( ++p == pe )
791
789
  goto _test_eof37;
792
790
  case 37:
793
- switch( (*p) ) {
794
- case 32: goto tr2;
795
- case 36: goto st38;
796
- case 95: goto st38;
797
- }
798
- if ( (*p) < 48 ) {
799
- if ( 45 <= (*p) && (*p) <= 46 )
800
- goto st38;
801
- } else if ( (*p) > 57 ) {
802
- if ( 65 <= (*p) && (*p) <= 90 )
803
- goto st38;
791
+ if ( (*p) < 65 ) {
792
+ if ( 48 <= (*p) && (*p) <= 57 )
793
+ goto st35;
794
+ } else if ( (*p) > 70 ) {
795
+ if ( 97 <= (*p) && (*p) <= 102 )
796
+ goto st35;
804
797
  } else
805
- goto st38;
798
+ goto st35;
806
799
  goto st0;
807
800
  st38:
808
801
  if ( ++p == pe )
809
802
  goto _test_eof38;
810
803
  case 38:
811
- switch( (*p) ) {
812
- case 32: goto tr2;
813
- case 36: goto st39;
814
- case 95: goto st39;
815
- }
816
- if ( (*p) < 48 ) {
817
- if ( 45 <= (*p) && (*p) <= 46 )
818
- goto st39;
819
- } else if ( (*p) > 57 ) {
820
- if ( 65 <= (*p) && (*p) <= 90 )
821
- goto st39;
804
+ if ( (*p) < 65 ) {
805
+ if ( 48 <= (*p) && (*p) <= 57 )
806
+ goto st37;
807
+ } else if ( (*p) > 70 ) {
808
+ if ( 97 <= (*p) && (*p) <= 102 )
809
+ goto st37;
822
810
  } else
823
- goto st39;
811
+ goto st37;
824
812
  goto st0;
825
813
  st39:
826
814
  if ( ++p == pe )
@@ -1078,6 +1066,78 @@ st53:
1078
1066
  if ( ++p == pe )
1079
1067
  goto _test_eof53;
1080
1068
  case 53:
1069
+ switch( (*p) ) {
1070
+ case 32: goto tr2;
1071
+ case 36: goto st54;
1072
+ case 95: goto st54;
1073
+ }
1074
+ if ( (*p) < 48 ) {
1075
+ if ( 45 <= (*p) && (*p) <= 46 )
1076
+ goto st54;
1077
+ } else if ( (*p) > 57 ) {
1078
+ if ( 65 <= (*p) && (*p) <= 90 )
1079
+ goto st54;
1080
+ } else
1081
+ goto st54;
1082
+ goto st0;
1083
+ st54:
1084
+ if ( ++p == pe )
1085
+ goto _test_eof54;
1086
+ case 54:
1087
+ switch( (*p) ) {
1088
+ case 32: goto tr2;
1089
+ case 36: goto st55;
1090
+ case 95: goto st55;
1091
+ }
1092
+ if ( (*p) < 48 ) {
1093
+ if ( 45 <= (*p) && (*p) <= 46 )
1094
+ goto st55;
1095
+ } else if ( (*p) > 57 ) {
1096
+ if ( 65 <= (*p) && (*p) <= 90 )
1097
+ goto st55;
1098
+ } else
1099
+ goto st55;
1100
+ goto st0;
1101
+ st55:
1102
+ if ( ++p == pe )
1103
+ goto _test_eof55;
1104
+ case 55:
1105
+ switch( (*p) ) {
1106
+ case 32: goto tr2;
1107
+ case 36: goto st56;
1108
+ case 95: goto st56;
1109
+ }
1110
+ if ( (*p) < 48 ) {
1111
+ if ( 45 <= (*p) && (*p) <= 46 )
1112
+ goto st56;
1113
+ } else if ( (*p) > 57 ) {
1114
+ if ( 65 <= (*p) && (*p) <= 90 )
1115
+ goto st56;
1116
+ } else
1117
+ goto st56;
1118
+ goto st0;
1119
+ st56:
1120
+ if ( ++p == pe )
1121
+ goto _test_eof56;
1122
+ case 56:
1123
+ switch( (*p) ) {
1124
+ case 32: goto tr2;
1125
+ case 36: goto st57;
1126
+ case 95: goto st57;
1127
+ }
1128
+ if ( (*p) < 48 ) {
1129
+ if ( 45 <= (*p) && (*p) <= 46 )
1130
+ goto st57;
1131
+ } else if ( (*p) > 57 ) {
1132
+ if ( 65 <= (*p) && (*p) <= 90 )
1133
+ goto st57;
1134
+ } else
1135
+ goto st57;
1136
+ goto st0;
1137
+ st57:
1138
+ if ( ++p == pe )
1139
+ goto _test_eof57;
1140
+ case 57:
1081
1141
  if ( (*p) == 32 )
1082
1142
  goto tr2;
1083
1143
  goto st0;
@@ -1097,7 +1157,7 @@ case 53:
1097
1157
  _test_eof14: cs = 14; goto _test_eof;
1098
1158
  _test_eof15: cs = 15; goto _test_eof;
1099
1159
  _test_eof16: cs = 16; goto _test_eof;
1100
- _test_eof54: cs = 54; goto _test_eof;
1160
+ _test_eof58: cs = 58; goto _test_eof;
1101
1161
  _test_eof17: cs = 17; goto _test_eof;
1102
1162
  _test_eof18: cs = 18; goto _test_eof;
1103
1163
  _test_eof19: cs = 19; goto _test_eof;
@@ -1135,6 +1195,10 @@ case 53:
1135
1195
  _test_eof51: cs = 51; goto _test_eof;
1136
1196
  _test_eof52: cs = 52; goto _test_eof;
1137
1197
  _test_eof53: cs = 53; goto _test_eof;
1198
+ _test_eof54: cs = 54; goto _test_eof;
1199
+ _test_eof55: cs = 55; goto _test_eof;
1200
+ _test_eof56: cs = 56; goto _test_eof;
1201
+ _test_eof57: cs = 57; goto _test_eof;
1138
1202
 
1139
1203
  _test_eof: {}
1140
1204
  _out: {}
@@ -22,7 +22,7 @@ module Rack
22
22
 
23
23
  load_application
24
24
 
25
- @rails_app = if rack_based?
25
+ @rails_app = if self.class.rack_based?
26
26
  ActionController::Dispatcher.new
27
27
  else
28
28
  CgiApp.new
@@ -31,11 +31,6 @@ module Rack
31
31
  @file_app = Rack::File.new(::File.join(RAILS_ROOT, "public"))
32
32
  end
33
33
 
34
- def rack_based?
35
- rails_version = ::Rails::VERSION
36
- rails_version::MAJOR >= 2 && rails_version::MINOR >= 2 && rails_version::TINY >= 3
37
- end
38
-
39
34
  def load_application
40
35
  ENV['RAILS_ENV'] = @env
41
36
 
@@ -73,6 +68,14 @@ module Rack
73
68
  # No static file, let Rails handle it
74
69
  @rails_app.call(env)
75
70
  end
71
+
72
+ def self.rack_based?
73
+ rails_version = ::Rails::VERSION
74
+ return false if rails_version::MAJOR < 2
75
+ return false if rails_version::MAJOR == 2 && rails_version::MINOR < 2
76
+ return false if rails_version::MAJOR == 2 && rails_version::MINOR == 2 && rails_version::TINY < 3
77
+ true # >= 2.2.3
78
+ end
76
79
 
77
80
  protected
78
81
  # For Rails pre Rack (2.3)
@@ -27,6 +27,10 @@ module Thin
27
27
  attr_writer :threaded
28
28
  def threaded?; @threaded end
29
29
 
30
+ # Allow using SSL in the backend.
31
+ attr_writer :ssl, :ssl_options
32
+ def ssl?; @ssl end
33
+
30
34
  # Number of persistent connections currently opened
31
35
  attr_accessor :persistent_connection_count
32
36
 
@@ -125,6 +129,10 @@ module Thin
125
129
  connection.app = @server.app
126
130
  connection.comm_inactivity_timeout = @timeout
127
131
  connection.threaded = @threaded
132
+
133
+ if @ssl
134
+ connection.start_tls(@ssl_options)
135
+ end
128
136
 
129
137
  # We control the number of persistent connections by keeping
130
138
  # a count of the total one allowed yet.
@@ -14,10 +14,15 @@ module Thin
14
14
  # Connect the server
15
15
  def connect
16
16
  at_exit { remove_socket_file } # In case it crashes
17
- EventMachine.start_unix_domain_server(@socket, UnixConnection, &method(:initialize_connection))
18
- # HACK EventMachine.start_unix_domain_server doesn't return the connection signature
19
- # so we have to go in the internal stuff to find it.
17
+ old_umask = File.umask(0)
18
+ begin
19
+ EventMachine.start_unix_domain_server(@socket, UnixConnection, &method(:initialize_connection))
20
+ # HACK EventMachine.start_unix_domain_server doesn't return the connection signature
21
+ # so we have to go in the internal stuff to find it.
20
22
  @signature = EventMachine.instance_eval{@acceptors.keys.first}
23
+ ensure
24
+ File.umask(old_umask)
25
+ end
21
26
  end
22
27
 
23
28
  # Stops the server
@@ -48,4 +53,4 @@ module Thin
48
53
  '127.0.0.1' # Unix domain sockets can only be local
49
54
  end
50
55
  end
51
- end
56
+ end
@@ -29,7 +29,7 @@ module Thin
29
29
  # Calling the application in a threaded allowing
30
30
  # concurrent processing of requests.
31
31
  attr_writer :threaded
32
-
32
+
33
33
  # Get the connection ready to process a request.
34
34
  def post_init
35
35
  @request = Request.new
@@ -67,6 +67,14 @@ module Thin
67
67
  # callback is no longer referenced, so be tidy!
68
68
  @request.async_callback = method(:post_process)
69
69
 
70
+ if @backend.ssl?
71
+ @request.env["rack.url_scheme"] = "https"
72
+
73
+ if cert = get_peer_cert
74
+ @request.env['rack.peer_cert'] = cert
75
+ end
76
+ end
77
+
70
78
  # When we're under a non-async framework like rails, we can still spawn
71
79
  # off async responses using the callback info, so there's little point
72
80
  # in removing this.
@@ -51,6 +51,12 @@ module Thin
51
51
  server.threaded = @options[:threaded]
52
52
  server.no_epoll = @options[:no_epoll] if server.backend.respond_to?(:no_epoll=)
53
53
 
54
+ # ssl support
55
+ if @options[:ssl]
56
+ server.ssl = true
57
+ server.ssl_options = { :private_key_file => @options[:ssl_key_file], :cert_chain_file => @options[:ssl_cert_file], :verify_peer => @options[:ssl_verify] }
58
+ end
59
+
54
60
  # Detach the process, after this line the current process returns
55
61
  server.daemonize if @options[:daemonize]
56
62
 
@@ -5,6 +5,8 @@ module Process
5
5
  # Returns +true+ the process identied by +pid+ is running.
6
6
  def running?(pid)
7
7
  Process.getpgid(pid) != -1
8
+ rescue Errno::EPERM
9
+ true
8
10
  rescue Errno::ESRCH
9
11
  false
10
12
  end
@@ -44,6 +46,7 @@ module Thin
44
46
  # HACK we need to create the directory before daemonization to prevent a bug under 1.9
45
47
  # ignoring all signals when the directory is created after daemonization.
46
48
  FileUtils.mkdir_p File.dirname(@pid_file)
49
+ FileUtils.mkdir_p File.dirname(@log_file)
47
50
 
48
51
  Daemonize.daemonize(File.expand_path(@log_file), name)
49
52
 
@@ -83,12 +86,13 @@ module Thin
83
86
 
84
87
  # Restart the server.
85
88
  def restart
86
- raise ArgumentError, "Can't restart, no 'on_restart' proc specified" unless @on_restart
87
- log '>> Restarting ...'
88
- stop
89
- remove_pid_file
90
- @on_restart.call
91
- exit!
89
+ if @on_restart
90
+ log '>> Restarting ...'
91
+ stop
92
+ remove_pid_file
93
+ @on_restart.call
94
+ exit!
95
+ end
92
96
  end
93
97
 
94
98
  module ClassMethods
data/lib/thin/response.rb CHANGED
@@ -7,6 +7,8 @@ module Thin
7
7
  SERVER = 'Server'.freeze
8
8
  CONTENT_LENGTH = 'Content-Length'.freeze
9
9
 
10
+ PERSISTENT_STATUSES = [100, 101].freeze
11
+
10
12
  # Status code
11
13
  attr_accessor :status
12
14
 
@@ -93,9 +95,10 @@ module Thin
93
95
  end
94
96
 
95
97
  # Persistent connection must be requested as keep-alive
96
- # from the server and have a Content-Length.
98
+ # from the server and have a Content-Length, or the response
99
+ # status must require that the connection remain open.
97
100
  def persistent?
98
- @persistent && @headers.has_key?(CONTENT_LENGTH)
101
+ (@persistent && @headers.has_key?(CONTENT_LENGTH)) || PERSISTENT_STATUSES.include?(@status)
99
102
  end
100
103
  end
101
104
  end
data/lib/thin/runner.rb CHANGED
@@ -70,7 +70,15 @@ module Thin
70
70
  "Rack adapter") { |file| @options[:rackup] = file }
71
71
  opts.on("-c", "--chdir DIR", "Change to dir before starting") { |dir| @options[:chdir] = File.expand_path(dir) }
72
72
  opts.on( "--stats PATH", "Mount the Stats adapter under PATH") { |path| @options[:stats] = path }
73
-
73
+
74
+ opts.separator ""
75
+ opts.separator "SSL options:"
76
+
77
+ opts.on( "--ssl", "Enables SSL") { @options[:ssl] = true }
78
+ opts.on( "--ssl-key-file PATH", "Path to private key") { |path| @options[:ssl_key_file] = path }
79
+ opts.on( "--ssl-cert-file PATH", "Path to certificate") { |path| @options[:ssl_cert_file] = path }
80
+ opts.on( "--ssl-verify", "Enables SSL certificate verification") { @options[:ssl_verify] = true }
81
+
74
82
  opts.separator ""
75
83
  opts.separator "Adapter options:"
76
84
  opts.on("-e", "--environment ENV", "Framework environment " +
@@ -122,7 +130,7 @@ module Thin
122
130
  opts.separator "Common options:"
123
131
 
124
132
  opts.on_tail("-r", "--require FILE", "require the library") { |file| @options[:require] << file }
125
- opts.on_tail("-D", "--debug", "Set debbuging on") { @options[:debug] = true }
133
+ opts.on_tail("-D", "--debug", "Set debugging on") { @options[:debug] = true }
126
134
  opts.on_tail("-V", "--trace", "Set tracing on (log raw request/response)") { @options[:trace] = true }
127
135
  opts.on_tail("-h", "--help", "Show this message") { puts opts; exit }
128
136
  opts.on_tail('-v', '--version', "Show version") { puts Thin::SERVER; exit }
data/lib/thin/server.rb CHANGED
@@ -82,6 +82,9 @@ module Thin
82
82
  # Allow using threads in the backend.
83
83
  def_delegators :backend, :threaded?, :threaded=
84
84
 
85
+ # Allow using SSL in the backend.
86
+ def_delegators :backend, :ssl?, :ssl=, :ssl_options=
87
+
85
88
  # Address and port on which the server is listening for connections.
86
89
  def_delegators :backend, :host, :port
87
90
 
data/lib/thin/version.rb CHANGED
@@ -6,11 +6,11 @@ module Thin
6
6
  module VERSION #:nodoc:
7
7
  MAJOR = 1
8
8
  MINOR = 2
9
- TINY = 7
9
+ TINY = 8
10
10
 
11
11
  STRING = [MAJOR, MINOR, TINY].join('.')
12
12
 
13
- CODENAME = "No Hup".freeze
13
+ CODENAME = "Black Keys".freeze
14
14
 
15
15
  RACK = [1, 0].freeze # Rack protocol version
16
16
  end
Binary file
@@ -4,6 +4,7 @@ describe Connection do
4
4
  before do
5
5
  @connection = Connection.new(mock('EM', :null_object => true))
6
6
  @connection.post_init
7
+ @connection.backend = mock("backend", :ssl? => false)
7
8
  @connection.app = proc do |env|
8
9
  [200, {}, ['']]
9
10
  end
@@ -150,6 +150,10 @@ describe 'Daemonizing' do
150
150
  proc { sleep 0.1 while File.exist?(@server.pid_file) }.should take_less_then(10)
151
151
  end
152
152
 
153
+ it "should ignore if no restart block specified" do
154
+ TestServer.restart(@server.pid_file)
155
+ end
156
+
153
157
  it "should not restart when not running" do
154
158
  silence_stream STDOUT do
155
159
  TestServer.restart(@server.pid_file)
@@ -9,7 +9,7 @@ begin
9
9
  @rails_app_path = File.dirname(__FILE__) + '/../rails_app'
10
10
  @request = Rack::MockRequest.new(Rack::Adapter::Rails.new(:root => @rails_app_path))
11
11
  end
12
-
12
+
13
13
  it "should handle simple GET request" do
14
14
  res = @request.get("/simple", :lint => true)
15
15
 
@@ -104,3 +104,70 @@ begin
104
104
  rescue Gem::LoadError
105
105
  warn 'Rails 2.0.2 is required to run the Rails adapter specs'
106
106
  end
107
+
108
+ module RailsMock
109
+ module VERSION
110
+ MAJOR = 0
111
+ MINOR = 0
112
+ TINY = 0
113
+ end
114
+ end
115
+
116
+ describe Rack::Adapter::Rails, "Adapter version" do
117
+ before do
118
+ unless defined?(::Rails)
119
+ ::Rails = RailsMock
120
+ end
121
+ end
122
+
123
+ it "should use Rack based adapter when Rails = 2.2.3" do
124
+ with_rails_version(2, 2, 3) do
125
+ Rack::Adapter::Rails.should be_rack_based
126
+ end
127
+ end
128
+
129
+ it "should not use Rack based adapter when Rails < 2.2.3" do
130
+ with_rails_version(2, 2, 2) do
131
+ Rack::Adapter::Rails.should_not be_rack_based
132
+ end
133
+ end
134
+
135
+ it "should not use Rack based adapter when Rails = 1.2.3" do
136
+ with_rails_version(1, 2, 2) do
137
+ Rack::Adapter::Rails.should_not be_rack_based
138
+ end
139
+ end
140
+
141
+ it "should use Rack based adapter when Rails = 3.0.0" do
142
+ with_rails_version(3, 0, 0) do
143
+ Rack::Adapter::Rails.should be_rack_based
144
+ end
145
+ end
146
+
147
+ def with_rails_version(major, minor, tiny)
148
+ old_major = ::Rails::VERSION::MAJOR
149
+ old_minor = ::Rails::VERSION::MINOR
150
+ old_tiny = ::Rails::VERSION::TINY
151
+
152
+ silence_warnings do
153
+ ::Rails::VERSION.const_set :MAJOR, major
154
+ ::Rails::VERSION.const_set :MINOR, minor
155
+ ::Rails::VERSION.const_set :TINY, tiny
156
+ end
157
+
158
+ yield
159
+
160
+ silence_warnings do
161
+ ::Rails::VERSION.const_set :MAJOR, old_major
162
+ ::Rails::VERSION.const_set :MINOR, old_minor
163
+ ::Rails::VERSION.const_set :TINY, old_tiny
164
+ end
165
+ end
166
+
167
+ def silence_warnings
168
+ old_verbose, $VERBOSE = $VERBOSE, nil
169
+ yield
170
+ ensure
171
+ $VERBOSE = old_verbose
172
+ end unless method_defined?(:silence_warnings)
173
+ end
@@ -1,4 +1,4 @@
1
- #!/usr/local/bin/ruby
1
+ #!/usr/bin/env ruby
2
2
 
3
3
  require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
4
4
 
@@ -7,4 +7,4 @@ require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_
7
7
  require "dispatcher"
8
8
 
9
9
  ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
10
- Dispatcher.dispatch
10
+ Dispatcher.dispatch
@@ -1,4 +1,4 @@
1
- #!/usr/local/bin/ruby
1
+ #!/usr/bin/env ruby
2
2
  #
3
3
  # You may specify the path to the FastCGI crash log (a log of unhandled
4
4
  # exceptions which forced the FastCGI instance to exit, great for debugging)
@@ -1,4 +1,4 @@
1
- #!/usr/local/bin/ruby
1
+ #!/usr/bin/env ruby
2
2
 
3
3
  require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
4
4
 
@@ -7,4 +7,4 @@ require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_
7
7
  require "dispatcher"
8
8
 
9
9
  ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
10
- Dispatcher.dispatch
10
+ Dispatcher.dispatch
@@ -240,4 +240,15 @@ EOS
240
240
  env[pi].should == uri.path
241
241
  end
242
242
  end
243
+
244
+ it "should parse IE7 badly encoded URL" do
245
+ body = <<-EOS.chomp
246
+ GET /H%uFFFDhnchenbrustfilet HTTP/1.1
247
+ Host: localhost:3000
248
+
249
+ EOS
250
+ request = R(body, true)
251
+
252
+ request.env['REQUEST_URI'].should == "/H%uFFFDhnchenbrustfilet"
253
+ end
243
254
  end
@@ -80,6 +80,17 @@ describe Response do
80
80
  @response.should_not be_persistent
81
81
  end
82
82
 
83
+ it "should be persistent when the status code implies it should stay open" do
84
+ @response = Response.new
85
+ @response.status = 100
86
+ # "There are no required headers for this class of status code" -- HTTP spec 10.1
87
+ @response.body = ''
88
+
89
+ # Specifying it as persistent in the code is NOT required
90
+ # @response.persistent!
91
+ @response.should be_persistent
92
+ end
93
+
83
94
  it "should be persistent when specified" do
84
95
  @response.persistent!
85
96
  @response.should be_persistent
data/spec/spec_helper.rb CHANGED
@@ -144,6 +144,7 @@ module Helpers
144
144
 
145
145
  def start_server(address=DEFAULT_TEST_ADDRESS, port=DEFAULT_TEST_PORT, options={}, &app)
146
146
  @server = Thin::Server.new(address, port, options, app)
147
+ @server.ssl = options[:ssl]
147
148
  @server.threaded = options[:threaded]
148
149
  @server.timeout = 3
149
150
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thin
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.7
4
+ version: 1.2.8
5
5
  platform: x86-mingw32
6
6
  authors:
7
7
  - Marc-Andre Cournoyer
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-03-01 00:00:00 -05:00
12
+ date: 2011-02-25 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -96,6 +96,7 @@ files:
96
96
  - lib/thin/statuses.rb
97
97
  - lib/thin/version.rb
98
98
  - lib/thin.rb
99
+ - lib/thin_parser.so
99
100
  - spec/backends/swiftiply_client_spec.rb
100
101
  - spec/backends/tcp_server_spec.rb
101
102
  - spec/backends/unix_server_spec.rb
@@ -186,8 +187,6 @@ files:
186
187
  - ext/thin_parser/extconf.rb
187
188
  - ext/thin_parser/common.rl
188
189
  - ext/thin_parser/parser.rl
189
- - lib/1.8/thin_parser.so
190
- - lib/1.9/thin_parser.so
191
190
  has_rdoc: true
192
191
  homepage: http://code.macournoyer.com/thin/
193
192
  licenses: []
Binary file
Binary file