rack 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rack might be problematic. Click here for more details.
- data/AUTHORS +3 -1
- data/RDOX +19 -1
- data/README +39 -6
- data/Rakefile +1 -1
- data/SPEC +2 -2
- data/bin/rackup +4 -0
- data/example/protectedlobster.ru +8 -0
- data/lib/rack.rb +12 -6
- data/lib/rack/auth/abstract/request.rb +0 -2
- data/lib/rack/auth/basic.rb +1 -1
- data/lib/rack/auth/digest/nonce.rb +2 -3
- data/lib/rack/auth/openid.rb +111 -0
- data/lib/rack/builder.rb +8 -4
- data/lib/rack/file.rb +3 -1
- data/lib/rack/handler/fastcgi.rb +3 -1
- data/lib/rack/handler/lsws.rb +52 -0
- data/lib/rack/handler/scgi.rb +57 -0
- data/lib/rack/lint.rb +5 -5
- data/lib/rack/request.rb +9 -2
- data/lib/rack/response.rb +9 -3
- data/lib/rack/session/cookie.rb +2 -4
- data/lib/rack/session/pool.rb +82 -0
- data/lib/rack/showexceptions.rb +1 -1
- data/lib/rack/urlmap.rb +6 -8
- data/lib/rack/utils.rb +21 -0
- data/test/cgi/lighttpd.conf +1 -1
- data/test/cgi/test.ru +1 -1
- data/test/spec_rack_auth_basic.rb +4 -3
- data/test/spec_rack_auth_digest.rb +4 -2
- data/test/spec_rack_builder.rb +50 -0
- data/test/spec_rack_cgi.rb +14 -8
- data/test/spec_rack_fastcgi.rb +14 -8
- data/test/spec_rack_file.rb +8 -0
- data/test/spec_rack_lint.rb +3 -3
- data/test/spec_rack_request.rb +32 -0
- data/test/spec_rack_response.rb +10 -2
- data/test/spec_rack_session_pool.rb +37 -0
- data/test/spec_rack_urlmap.rb +18 -12
- metadata +12 -3
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'test/spec'
|
2
|
-
|
3
|
-
require 'rack'
|
2
|
+
|
3
|
+
require 'rack/auth/basic'
|
4
|
+
require 'rack/mock'
|
4
5
|
|
5
6
|
context 'Rack::Auth::Basic' do
|
6
7
|
|
@@ -23,7 +24,7 @@ context 'Rack::Auth::Basic' do
|
|
23
24
|
end
|
24
25
|
|
25
26
|
def request_with_basic_auth(username, password, &block)
|
26
|
-
request 'HTTP_AUTHORIZATION' => 'Basic ' +
|
27
|
+
request 'HTTP_AUTHORIZATION' => 'Basic ' + ["#{username}:#{password}"].pack("m*"), &block
|
27
28
|
end
|
28
29
|
|
29
30
|
def request(headers = {})
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'test/spec'
|
2
|
+
|
3
|
+
require 'rack/builder'
|
4
|
+
require 'rack/mock'
|
5
|
+
|
6
|
+
context "Rack::Builder" do
|
7
|
+
specify "chains apps by default" do
|
8
|
+
app = Rack::Builder.new do
|
9
|
+
use Rack::ShowExceptions
|
10
|
+
run lambda { |env| raise "bzzzt" }
|
11
|
+
end.to_app
|
12
|
+
|
13
|
+
Rack::MockRequest.new(app).get("/").should.be.server_error
|
14
|
+
Rack::MockRequest.new(app).get("/").should.be.server_error
|
15
|
+
Rack::MockRequest.new(app).get("/").should.be.server_error
|
16
|
+
end
|
17
|
+
|
18
|
+
specify "has implicit #to_app" do
|
19
|
+
app = Rack::Builder.new do
|
20
|
+
use Rack::ShowExceptions
|
21
|
+
run lambda { |env| raise "bzzzt" }
|
22
|
+
end
|
23
|
+
|
24
|
+
Rack::MockRequest.new(app).get("/").should.be.server_error
|
25
|
+
Rack::MockRequest.new(app).get("/").should.be.server_error
|
26
|
+
Rack::MockRequest.new(app).get("/").should.be.server_error
|
27
|
+
end
|
28
|
+
|
29
|
+
specify "supports blocks on use" do
|
30
|
+
app = Rack::Builder.new do
|
31
|
+
use Rack::ShowExceptions
|
32
|
+
use Rack::Auth::Basic do |username, password|
|
33
|
+
'secret' == password
|
34
|
+
end
|
35
|
+
|
36
|
+
run lambda { |env| [200, {}, 'Hi Boss'] }
|
37
|
+
end
|
38
|
+
|
39
|
+
response = Rack::MockRequest.new(app).get("/")
|
40
|
+
response.should.be.client_error
|
41
|
+
response.status.should.equal 401
|
42
|
+
|
43
|
+
# with auth...
|
44
|
+
response = Rack::MockRequest.new(app).get("/",
|
45
|
+
'HTTP_AUTHORIZATION' => 'Basic ' + ["joe:secret"].pack("m*"))
|
46
|
+
response.status.should.equal 200
|
47
|
+
response.body.to_s.should.equal 'Hi Boss'
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
data/test/spec_rack_cgi.rb
CHANGED
@@ -1,14 +1,6 @@
|
|
1
1
|
require 'test/spec'
|
2
2
|
require 'testrequest'
|
3
3
|
|
4
|
-
pid = fork {
|
5
|
-
exec "cd #{File.join(File.dirname(__FILE__), 'cgi')} && lighttpd -D -f lighttpd.conf"
|
6
|
-
}
|
7
|
-
|
8
|
-
at_exit {
|
9
|
-
Process.kill 15, pid
|
10
|
-
}
|
11
|
-
|
12
4
|
context "Rack::Handler::CGI" do
|
13
5
|
include TestRequest::Helpers
|
14
6
|
|
@@ -17,6 +9,14 @@ context "Rack::Handler::CGI" do
|
|
17
9
|
@port = 9203
|
18
10
|
end
|
19
11
|
|
12
|
+
# Keep this first.
|
13
|
+
specify "startup" do
|
14
|
+
$pid = fork {
|
15
|
+
Dir.chdir File.join(File.dirname(__FILE__), 'cgi')
|
16
|
+
exec "lighttpd -D -f lighttpd.conf"
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
20
|
specify "should respond" do
|
21
21
|
lambda {
|
22
22
|
GET("/test")
|
@@ -79,4 +79,10 @@ context "Rack::Handler::CGI" do
|
|
79
79
|
status.should.equal 403
|
80
80
|
response["rack.url_scheme"].should.equal "http"
|
81
81
|
end
|
82
|
+
|
83
|
+
# Keep this last.
|
84
|
+
specify "shutdown" do
|
85
|
+
Process.kill 15, $pid
|
86
|
+
Process.wait($pid).should.equal $pid
|
87
|
+
end
|
82
88
|
end
|
data/test/spec_rack_fastcgi.rb
CHANGED
@@ -1,14 +1,6 @@
|
|
1
1
|
require 'test/spec'
|
2
2
|
require 'testrequest'
|
3
3
|
|
4
|
-
pid = fork {
|
5
|
-
exec "cd #{File.join(File.dirname(__FILE__), 'cgi')} && lighttpd -D -f lighttpd.conf"
|
6
|
-
}
|
7
|
-
|
8
|
-
at_exit {
|
9
|
-
Process.kill 15, pid
|
10
|
-
}
|
11
|
-
|
12
4
|
context "Rack::Handler::FastCGI" do
|
13
5
|
include TestRequest::Helpers
|
14
6
|
|
@@ -17,6 +9,14 @@ context "Rack::Handler::FastCGI" do
|
|
17
9
|
@port = 9203
|
18
10
|
end
|
19
11
|
|
12
|
+
# Keep this first.
|
13
|
+
specify "startup" do
|
14
|
+
$pid = fork {
|
15
|
+
Dir.chdir File.join(File.dirname(__FILE__), 'cgi')
|
16
|
+
exec "lighttpd -D -f lighttpd.conf"
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
20
|
specify "should respond" do
|
21
21
|
lambda {
|
22
22
|
GET("/test.fcgi")
|
@@ -79,4 +79,10 @@ context "Rack::Handler::FastCGI" do
|
|
79
79
|
status.should.equal 403
|
80
80
|
response["rack.url_scheme"].should.equal "http"
|
81
81
|
end
|
82
|
+
|
83
|
+
# Keep this last.
|
84
|
+
specify "shutdown" do
|
85
|
+
Process.kill 15, $pid
|
86
|
+
Process.wait($pid).should.equal $pid
|
87
|
+
end
|
82
88
|
end
|
data/test/spec_rack_file.rb
CHANGED
@@ -15,6 +15,14 @@ context "Rack::File" do
|
|
15
15
|
res.should.be.ok
|
16
16
|
res.should =~ /ruby/
|
17
17
|
end
|
18
|
+
|
19
|
+
specify "serves files with URL encoded filenames" do
|
20
|
+
res = Rack::MockRequest.new(Rack::Lint.new(Rack::File.new(DOCROOT))).
|
21
|
+
get("/cgi/%74%65%73%74") # "/cgi/test"
|
22
|
+
|
23
|
+
res.should.be.ok
|
24
|
+
res.should =~ /ruby/
|
25
|
+
end
|
18
26
|
|
19
27
|
specify "does not allow directory traversal" do
|
20
28
|
res = Rack::MockRequest.new(Rack::Lint.new(Rack::File.new(DOCROOT))).
|
data/test/spec_rack_lint.rb
CHANGED
@@ -206,14 +206,14 @@ context "Rack::Lint" do
|
|
206
206
|
|
207
207
|
lambda {
|
208
208
|
Rack::Lint.new(lambda { |env|
|
209
|
-
[
|
209
|
+
[204, {"Content-Type" => "text/plain"}, ""]
|
210
210
|
}).call(env({}))
|
211
211
|
}.should.raise(Rack::Lint::LintError).
|
212
212
|
message.should.match(/Content-Type header found/)
|
213
213
|
|
214
214
|
lambda {
|
215
215
|
Rack::Lint.new(lambda { |env|
|
216
|
-
[
|
216
|
+
[204, {"Content-type" => "text/plain"}, ""]
|
217
217
|
}).call(env({}))
|
218
218
|
}.should.raise(Rack::Lint::LintError).
|
219
219
|
message.should.match(/Content-Type header found/)
|
@@ -244,7 +244,7 @@ context "Rack::Lint" do
|
|
244
244
|
[201, {"Content-type" => "text/plain"}, ""]
|
245
245
|
}).call(env({}))
|
246
246
|
}.should.raise(Rack::Lint::LintError).
|
247
|
-
message.should.match(/read called with
|
247
|
+
message.should.match(/read called with non-integer argument/)
|
248
248
|
|
249
249
|
weirdio = Object.new
|
250
250
|
class << weirdio
|
data/test/spec_rack_request.rb
CHANGED
@@ -129,6 +129,12 @@ context "Rack::Request" do
|
|
129
129
|
req.cookies.should.equal({})
|
130
130
|
end
|
131
131
|
|
132
|
+
specify "parses cookies according to RFC 2109" do
|
133
|
+
req = Rack::Request.new \
|
134
|
+
Rack::MockRequest.env_for('', 'HTTP_COOKIE' => 'foo=bar;foo=car')
|
135
|
+
req.cookies.should.equal 'foo' => 'bar'
|
136
|
+
end
|
137
|
+
|
132
138
|
specify "provides setters" do
|
133
139
|
req = Rack::Request.new(e=Rack::MockRequest.env_for(""))
|
134
140
|
req.script_name.should.equal ""
|
@@ -276,4 +282,30 @@ EOF
|
|
276
282
|
|
277
283
|
lambda { req.POST }.should.raise(EOFError)
|
278
284
|
end
|
285
|
+
|
286
|
+
specify "does conform to the Rack spec" do
|
287
|
+
app = lambda { |env|
|
288
|
+
content = Rack::Request.new(env).POST["file"].inspect
|
289
|
+
[200, {"Content-Type" => "text/html"}, content]
|
290
|
+
}
|
291
|
+
|
292
|
+
input = <<EOF
|
293
|
+
--AaB03x\r
|
294
|
+
content-disposition: form-data; name="reply"\r
|
295
|
+
\r
|
296
|
+
yes\r
|
297
|
+
--AaB03x\r
|
298
|
+
content-disposition: form-data; name="fileupload"; filename="dj.jpg"\r
|
299
|
+
Content-Type: image/jpeg\r
|
300
|
+
Content-Transfer-Encoding: base64\r
|
301
|
+
\r
|
302
|
+
/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg\r
|
303
|
+
--AaB03x--\r
|
304
|
+
EOF
|
305
|
+
res = Rack::MockRequest.new(Rack::Lint.new(app)).get "/",
|
306
|
+
"CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
|
307
|
+
"CONTENT_LENGTH" => input.size.to_s, "rack.input" => StringIO.new(input)
|
308
|
+
|
309
|
+
res.should.be.ok
|
310
|
+
end
|
279
311
|
end
|
data/test/spec_rack_response.rb
CHANGED
@@ -54,13 +54,21 @@ context "Rack::Response" do
|
|
54
54
|
response["Set-Cookie"].should.equal ["foo=bar", "foo2=bar2", "foo3=bar3"]
|
55
55
|
end
|
56
56
|
|
57
|
+
specify "formats the Cookie expiration date accordingly to RFC 2109" do
|
58
|
+
response = Rack::Response.new
|
59
|
+
|
60
|
+
response.set_cookie "foo", {:value => "bar", :expires => Time.now+10}
|
61
|
+
response["Set-Cookie"].should.match(
|
62
|
+
/expires=..., \d\d-...-\d\d\d\d \d\d:\d\d:\d\d .../)
|
63
|
+
end
|
64
|
+
|
57
65
|
specify "can delete cookies" do
|
58
66
|
response = Rack::Response.new
|
59
67
|
response.set_cookie "foo", "bar"
|
60
68
|
response.set_cookie "foo2", "bar2"
|
61
69
|
response.delete_cookie "foo"
|
62
70
|
response["Set-Cookie"].should.equal ["foo2=bar2",
|
63
|
-
"foo=; expires=Thu, 01
|
71
|
+
"foo=; expires=Thu, 01-Jan-1970 00:00:00 GMT"]
|
64
72
|
end
|
65
73
|
|
66
74
|
specify "has a useful constructor" do
|
@@ -96,7 +104,7 @@ context "Rack::Response" do
|
|
96
104
|
end
|
97
105
|
|
98
106
|
specify "doesn't return invalid responses" do
|
99
|
-
r = Rack::Response.new(["foo", "bar"],
|
107
|
+
r = Rack::Response.new(["foo", "bar"], 204)
|
100
108
|
status, header, body = r.finish
|
101
109
|
str = ""; body.each { |part| str << part }
|
102
110
|
str.should.be.empty
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'test/spec'
|
2
|
+
|
3
|
+
require 'rack/session/pool'
|
4
|
+
require 'rack/mock'
|
5
|
+
require 'rack/response'
|
6
|
+
|
7
|
+
context "Rack::Session::Pool" do
|
8
|
+
incrementor = lambda { |env|
|
9
|
+
env["rack.session"]["counter"] ||= 0
|
10
|
+
env["rack.session"]["counter"] += 1
|
11
|
+
Rack::Response.new(env["rack.session"].inspect).to_a
|
12
|
+
}
|
13
|
+
|
14
|
+
specify "creates a new cookie" do
|
15
|
+
pool = Rack::Session::Pool.new(incrementor)
|
16
|
+
res = Rack::MockRequest.new(pool).get("/")
|
17
|
+
res["Set-Cookie"].should.match("rack.session=")
|
18
|
+
res.body.should.equal '{"counter"=>1}'
|
19
|
+
end
|
20
|
+
|
21
|
+
specify "loads from a cookie" do
|
22
|
+
pool = Rack::Session::Pool.new(incrementor)
|
23
|
+
res = Rack::MockRequest.new(pool).get("/")
|
24
|
+
cookie = res["Set-Cookie"]
|
25
|
+
res = Rack::MockRequest.new(pool).get("/", "HTTP_COOKIE" => cookie)
|
26
|
+
res.body.should.equal '{"counter"=>2}'
|
27
|
+
res = Rack::MockRequest.new(pool).get("/", "HTTP_COOKIE" => cookie)
|
28
|
+
res.body.should.equal '{"counter"=>3}'
|
29
|
+
end
|
30
|
+
|
31
|
+
specify "survives broken cookies" do
|
32
|
+
pool = Rack::Session::Pool.new(incrementor)
|
33
|
+
res = Rack::MockRequest.new(pool).
|
34
|
+
get("/", "HTTP_COOKIE" => "rack.session=blarghfasel")
|
35
|
+
res.body.should.equal '{"counter"=>1}'
|
36
|
+
end
|
37
|
+
end
|
data/test/spec_rack_urlmap.rb
CHANGED
@@ -11,17 +11,17 @@ context "Rack::URLMap" do
|
|
11
11
|
"X-Position" => "/foo",
|
12
12
|
"X-PathInfo" => env["PATH_INFO"],
|
13
13
|
}, [""]]},
|
14
|
-
|
14
|
+
|
15
15
|
"/bar" => lambda { |env|
|
16
16
|
[200,
|
17
17
|
{ "Content-Type" => "text/plain",
|
18
18
|
"X-Position" => "/bar",
|
19
19
|
"X-PathInfo" => env["PATH_INFO"],
|
20
20
|
}, [""]]}
|
21
|
-
|
21
|
+
|
22
22
|
)
|
23
23
|
|
24
|
-
|
24
|
+
|
25
25
|
Rack::MockRequest.new(map).get("/").should.be.not_found
|
26
26
|
|
27
27
|
res = Rack::MockRequest.new(map).get("/foo")
|
@@ -96,18 +96,24 @@ context "Rack::URLMap" do
|
|
96
96
|
|
97
97
|
specify "should be nestable" do
|
98
98
|
map = Rack::URLMap.new("/foo" =>
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
99
|
+
Rack::URLMap.new("/bar" =>
|
100
|
+
Rack::URLMap.new("/quux" => lambda { |env|
|
101
|
+
[200,
|
102
|
+
{ "Content-Type" => "text/plain",
|
103
|
+
"X-Position" => "/foo/bar/quux",
|
104
|
+
"X-PathInfo" => env["PATH_INFO"],
|
105
|
+
"X-ScriptName" => env["SCRIPT_NAME"],
|
106
|
+
}, [""]]}
|
107
|
+
)))
|
107
108
|
|
108
109
|
res = Rack::MockRequest.new(map).get("/foo/bar")
|
110
|
+
res.should.be.not_found
|
111
|
+
|
112
|
+
res = Rack::MockRequest.new(map).get("/foo/bar/quux")
|
109
113
|
res.should.be.ok
|
110
|
-
res["X-Position"].should.equal "/foo/bar"
|
114
|
+
res["X-Position"].should.equal "/foo/bar/quux"
|
115
|
+
res["X-PathInfo"].should.equal "/"
|
116
|
+
res["X-ScriptName"].should.equal "/foo/bar/quux"
|
111
117
|
end
|
112
118
|
|
113
119
|
specify "should route root apps correctly" do
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.4
|
3
3
|
specification_version: 1
|
4
4
|
name: rack
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date:
|
6
|
+
version: 0.3.0
|
7
|
+
date: 2008-02-26 00:00:00 +01:00
|
8
8
|
summary: a modular Ruby webserver interface
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -35,6 +35,7 @@ files:
|
|
35
35
|
- COPYING
|
36
36
|
- example/lobster.ru
|
37
37
|
- example/protectedlobster.rb
|
38
|
+
- example/protectedlobster.ru
|
38
39
|
- KNOWN-ISSUES
|
39
40
|
- lib/rack/adapter/camping.rb
|
40
41
|
- lib/rack/auth/abstract/handler.rb
|
@@ -44,13 +45,16 @@ files:
|
|
44
45
|
- lib/rack/auth/digest/nonce.rb
|
45
46
|
- lib/rack/auth/digest/params.rb
|
46
47
|
- lib/rack/auth/digest/request.rb
|
48
|
+
- lib/rack/auth/openid.rb
|
47
49
|
- lib/rack/builder.rb
|
48
50
|
- lib/rack/cascade.rb
|
49
51
|
- lib/rack/commonlogger.rb
|
50
52
|
- lib/rack/file.rb
|
51
53
|
- lib/rack/handler/cgi.rb
|
52
54
|
- lib/rack/handler/fastcgi.rb
|
55
|
+
- lib/rack/handler/lsws.rb
|
53
56
|
- lib/rack/handler/mongrel.rb
|
57
|
+
- lib/rack/handler/scgi.rb
|
54
58
|
- lib/rack/handler/webrick.rb
|
55
59
|
- lib/rack/lint.rb
|
56
60
|
- lib/rack/lobster.rb
|
@@ -60,6 +64,7 @@ files:
|
|
60
64
|
- lib/rack/request.rb
|
61
65
|
- lib/rack/response.rb
|
62
66
|
- lib/rack/session/cookie.rb
|
67
|
+
- lib/rack/session/pool.rb
|
63
68
|
- lib/rack/showexceptions.rb
|
64
69
|
- lib/rack/showstatus.rb
|
65
70
|
- lib/rack/static.rb
|
@@ -74,6 +79,7 @@ files:
|
|
74
79
|
- test/cgi/test.ru
|
75
80
|
- test/spec_rack_auth_basic.rb
|
76
81
|
- test/spec_rack_auth_digest.rb
|
82
|
+
- test/spec_rack_builder.rb
|
77
83
|
- test/spec_rack_camping.rb
|
78
84
|
- test/spec_rack_cascade.rb
|
79
85
|
- test/spec_rack_cgi.rb
|
@@ -88,6 +94,7 @@ files:
|
|
88
94
|
- test/spec_rack_request.rb
|
89
95
|
- test/spec_rack_response.rb
|
90
96
|
- test/spec_rack_session_cookie.rb
|
97
|
+
- test/spec_rack_session_pool.rb
|
91
98
|
- test/spec_rack_showexceptions.rb
|
92
99
|
- test/spec_rack_showstatus.rb
|
93
100
|
- test/spec_rack_static.rb
|
@@ -100,6 +107,7 @@ files:
|
|
100
107
|
test_files:
|
101
108
|
- test/spec_rack_auth_basic.rb
|
102
109
|
- test/spec_rack_auth_digest.rb
|
110
|
+
- test/spec_rack_builder.rb
|
103
111
|
- test/spec_rack_camping.rb
|
104
112
|
- test/spec_rack_cascade.rb
|
105
113
|
- test/spec_rack_cgi.rb
|
@@ -114,6 +122,7 @@ test_files:
|
|
114
122
|
- test/spec_rack_request.rb
|
115
123
|
- test/spec_rack_response.rb
|
116
124
|
- test/spec_rack_session_cookie.rb
|
125
|
+
- test/spec_rack_session_pool.rb
|
117
126
|
- test/spec_rack_showexceptions.rb
|
118
127
|
- test/spec_rack_showstatus.rb
|
119
128
|
- test/spec_rack_static.rb
|