rack 1.1.6 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rack might be problematic. Click here for more details.
- data/README +9 -205
- data/SPEC +3 -3
- data/lib/rack.rb +1 -24
- data/lib/rack/auth/abstract/request.rb +1 -5
- data/lib/rack/auth/digest/md5.rb +1 -2
- data/lib/rack/auth/digest/params.rb +1 -1
- data/lib/rack/content_length.rb +1 -1
- data/lib/rack/etag.rb +15 -6
- data/lib/rack/file.rb +3 -1
- data/lib/rack/handler/cgi.rb +8 -7
- data/lib/rack/handler/fastcgi.rb +1 -1
- data/lib/rack/handler/lsws.rb +1 -1
- data/lib/rack/handler/mongrel.rb +1 -1
- data/lib/rack/handler/scgi.rb +1 -4
- data/lib/rack/handler/webrick.rb +10 -6
- data/lib/rack/lint.rb +29 -37
- data/lib/rack/mime.rb +2 -0
- data/lib/rack/mock.rb +2 -1
- data/lib/rack/recursive.rb +4 -0
- data/lib/rack/request.rb +8 -6
- data/lib/rack/response.rb +1 -0
- data/lib/rack/rewindable_input.rb +13 -10
- data/lib/rack/sendfile.rb +8 -6
- data/lib/rack/server.rb +68 -9
- data/lib/rack/session/cookie.rb +1 -10
- data/lib/rack/session/memcache.rb +1 -1
- data/lib/rack/urlmap.rb +6 -7
- data/lib/rack/utils.rb +40 -71
- data/rack.gemspec +7 -11
- data/spec/cgi/lighttpd.conf +25 -0
- data/spec/cgi/rackup_stub.rb +6 -0
- data/spec/cgi/sample_rackup.ru +5 -0
- data/spec/cgi/test +9 -0
- data/spec/cgi/test.fcgi +8 -0
- data/spec/cgi/test.ru +5 -0
- data/spec/multipart/bad_robots +259 -0
- data/spec/multipart/binary +0 -0
- data/spec/multipart/empty +10 -0
- data/spec/multipart/fail_16384_nofile +814 -0
- data/spec/multipart/file1.txt +1 -0
- data/spec/multipart/filename_and_modification_param +7 -0
- data/spec/multipart/filename_with_escaped_quotes +6 -0
- data/spec/multipart/filename_with_escaped_quotes_and_modification_param +7 -0
- data/spec/multipart/filename_with_percent_escaped_quotes +6 -0
- data/spec/multipart/filename_with_unescaped_quotes +6 -0
- data/spec/multipart/ie +6 -0
- data/spec/multipart/nested +10 -0
- data/spec/multipart/none +9 -0
- data/spec/multipart/semicolon +6 -0
- data/spec/multipart/text +10 -0
- data/spec/rackup/config.ru +31 -0
- data/{test/spec_rack_auth_basic.rb → spec/spec_auth_basic.rb} +11 -14
- data/{test/spec_rack_auth_digest.rb → spec/spec_auth_digest.rb} +18 -27
- data/{test/spec_rack_builder.rb → spec/spec_builder.rb} +49 -10
- data/{test/spec_rack_cascade.rb → spec/spec_cascade.rb} +7 -10
- data/{test/spec_rack_cgi.rb → spec/spec_cgi.rb} +34 -32
- data/{test/spec_rack_chunked.rb → spec/spec_chunked.rb} +8 -10
- data/{test/spec_rack_commonlogger.rb → spec/spec_commonlogger.rb} +10 -15
- data/{test/spec_rack_conditionalget.rb → spec/spec_conditionalget.rb} +5 -7
- data/{test/spec_rack_config.rb → spec/spec_config.rb} +6 -7
- data/{test/spec_rack_content_length.rb → spec/spec_content_length.rb} +7 -8
- data/{test/spec_rack_content_type.rb → spec/spec_content_type.rb} +5 -6
- data/{test/spec_rack_deflater.rb → spec/spec_deflater.rb} +11 -13
- data/{test/spec_rack_directory.rb → spec/spec_directory.rb} +6 -10
- data/{test/spec_rack_etag.rb → spec/spec_etag.rb} +3 -5
- data/{test/spec_rack_fastcgi.rb → spec/spec_fastcgi.rb} +36 -29
- data/{test/spec_rack_file.rb → spec/spec_file.rb} +9 -13
- data/{test/spec_rack_handler.rb → spec/spec_handler.rb} +10 -12
- data/{test/spec_rack_head.rb → spec/spec_head.rb} +3 -3
- data/{test/spec_rack_lint.rb → spec/spec_lint.rb} +19 -32
- data/{test/spec_rack_lobster.rb → spec/spec_lobster.rb} +9 -11
- data/{test/spec_rack_lock.rb → spec/spec_lock.rb} +15 -17
- data/{test/spec_rack_logger.rb → spec/spec_logger.rb} +6 -7
- data/{test/spec_rack_methodoverride.rb → spec/spec_methodoverride.rb} +15 -17
- data/{test/spec_rack_mock.rb → spec/spec_mock.rb} +30 -32
- data/{test/spec_rack_mongrel.rb → spec/spec_mongrel.rb} +40 -46
- data/{test/spec_rack_nulllogger.rb → spec/spec_nulllogger.rb} +4 -5
- data/{test/spec_rack_recursive.rb → spec/spec_recursive.rb} +28 -36
- data/{test/spec_rack_request.rb → spec/spec_request.rb} +84 -98
- data/{test/spec_rack_response.rb → spec/spec_response.rb} +46 -27
- data/spec/spec_rewindable_input.rb +118 -0
- data/{test/spec_rack_runtime.rb → spec/spec_runtime.rb} +15 -11
- data/{test/spec_rack_sendfile.rb → spec/spec_sendfile.rb} +11 -14
- data/{test/spec_rack_session_cookie.rb → spec/spec_session_cookie.rb} +14 -36
- data/{test/spec_rack_session_memcache.rb → spec/spec_session_memcache.rb} +32 -26
- data/{test/spec_rack_session_pool.rb → spec/spec_session_pool.rb} +36 -31
- data/spec/spec_showexceptions.rb +23 -0
- data/spec/spec_showstatus.rb +79 -0
- data/{test/spec_rack_static.rb → spec/spec_static.rb} +5 -9
- data/{test/spec_rack_thin.rb → spec/spec_thin.rb} +30 -35
- data/{test/spec_rack_urlmap.rb → spec/spec_urlmap.rb} +6 -8
- data/{test/spec_rack_utils.rb → spec/spec_utils.rb} +134 -74
- data/{test/spec_rack_webrick.rb → spec/spec_webrick.rb} +28 -36
- data/spec/testrequest.rb +77 -0
- data/spec/unregistered_handler/rack/handler/unregistered.rb +7 -0
- data/spec/unregistered_handler/rack/handler/unregistered_long_one.rb +7 -0
- metadata +176 -191
- data/RDOX +0 -0
- data/lib/rack/adapter/camping.rb +0 -22
- data/test/spec_auth.rb +0 -57
- data/test/spec_rack_camping.rb +0 -55
- data/test/spec_rack_rewindable_input.rb +0 -118
- data/test/spec_rack_showexceptions.rb +0 -21
- data/test/spec_rack_showstatus.rb +0 -72
- data/test/spec_rackup.rb +0 -164
@@ -1,29 +1,27 @@
|
|
1
|
-
require 'test/spec'
|
2
|
-
|
3
1
|
require 'rack/lobster'
|
4
2
|
require 'rack/mock'
|
5
3
|
|
6
|
-
|
7
|
-
|
4
|
+
describe Rack::Lobster::LambdaLobster do
|
5
|
+
should "be a single lambda" do
|
8
6
|
Rack::Lobster::LambdaLobster.should.be.kind_of Proc
|
9
7
|
end
|
10
|
-
|
11
|
-
|
8
|
+
|
9
|
+
should "look like a lobster" do
|
12
10
|
res = Rack::MockRequest.new(Rack::Lobster::LambdaLobster).get("/")
|
13
11
|
res.should.be.ok
|
14
12
|
res.body.should.include "(,(,,(,,,("
|
15
13
|
res.body.should.include "?flip"
|
16
14
|
end
|
17
15
|
|
18
|
-
|
16
|
+
should "be flippable" do
|
19
17
|
res = Rack::MockRequest.new(Rack::Lobster::LambdaLobster).get("/?flip")
|
20
18
|
res.should.be.ok
|
21
19
|
res.body.should.include "(,,,(,,(,("
|
22
20
|
end
|
23
21
|
end
|
24
22
|
|
25
|
-
|
26
|
-
|
23
|
+
describe Rack::Lobster do
|
24
|
+
should "look like a lobster" do
|
27
25
|
res = Rack::MockRequest.new(Rack::Lobster.new).get("/")
|
28
26
|
res.should.be.ok
|
29
27
|
res.body.should.include "(,(,,(,,,("
|
@@ -31,13 +29,13 @@ context "Rack::Lobster" do
|
|
31
29
|
res.body.should.include "crash"
|
32
30
|
end
|
33
31
|
|
34
|
-
|
32
|
+
should "be flippable" do
|
35
33
|
res = Rack::MockRequest.new(Rack::Lobster.new).get("/?flip=left")
|
36
34
|
res.should.be.ok
|
37
35
|
res.body.should.include "(,,,(,,(,("
|
38
36
|
end
|
39
37
|
|
40
|
-
|
38
|
+
should "provide crashing for testing purposes" do
|
41
39
|
lambda {
|
42
40
|
Rack::MockRequest.new(Rack::Lobster.new).get("/?flip=crash")
|
43
41
|
}.should.raise
|
@@ -1,37 +1,35 @@
|
|
1
|
-
require 'test/spec'
|
2
|
-
|
3
|
-
require 'rack/mock'
|
4
1
|
require 'rack/lock'
|
2
|
+
require 'rack/mock'
|
5
3
|
|
6
|
-
|
7
|
-
|
8
|
-
attr_reader :synchronized
|
4
|
+
class Lock
|
5
|
+
attr_reader :synchronized
|
9
6
|
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
def initialize
|
8
|
+
@synchronized = false
|
9
|
+
end
|
13
10
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
11
|
+
def synchronize
|
12
|
+
@synchronized = true
|
13
|
+
yield
|
18
14
|
end
|
15
|
+
end
|
19
16
|
|
20
|
-
|
17
|
+
describe Rack::Lock do
|
18
|
+
should "call synchronize on lock" do
|
21
19
|
lock = Lock.new
|
22
20
|
env = Rack::MockRequest.env_for("/")
|
23
|
-
app = Rack::Lock.new(lambda { |
|
21
|
+
app = Rack::Lock.new(lambda { |inner_env| }, lock)
|
24
22
|
lock.synchronized.should.equal false
|
25
23
|
app.call(env)
|
26
24
|
lock.synchronized.should.equal true
|
27
25
|
end
|
28
26
|
|
29
|
-
|
27
|
+
should "set multithread flag to false" do
|
30
28
|
app = Rack::Lock.new(lambda { |env| env['rack.multithread'] })
|
31
29
|
app.call(Rack::MockRequest.env_for("/")).should.equal false
|
32
30
|
end
|
33
31
|
|
34
|
-
|
32
|
+
should "reset original multithread flag when exiting lock" do
|
35
33
|
app = Rack::Lock.new(lambda { |env| env })
|
36
34
|
app.call(Rack::MockRequest.env_for("/"))['rack.multithread'].should.equal true
|
37
35
|
end
|
@@ -1,9 +1,8 @@
|
|
1
|
-
require 'rack/logger'
|
2
|
-
require 'rack/lint'
|
3
1
|
require 'stringio'
|
2
|
+
require 'rack/logger'
|
4
3
|
|
5
|
-
|
6
|
-
|
4
|
+
describe Rack::Logger do
|
5
|
+
should "log to rack.errors" do
|
7
6
|
app = lambda { |env|
|
8
7
|
log = env['rack.logger']
|
9
8
|
log.debug("Created logger")
|
@@ -14,8 +13,8 @@ context "Rack::Logger" do
|
|
14
13
|
}
|
15
14
|
|
16
15
|
errors = StringIO.new
|
17
|
-
Rack::Logger.new(app).call(
|
18
|
-
errors.string.should.match
|
19
|
-
errors.string.should.match
|
16
|
+
Rack::Logger.new(app).call('rack.errors' => errors)
|
17
|
+
errors.string.should.match(/INFO -- : Program started/)
|
18
|
+
errors.string.should.match(/WARN -- : Nothing to do/)
|
20
19
|
end
|
21
20
|
end
|
@@ -1,58 +1,56 @@
|
|
1
|
-
require 'test/spec'
|
2
|
-
|
3
|
-
require 'rack/mock'
|
4
|
-
require 'rack/methodoverride'
|
5
1
|
require 'stringio'
|
2
|
+
require 'rack/methodoverride'
|
3
|
+
require 'rack/mock'
|
6
4
|
|
7
|
-
|
8
|
-
|
5
|
+
describe Rack::MethodOverride do
|
6
|
+
should "not affect GET requests" do
|
9
7
|
env = Rack::MockRequest.env_for("/?_method=delete", :method => "GET")
|
10
|
-
app = Rack::MethodOverride.new(lambda
|
8
|
+
app = Rack::MethodOverride.new(lambda{|envx| Rack::Request.new(envx) })
|
11
9
|
req = app.call(env)
|
12
10
|
|
13
11
|
req.env["REQUEST_METHOD"].should.equal "GET"
|
14
12
|
end
|
15
13
|
|
16
|
-
|
14
|
+
should "modify REQUEST_METHOD for POST requests when _method parameter is set" do
|
17
15
|
env = Rack::MockRequest.env_for("/", :method => "POST", :input => "_method=put")
|
18
|
-
app = Rack::MethodOverride.new(lambda
|
16
|
+
app = Rack::MethodOverride.new(lambda{|envx| Rack::Request.new(envx) })
|
19
17
|
req = app.call(env)
|
20
18
|
|
21
19
|
req.env["REQUEST_METHOD"].should.equal "PUT"
|
22
20
|
end
|
23
21
|
|
24
|
-
|
22
|
+
should "modify REQUEST_METHOD for POST requests when X-HTTP-Method-Override is set" do
|
25
23
|
env = Rack::MockRequest.env_for("/",
|
26
24
|
:method => "POST",
|
27
25
|
"HTTP_X_HTTP_METHOD_OVERRIDE" => "PUT"
|
28
26
|
)
|
29
|
-
app = Rack::MethodOverride.new(lambda
|
27
|
+
app = Rack::MethodOverride.new(lambda{|envx| Rack::Request.new(envx) })
|
30
28
|
req = app.call(env)
|
31
29
|
|
32
30
|
req.env["REQUEST_METHOD"].should.equal "PUT"
|
33
31
|
end
|
34
32
|
|
35
|
-
|
33
|
+
should "not modify REQUEST_METHOD if the method is unknown" do
|
36
34
|
env = Rack::MockRequest.env_for("/", :method => "POST", :input => "_method=foo")
|
37
|
-
app = Rack::MethodOverride.new(lambda
|
35
|
+
app = Rack::MethodOverride.new(lambda{|envx| Rack::Request.new(envx) })
|
38
36
|
req = app.call(env)
|
39
37
|
|
40
38
|
req.env["REQUEST_METHOD"].should.equal "POST"
|
41
39
|
end
|
42
40
|
|
43
|
-
|
41
|
+
should "not modify REQUEST_METHOD when _method is nil" do
|
44
42
|
env = Rack::MockRequest.env_for("/", :method => "POST", :input => "foo=bar")
|
45
|
-
app = Rack::MethodOverride.new(lambda
|
43
|
+
app = Rack::MethodOverride.new(lambda{|envx| Rack::Request.new(envx) })
|
46
44
|
req = app.call(env)
|
47
45
|
|
48
46
|
req.env["REQUEST_METHOD"].should.equal "POST"
|
49
47
|
end
|
50
48
|
|
51
|
-
|
49
|
+
should "store the original REQUEST_METHOD prior to overriding" do
|
52
50
|
env = Rack::MockRequest.env_for("/",
|
53
51
|
:method => "POST",
|
54
52
|
:input => "_method=options")
|
55
|
-
app = Rack::MethodOverride.new(lambda
|
53
|
+
app = Rack::MethodOverride.new(lambda{|envx| Rack::Request.new(envx) })
|
56
54
|
req = app.call(env)
|
57
55
|
|
58
56
|
req.env["rack.methodoverride.original_method"].should.equal "POST"
|
@@ -1,35 +1,33 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
require 'rack/mock'
|
3
|
-
require 'rack/request'
|
4
|
-
require 'rack/response'
|
5
3
|
|
6
4
|
app = lambda { |env|
|
7
5
|
req = Rack::Request.new(env)
|
8
|
-
|
6
|
+
|
9
7
|
env["mock.postdata"] = env["rack.input"].read
|
10
8
|
if req.GET["error"]
|
11
9
|
env["rack.errors"].puts req.GET["error"]
|
12
10
|
env["rack.errors"].flush
|
13
11
|
end
|
14
|
-
|
12
|
+
|
15
13
|
Rack::Response.new(env.to_yaml,
|
16
14
|
req.GET["status"] || 200,
|
17
15
|
"Content-Type" => "text/yaml").finish
|
18
16
|
}
|
19
17
|
|
20
|
-
|
21
|
-
|
18
|
+
describe Rack::MockRequest do
|
19
|
+
should "return a MockResponse" do
|
22
20
|
res = Rack::MockRequest.new(app).get("")
|
23
21
|
res.should.be.kind_of Rack::MockResponse
|
24
22
|
end
|
25
23
|
|
26
|
-
|
24
|
+
should "be able to only return the environment" do
|
27
25
|
env = Rack::MockRequest.env_for("")
|
28
26
|
env.should.be.kind_of Hash
|
29
27
|
env.should.include "rack.version"
|
30
28
|
end
|
31
29
|
|
32
|
-
|
30
|
+
should "provide sensible defaults" do
|
33
31
|
res = Rack::MockRequest.new(app).request
|
34
32
|
|
35
33
|
env = YAML.load(res.body)
|
@@ -43,7 +41,7 @@ context "Rack::MockRequest" do
|
|
43
41
|
env["mock.postdata"].should.be.empty
|
44
42
|
end
|
45
43
|
|
46
|
-
|
44
|
+
should "allow GET/POST/PUT/DELETE" do
|
47
45
|
res = Rack::MockRequest.new(app).get("", :input => "foo")
|
48
46
|
env = YAML.load(res.body)
|
49
47
|
env["REQUEST_METHOD"].should.equal "GET"
|
@@ -64,12 +62,12 @@ context "Rack::MockRequest" do
|
|
64
62
|
should.equal "OPTIONS"
|
65
63
|
end
|
66
64
|
|
67
|
-
|
65
|
+
should "set content length" do
|
68
66
|
env = Rack::MockRequest.env_for("/", :input => "foo")
|
69
67
|
env["CONTENT_LENGTH"].should.equal "3"
|
70
68
|
end
|
71
69
|
|
72
|
-
|
70
|
+
should "allow posting" do
|
73
71
|
res = Rack::MockRequest.new(app).get("", :input => "foo")
|
74
72
|
env = YAML.load(res.body)
|
75
73
|
env["mock.postdata"].should.equal "foo"
|
@@ -79,7 +77,7 @@ context "Rack::MockRequest" do
|
|
79
77
|
env["mock.postdata"].should.equal "foo"
|
80
78
|
end
|
81
79
|
|
82
|
-
|
80
|
+
should "use all parts of an URL" do
|
83
81
|
res = Rack::MockRequest.new(app).
|
84
82
|
get("https://bla.example.org:9292/meh/foo?bar")
|
85
83
|
res.should.be.kind_of Rack::MockResponse
|
@@ -93,7 +91,7 @@ context "Rack::MockRequest" do
|
|
93
91
|
env["rack.url_scheme"].should.equal "https"
|
94
92
|
end
|
95
93
|
|
96
|
-
|
94
|
+
should "set SSL port and HTTP flag on when using https" do
|
97
95
|
res = Rack::MockRequest.new(app).
|
98
96
|
get("https://example.org/foo")
|
99
97
|
res.should.be.kind_of Rack::MockResponse
|
@@ -108,7 +106,7 @@ context "Rack::MockRequest" do
|
|
108
106
|
env["HTTPS"].should.equal "on"
|
109
107
|
end
|
110
108
|
|
111
|
-
|
109
|
+
should "prepend slash to uri path" do
|
112
110
|
res = Rack::MockRequest.new(app).
|
113
111
|
get("foo")
|
114
112
|
res.should.be.kind_of Rack::MockResponse
|
@@ -122,33 +120,33 @@ context "Rack::MockRequest" do
|
|
122
120
|
env["rack.url_scheme"].should.equal "http"
|
123
121
|
end
|
124
122
|
|
125
|
-
|
123
|
+
should "properly convert method name to an uppercase string" do
|
126
124
|
res = Rack::MockRequest.new(app).request(:get)
|
127
125
|
env = YAML.load(res.body)
|
128
126
|
env["REQUEST_METHOD"].should.equal "GET"
|
129
127
|
end
|
130
128
|
|
131
|
-
|
129
|
+
should "accept params and build query string for GET requests" do
|
132
130
|
res = Rack::MockRequest.new(app).get("/foo?baz=2", :params => {:foo => {:bar => "1"}})
|
133
131
|
env = YAML.load(res.body)
|
134
132
|
env["REQUEST_METHOD"].should.equal "GET"
|
135
|
-
env["QUERY_STRING"].should.
|
136
|
-
env["QUERY_STRING"].should.
|
133
|
+
env["QUERY_STRING"].should.include "baz=2"
|
134
|
+
env["QUERY_STRING"].should.include "foo[bar]=1"
|
137
135
|
env["PATH_INFO"].should.equal "/foo"
|
138
136
|
env["mock.postdata"].should.equal ""
|
139
137
|
end
|
140
138
|
|
141
|
-
|
139
|
+
should "accept raw input in params for GET requests" do
|
142
140
|
res = Rack::MockRequest.new(app).get("/foo?baz=2", :params => "foo[bar]=1")
|
143
141
|
env = YAML.load(res.body)
|
144
142
|
env["REQUEST_METHOD"].should.equal "GET"
|
145
|
-
env["QUERY_STRING"].should.
|
146
|
-
env["QUERY_STRING"].should.
|
143
|
+
env["QUERY_STRING"].should.include "baz=2"
|
144
|
+
env["QUERY_STRING"].should.include "foo[bar]=1"
|
147
145
|
env["PATH_INFO"].should.equal "/foo"
|
148
146
|
env["mock.postdata"].should.equal ""
|
149
147
|
end
|
150
148
|
|
151
|
-
|
149
|
+
should "accept params and build url encoded params for POST requests" do
|
152
150
|
res = Rack::MockRequest.new(app).post("/foo", :params => {:foo => {:bar => "1"}})
|
153
151
|
env = YAML.load(res.body)
|
154
152
|
env["REQUEST_METHOD"].should.equal "POST"
|
@@ -158,7 +156,7 @@ context "Rack::MockRequest" do
|
|
158
156
|
env["mock.postdata"].should.equal "foo[bar]=1"
|
159
157
|
end
|
160
158
|
|
161
|
-
|
159
|
+
should "accept raw input in params for POST requests" do
|
162
160
|
res = Rack::MockRequest.new(app).post("/foo", :params => "foo[bar]=1")
|
163
161
|
env = YAML.load(res.body)
|
164
162
|
env["REQUEST_METHOD"].should.equal "POST"
|
@@ -168,7 +166,7 @@ context "Rack::MockRequest" do
|
|
168
166
|
env["mock.postdata"].should.equal "foo[bar]=1"
|
169
167
|
end
|
170
168
|
|
171
|
-
|
169
|
+
should "accept params and build multipart encoded params for POST requests" do
|
172
170
|
files = Rack::Utils::Multipart::UploadedFile.new(File.join(File.dirname(__FILE__), "multipart", "file1.txt"))
|
173
171
|
res = Rack::MockRequest.new(app).post("/foo", :params => { "submit-name" => "Larry", "files" => files })
|
174
172
|
env = YAML.load(res.body)
|
@@ -179,7 +177,7 @@ context "Rack::MockRequest" do
|
|
179
177
|
env["mock.postdata"].length.should.equal 206
|
180
178
|
end
|
181
179
|
|
182
|
-
|
180
|
+
should "behave valid according to the Rack spec" do
|
183
181
|
lambda {
|
184
182
|
res = Rack::MockRequest.new(app).
|
185
183
|
get("https://bla.example.org:9292/meh/foo?bar", :lint => true)
|
@@ -187,8 +185,8 @@ context "Rack::MockRequest" do
|
|
187
185
|
end
|
188
186
|
end
|
189
187
|
|
190
|
-
|
191
|
-
|
188
|
+
describe Rack::MockResponse do
|
189
|
+
should "provide access to the HTTP status" do
|
192
190
|
res = Rack::MockRequest.new(app).get("")
|
193
191
|
res.should.be.successful
|
194
192
|
res.should.be.ok
|
@@ -209,18 +207,18 @@ context "Rack::MockResponse" do
|
|
209
207
|
res.should.be.empty
|
210
208
|
end
|
211
209
|
|
212
|
-
|
210
|
+
should "provide access to the HTTP headers" do
|
213
211
|
res = Rack::MockRequest.new(app).get("")
|
214
212
|
res.should.include "Content-Type"
|
215
213
|
res.headers["Content-Type"].should.equal "text/yaml"
|
216
214
|
res.original_headers["Content-Type"].should.equal "text/yaml"
|
217
215
|
res["Content-Type"].should.equal "text/yaml"
|
218
216
|
res.content_type.should.equal "text/yaml"
|
219
|
-
res.content_length.should.be
|
217
|
+
res.content_length.should.be > 0
|
220
218
|
res.location.should.be.nil
|
221
219
|
end
|
222
220
|
|
223
|
-
|
221
|
+
should "provide access to the HTTP body" do
|
224
222
|
res = Rack::MockRequest.new(app).get("")
|
225
223
|
res.body.should =~ /rack/
|
226
224
|
res.should =~ /rack/
|
@@ -228,14 +226,14 @@ context "Rack::MockResponse" do
|
|
228
226
|
res.should.satisfy { |r| r.match(/rack/) }
|
229
227
|
end
|
230
228
|
|
231
|
-
|
229
|
+
should "provide access to the Rack errors" do
|
232
230
|
res = Rack::MockRequest.new(app).get("/?error=foo", :lint => true)
|
233
231
|
res.should.be.ok
|
234
232
|
res.errors.should.not.be.empty
|
235
233
|
res.errors.should.include "foo"
|
236
234
|
end
|
237
235
|
|
238
|
-
|
236
|
+
should "optionally make Rack errors fatal" do
|
239
237
|
lambda {
|
240
238
|
Rack::MockRequest.new(app).get("/?error=foo", :fatal => true)
|
241
239
|
}.should.raise(Rack::MockRequest::FatalWarning)
|
@@ -1,37 +1,32 @@
|
|
1
|
-
require 'test/spec'
|
2
|
-
|
3
1
|
begin
|
2
|
+
require 'rack'
|
4
3
|
require 'rack/handler/mongrel'
|
5
|
-
require '
|
6
|
-
require 'rack/lint'
|
7
|
-
require 'testrequest'
|
4
|
+
require File.expand_path('../testrequest', __FILE__)
|
8
5
|
require 'timeout'
|
9
6
|
|
10
7
|
Thread.abort_on_exception = true
|
11
8
|
$tcp_defer_accept_opts = nil
|
12
9
|
$tcp_cork_opts = nil
|
13
10
|
|
14
|
-
|
15
|
-
|
11
|
+
describe Rack::Handler::Mongrel do
|
12
|
+
extend TestRequest::Helpers
|
16
13
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
@acc = server.run
|
24
|
-
end
|
14
|
+
@server = Mongrel::HttpServer.new(@host='0.0.0.0', @port=9201)
|
15
|
+
@server.register('/test',
|
16
|
+
Rack::Handler::Mongrel.new(Rack::Lint.new(TestRequest.new)))
|
17
|
+
@server.register('/stream',
|
18
|
+
Rack::Handler::Mongrel.new(Rack::Lint.new(StreamingRequest)))
|
19
|
+
@acc = @server.run
|
25
20
|
|
26
|
-
|
21
|
+
should "respond" do
|
27
22
|
lambda {
|
28
23
|
GET("/test")
|
29
24
|
}.should.not.raise
|
30
25
|
end
|
31
26
|
|
32
|
-
|
27
|
+
should "be a Mongrel" do
|
33
28
|
GET("/test")
|
34
|
-
status.should.
|
29
|
+
status.should.equal 200
|
35
30
|
response["SERVER_SOFTWARE"].should =~ /Mongrel/
|
36
31
|
response["HTTP_VERSION"].should.equal "HTTP/1.1"
|
37
32
|
response["SERVER_PROTOCOL"].should.equal "HTTP/1.1"
|
@@ -39,15 +34,15 @@ context "Rack::Handler::Mongrel" do
|
|
39
34
|
response["SERVER_NAME"].should.equal "0.0.0.0"
|
40
35
|
end
|
41
36
|
|
42
|
-
|
37
|
+
should "have rack headers" do
|
43
38
|
GET("/test")
|
44
39
|
response["rack.version"].should.equal [1,1]
|
45
|
-
response["rack.multithread"].should.be
|
46
|
-
response["rack.multiprocess"].should.be
|
47
|
-
response["rack.run_once"].should.be
|
40
|
+
response["rack.multithread"].should.be.true
|
41
|
+
response["rack.multiprocess"].should.be.false
|
42
|
+
response["rack.run_once"].should.be.false
|
48
43
|
end
|
49
44
|
|
50
|
-
|
45
|
+
should "have CGI headers on GET" do
|
51
46
|
GET("/test")
|
52
47
|
response["REQUEST_METHOD"].should.equal "GET"
|
53
48
|
response["SCRIPT_NAME"].should.equal "/test"
|
@@ -64,7 +59,7 @@ context "Rack::Handler::Mongrel" do
|
|
64
59
|
response["QUERY_STRING"].should.equal "quux=1"
|
65
60
|
end
|
66
61
|
|
67
|
-
|
62
|
+
should "have CGI headers on POST" do
|
68
63
|
POST("/test", {"rack-form-data" => "23"}, {'X-test-header' => '42'})
|
69
64
|
status.should.equal 200
|
70
65
|
response["REQUEST_METHOD"].should.equal "POST"
|
@@ -75,18 +70,18 @@ context "Rack::Handler::Mongrel" do
|
|
75
70
|
response["test.postdata"].should.equal "rack-form-data=23"
|
76
71
|
end
|
77
72
|
|
78
|
-
|
73
|
+
should "support HTTP auth" do
|
79
74
|
GET("/test", {:user => "ruth", :passwd => "secret"})
|
80
75
|
response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ="
|
81
76
|
end
|
82
77
|
|
83
|
-
|
78
|
+
should "set status" do
|
84
79
|
GET("/test?secret")
|
85
80
|
status.should.equal 403
|
86
81
|
response["rack.url_scheme"].should.equal "http"
|
87
82
|
end
|
88
83
|
|
89
|
-
|
84
|
+
should "provide a .run" do
|
90
85
|
block_ran = false
|
91
86
|
Thread.new {
|
92
87
|
Rack::Handler::Mongrel.run(lambda {}, {:Port => 9211}) { |server|
|
@@ -95,16 +90,16 @@ context "Rack::Handler::Mongrel" do
|
|
95
90
|
}
|
96
91
|
}
|
97
92
|
sleep 1
|
98
|
-
block_ran.should.be
|
93
|
+
block_ran.should.be.true
|
99
94
|
end
|
100
95
|
|
101
|
-
|
96
|
+
should "provide a .run that maps a hash" do
|
102
97
|
block_ran = false
|
103
98
|
Thread.new {
|
104
99
|
map = {'/'=>lambda{},'/foo'=>lambda{}}
|
105
100
|
Rack::Handler::Mongrel.run(map, :map => true, :Port => 9221) { |server|
|
106
101
|
server.should.be.kind_of Mongrel::HttpServer
|
107
|
-
server.classifier.uris.size.should.
|
102
|
+
server.classifier.uris.size.should.equal 2
|
108
103
|
server.classifier.uris.should.not.include '/arf'
|
109
104
|
server.classifier.uris.should.include '/'
|
110
105
|
server.classifier.uris.should.include '/foo'
|
@@ -112,16 +107,16 @@ context "Rack::Handler::Mongrel" do
|
|
112
107
|
}
|
113
108
|
}
|
114
109
|
sleep 1
|
115
|
-
block_ran.should.be
|
110
|
+
block_ran.should.be.true
|
116
111
|
end
|
117
112
|
|
118
|
-
|
113
|
+
should "provide a .run that maps a urlmap" do
|
119
114
|
block_ran = false
|
120
115
|
Thread.new {
|
121
116
|
map = Rack::URLMap.new({'/'=>lambda{},'/bar'=>lambda{}})
|
122
117
|
Rack::Handler::Mongrel.run(map, {:map => true, :Port => 9231}) { |server|
|
123
118
|
server.should.be.kind_of Mongrel::HttpServer
|
124
|
-
server.classifier.uris.size.should.
|
119
|
+
server.classifier.uris.size.should.equal 2
|
125
120
|
server.classifier.uris.should.not.include '/arf'
|
126
121
|
server.classifier.uris.should.include '/'
|
127
122
|
server.classifier.uris.should.include '/bar'
|
@@ -129,10 +124,10 @@ context "Rack::Handler::Mongrel" do
|
|
129
124
|
}
|
130
125
|
}
|
131
126
|
sleep 1
|
132
|
-
block_ran.should.be
|
127
|
+
block_ran.should.be.true
|
133
128
|
end
|
134
129
|
|
135
|
-
|
130
|
+
should "provide a .run that maps a urlmap restricting by host" do
|
136
131
|
block_ran = false
|
137
132
|
Thread.new {
|
138
133
|
map = Rack::URLMap.new({
|
@@ -148,22 +143,22 @@ context "Rack::Handler::Mongrel" do
|
|
148
143
|
Rack::Handler::Mongrel.run(map, opt) { |server|
|
149
144
|
server.should.be.kind_of Mongrel::HttpServer
|
150
145
|
server.classifier.uris.should.include '/'
|
151
|
-
server.classifier.handler_map['/'].size.should.
|
146
|
+
server.classifier.handler_map['/'].size.should.equal 2
|
152
147
|
server.classifier.uris.should.include '/foo'
|
153
|
-
server.classifier.handler_map['/foo'].size.should.
|
148
|
+
server.classifier.handler_map['/foo'].size.should.equal 1
|
154
149
|
server.classifier.uris.should.include '/bar'
|
155
|
-
server.classifier.handler_map['/bar'].size.should.
|
150
|
+
server.classifier.handler_map['/bar'].size.should.equal 2
|
156
151
|
server.classifier.uris.should.not.include '/qux'
|
157
152
|
server.classifier.uris.should.not.include '/arf'
|
158
|
-
server.classifier.uris.size.should.
|
153
|
+
server.classifier.uris.size.should.equal 3
|
159
154
|
block_ran = true
|
160
155
|
}
|
161
156
|
}
|
162
157
|
sleep 1
|
163
|
-
block_ran.should.be
|
158
|
+
block_ran.should.be.true
|
164
159
|
end
|
165
160
|
|
166
|
-
|
161
|
+
should "stream #each part of the response" do
|
167
162
|
body = ''
|
168
163
|
begin
|
169
164
|
Timeout.timeout(1) do
|
@@ -179,11 +174,10 @@ context "Rack::Handler::Mongrel" do
|
|
179
174
|
body.should.not.be.empty
|
180
175
|
end
|
181
176
|
|
182
|
-
|
183
|
-
@acc.raise Mongrel::StopServer
|
184
|
-
end
|
177
|
+
@acc.raise Mongrel::StopServer
|
185
178
|
end
|
186
179
|
|
187
|
-
rescue LoadError
|
188
|
-
|
180
|
+
rescue LoadError => ex
|
181
|
+
warn ex
|
182
|
+
warn "Skipping Rack::Handler::Mongrel tests (Mongrel is required). `gem install mongrel` and try again."
|
189
183
|
end
|