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 +29 -0
- data/Rakefile +1 -1
- data/example/monit_sockets +4 -4
- data/example/monit_unixsock +4 -4
- data/ext/thin_parser/common.rl +1 -1
- data/ext/thin_parser/parser.c +231 -167
- data/lib/rack/adapter/rails.rb +9 -6
- data/lib/thin/backends/base.rb +8 -0
- data/lib/thin/backends/unix_server.rb +9 -4
- data/lib/thin/connection.rb +9 -1
- data/lib/thin/controllers/controller.rb +6 -0
- data/lib/thin/daemonizing.rb +10 -6
- data/lib/thin/response.rb +5 -2
- data/lib/thin/runner.rb +10 -2
- data/lib/thin/server.rb +3 -0
- data/lib/thin/version.rb +2 -2
- data/lib/thin_parser.so +0 -0
- data/spec/connection_spec.rb +1 -0
- data/spec/daemonizing_spec.rb +4 -0
- data/spec/rack/rails_adapter_spec.rb +68 -1
- data/spec/rails_app/public/dispatch.cgi +2 -2
- data/spec/rails_app/public/dispatch.fcgi +1 -1
- data/spec/rails_app/public/dispatch.rb +2 -2
- data/spec/request/parser_spec.rb +11 -0
- data/spec/response_spec.rb +11 -0
- data/spec/spec_helper.rb +1 -0
- metadata +3 -4
- data/lib/1.8/thin_parser.so +0 -0
- data/lib/1.9/thin_parser.so +0 -0
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 "
|
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"
|
data/example/monit_sockets
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
check process blog1
|
2
2
|
with pidfile /u/apps/blog/shared/pids/thin.14000.pid
|
3
|
-
start program = "
|
4
|
-
stop program = "
|
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 = "
|
14
|
-
stop program = "
|
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
|
data/example/monit_unixsock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
check process blog1
|
2
2
|
with pidfile /u/apps/blog/shared/pids/thin.1.pid
|
3
|
-
start program = "
|
4
|
-
stop program = "
|
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 = "
|
14
|
-
stop program = "
|
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
|
data/ext/thin_parser/common.rl
CHANGED
@@ -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");
|
data/ext/thin_parser/parser.c
CHANGED
@@ -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 =
|
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
|
107
|
-
case 95: goto
|
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
|
111
|
+
goto st39;
|
112
112
|
} else if ( (*p) > 57 ) {
|
113
113
|
if ( 65 <= (*p) && (*p) <= 90 )
|
114
|
-
goto
|
114
|
+
goto st39;
|
115
115
|
} else
|
116
|
-
goto
|
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
|
-
|
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
|
-
|
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
|
-
|
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 =
|
379
|
+
{p++; cs = 58; goto _out;}
|
380
380
|
}
|
381
|
-
goto
|
382
|
-
|
381
|
+
goto st58;
|
382
|
+
st58:
|
383
383
|
if ( ++p == pe )
|
384
|
-
goto
|
385
|
-
case
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
579
|
-
case 58: goto
|
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
|
598
|
+
goto st25;
|
584
599
|
} else if ( (*p) > 57 ) {
|
585
600
|
if ( (*p) > 90 ) {
|
586
601
|
if ( 97 <= (*p) && (*p) <= 122 )
|
587
|
-
goto
|
602
|
+
goto st25;
|
588
603
|
} else if ( (*p) >= 65 )
|
589
|
-
goto
|
604
|
+
goto st25;
|
590
605
|
} else
|
591
|
-
goto
|
606
|
+
goto st25;
|
592
607
|
goto st0;
|
593
608
|
tr7:
|
594
609
|
#line 22 "parser.rl"
|
595
610
|
{MARK(mark, p); }
|
596
|
-
goto
|
597
|
-
|
611
|
+
goto st26;
|
612
|
+
st26:
|
598
613
|
if ( ++p == pe )
|
599
|
-
goto
|
600
|
-
case
|
601
|
-
#line
|
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
|
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
|
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
|
634
|
+
goto st28;
|
631
635
|
} else if ( (*p) > 70 ) {
|
632
636
|
if ( 97 <= (*p) && (*p) <= 102 )
|
633
|
-
goto
|
637
|
+
goto st28;
|
634
638
|
} else
|
635
|
-
goto
|
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
|
647
|
+
goto st26;
|
663
648
|
} else if ( (*p) > 70 ) {
|
664
649
|
if ( 97 <= (*p) && (*p) <= 102 )
|
665
|
-
goto
|
650
|
+
goto st26;
|
666
651
|
} else
|
667
|
-
goto
|
652
|
+
goto st26;
|
668
653
|
goto st0;
|
669
|
-
|
654
|
+
st29:
|
670
655
|
if ( ++p == pe )
|
671
|
-
goto
|
672
|
-
case
|
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
|
-
|
683
|
-
#line
|
684
|
-
{
|
685
|
-
|
686
|
-
|
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
|
693
|
-
case
|
694
|
-
#line
|
673
|
+
goto _test_eof30;
|
674
|
+
case 30:
|
675
|
+
#line 676 "parser.c"
|
695
676
|
switch( (*p) ) {
|
696
|
-
case 32: goto
|
697
|
-
case 35: goto
|
698
|
-
case 37: goto
|
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
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
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
|
707
|
+
goto st30;
|
734
708
|
} else if ( (*p) > 70 ) {
|
735
709
|
if ( 97 <= (*p) && (*p) <= 102 )
|
736
|
-
goto
|
710
|
+
goto st30;
|
737
711
|
} else
|
738
|
-
goto
|
712
|
+
goto st30;
|
739
713
|
goto st0;
|
740
|
-
|
714
|
+
st33:
|
741
715
|
if ( ++p == pe )
|
742
|
-
goto
|
743
|
-
case
|
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
|
759
|
-
case
|
760
|
-
case
|
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)
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
768
|
-
|
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
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
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) >
|
784
|
-
if (
|
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
|
-
|
794
|
-
|
795
|
-
|
796
|
-
|
797
|
-
|
798
|
-
|
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
|
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
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
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
|
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
|
-
|
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: {}
|
data/lib/rack/adapter/rails.rb
CHANGED
@@ -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)
|
data/lib/thin/backends/base.rb
CHANGED
@@ -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
|
-
|
18
|
-
|
19
|
-
|
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
|
data/lib/thin/connection.rb
CHANGED
@@ -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
|
|
data/lib/thin/daemonizing.rb
CHANGED
@@ -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
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
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
|
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 =
|
9
|
+
TINY = 8
|
10
10
|
|
11
11
|
STRING = [MAJOR, MINOR, TINY].join('.')
|
12
12
|
|
13
|
-
CODENAME = "
|
13
|
+
CODENAME = "Black Keys".freeze
|
14
14
|
|
15
15
|
RACK = [1, 0].freeze # Rack protocol version
|
16
16
|
end
|
data/lib/thin_parser.so
ADDED
Binary file
|
data/spec/connection_spec.rb
CHANGED
data/spec/daemonizing_spec.rb
CHANGED
@@ -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/
|
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/
|
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
|
data/spec/request/parser_spec.rb
CHANGED
@@ -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
|
data/spec/response_spec.rb
CHANGED
@@ -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.
|
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:
|
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: []
|
data/lib/1.8/thin_parser.so
DELETED
Binary file
|
data/lib/1.9/thin_parser.so
DELETED
Binary file
|