thin 1.2.7-x86-mswin32 → 1.2.8-x86-mswin32

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -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
@@ -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 }
@@ -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
 
@@ -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
@@ -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-mswin32
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