rack 1.4.0 → 1.4.5
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/COPYING +1 -1
- data/KNOWN-ISSUES +9 -0
- data/README.rdoc +118 -4
- data/Rakefile +18 -11
- data/SPEC +3 -1
- data/contrib/rack.png +0 -0
- data/contrib/rack.svg +150 -0
- data/contrib/rdoc.css +412 -0
- data/lib/rack/auth/abstract/request.rb +5 -1
- data/lib/rack/auth/basic.rb +1 -1
- data/lib/rack/auth/digest/nonce.rb +1 -1
- data/lib/rack/backports/uri/common_18.rb +14 -28
- data/lib/rack/backports/uri/common_192.rb +14 -17
- data/lib/rack/backports/uri/common_193.rb +29 -0
- data/lib/rack/body_proxy.rb +15 -2
- data/lib/rack/builder.rb +1 -1
- data/lib/rack/cascade.rb +12 -1
- data/lib/rack/commonlogger.rb +18 -5
- data/lib/rack/deflater.rb +5 -1
- data/lib/rack/directory.rb +1 -1
- data/lib/rack/etag.rb +6 -3
- data/lib/rack/file.rb +20 -16
- data/lib/rack/head.rb +1 -0
- data/lib/rack/lint.rb +3 -1
- data/lib/rack/lock.rb +3 -4
- data/lib/rack/mime.rb +1 -1
- data/lib/rack/mock.rb +3 -2
- data/lib/rack/multipart/parser.rb +22 -20
- data/lib/rack/multipart.rb +2 -2
- data/lib/rack/reloader.rb +1 -1
- data/lib/rack/request.rb +4 -6
- data/lib/rack/response.rb +19 -17
- data/lib/rack/server.rb +28 -2
- data/lib/rack/session/abstract/id.rb +8 -3
- data/lib/rack/session/cookie.rb +20 -7
- data/lib/rack/showstatus.rb +2 -2
- data/lib/rack/static.rb +91 -9
- data/lib/rack/utils.rb +74 -36
- data/lib/rack.rb +13 -1
- data/rack.gemspec +3 -3
- data/test/builder/line.ru +1 -0
- data/test/cgi/assets/folder/test.js +1 -0
- data/test/cgi/assets/fonts/font.eot +1 -0
- data/test/cgi/assets/images/image.png +1 -0
- data/test/cgi/assets/index.html +1 -0
- data/test/cgi/assets/javascripts/app.js +1 -0
- data/test/cgi/assets/stylesheets/app.css +1 -0
- data/test/multipart/filename_with_unescaped_percentages +6 -0
- data/test/multipart/filename_with_unescaped_percentages2 +6 -0
- data/test/multipart/filename_with_unescaped_percentages3 +6 -0
- data/test/spec_auth.rb +57 -0
- data/test/spec_auth_basic.rb +8 -0
- data/test/spec_auth_digest.rb +14 -0
- data/test/spec_body_proxy.rb +21 -0
- data/test/spec_builder.rb +7 -1
- data/test/spec_cascade.rb +14 -3
- data/test/spec_chunked.rb +6 -6
- data/test/spec_config.rb +0 -1
- data/test/spec_content_length.rb +26 -13
- data/test/spec_content_type.rb +15 -5
- data/test/spec_deflater.rb +35 -17
- data/test/spec_directory.rb +20 -1
- data/test/spec_etag.rb +29 -13
- data/test/spec_file.rb +58 -30
- data/test/spec_head.rb +25 -7
- data/test/spec_lobster.rb +20 -5
- data/test/spec_lock.rb +46 -21
- data/test/spec_logger.rb +2 -7
- data/test/spec_methodoverride.rb +21 -22
- data/test/spec_mock.rb +12 -7
- data/test/spec_multipart.rb +129 -2
- data/test/spec_nulllogger.rb +13 -2
- data/test/spec_recursive.rb +12 -9
- data/test/spec_request.rb +15 -2
- data/test/spec_response.rb +41 -3
- data/test/spec_runtime.rb +15 -5
- data/test/spec_sendfile.rb +13 -9
- data/test/spec_server.rb +47 -0
- data/test/spec_session_cookie.rb +93 -3
- data/test/spec_session_memcache.rb +10 -8
- data/test/spec_session_pool.rb +13 -10
- data/test/spec_showexceptions.rb +9 -4
- data/test/spec_showstatus.rb +10 -5
- data/test/spec_static.rb +89 -8
- data/test/spec_urlmap.rb +10 -10
- data/test/spec_utils.rb +34 -7
- data/test/static/another/index.html +1 -0
- metadata +26 -8
data/test/spec_static.rb
CHANGED
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
require 'rack/static'
|
|
2
|
+
require 'rack/lint'
|
|
2
3
|
require 'rack/mock'
|
|
3
4
|
|
|
4
5
|
class DummyApp
|
|
5
6
|
def call(env)
|
|
6
|
-
[200, {}, ["Hello World"]]
|
|
7
|
+
[200, {"Content-Type" => "text/plain"}, ["Hello World"]]
|
|
7
8
|
end
|
|
8
9
|
end
|
|
9
10
|
|
|
10
11
|
describe Rack::Static do
|
|
12
|
+
def static(app, *args)
|
|
13
|
+
Rack::Lint.new Rack::Static.new(app, *args)
|
|
14
|
+
end
|
|
15
|
+
|
|
11
16
|
root = File.expand_path(File.dirname(__FILE__))
|
|
12
17
|
|
|
13
18
|
OPTIONS = {:urls => ["/cgi"], :root => root}
|
|
14
|
-
STATIC_OPTIONS = {:urls => [""], :root => root, :index => '
|
|
19
|
+
STATIC_OPTIONS = {:urls => [""], :root => "#{root}/static", :index => 'index.html'}
|
|
15
20
|
HASH_OPTIONS = {:urls => {"/cgi/sekret" => 'cgi/test'}, :root => root}
|
|
16
21
|
|
|
17
|
-
@request = Rack::MockRequest.new(
|
|
18
|
-
@static_request = Rack::MockRequest.new(
|
|
19
|
-
@hash_request = Rack::MockRequest.new(
|
|
22
|
+
@request = Rack::MockRequest.new(static(DummyApp.new, OPTIONS))
|
|
23
|
+
@static_request = Rack::MockRequest.new(static(DummyApp.new, STATIC_OPTIONS))
|
|
24
|
+
@hash_request = Rack::MockRequest.new(static(DummyApp.new, HASH_OPTIONS))
|
|
20
25
|
|
|
21
26
|
it "serves files" do
|
|
22
27
|
res = @request.get("/cgi/test")
|
|
@@ -35,10 +40,22 @@ describe Rack::Static do
|
|
|
35
40
|
res.body.should == "Hello World"
|
|
36
41
|
end
|
|
37
42
|
|
|
38
|
-
it "calls index file when requesting root" do
|
|
43
|
+
it "calls index file when requesting root in the given folder" do
|
|
39
44
|
res = @static_request.get("/")
|
|
40
45
|
res.should.be.ok
|
|
41
46
|
res.body.should =~ /index!/
|
|
47
|
+
|
|
48
|
+
res = @static_request.get("/other/")
|
|
49
|
+
res.should.be.not_found
|
|
50
|
+
|
|
51
|
+
res = @static_request.get("/another/")
|
|
52
|
+
res.should.be.ok
|
|
53
|
+
res.body.should =~ /another index!/
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "doesn't call index file if :index option was omitted" do
|
|
57
|
+
res = @request.get("/")
|
|
58
|
+
res.body.should == "Hello World"
|
|
42
59
|
end
|
|
43
60
|
|
|
44
61
|
it "serves hidden files" do
|
|
@@ -53,12 +70,76 @@ describe Rack::Static do
|
|
|
53
70
|
res.body.should == "Hello World"
|
|
54
71
|
end
|
|
55
72
|
|
|
56
|
-
it "supports serving fixed cache-control" do
|
|
73
|
+
it "supports serving fixed cache-control (legacy option)" do
|
|
57
74
|
opts = OPTIONS.merge(:cache_control => 'public')
|
|
58
|
-
request = Rack::MockRequest.new(
|
|
75
|
+
request = Rack::MockRequest.new(static(DummyApp.new, opts))
|
|
59
76
|
res = request.get("/cgi/test")
|
|
60
77
|
res.should.be.ok
|
|
61
78
|
res.headers['Cache-Control'].should == 'public'
|
|
62
79
|
end
|
|
63
80
|
|
|
81
|
+
HEADER_OPTIONS = {:urls => ["/cgi"], :root => root, :header_rules => [
|
|
82
|
+
[:all, {'Cache-Control' => 'public, max-age=100'}],
|
|
83
|
+
[:fonts, {'Cache-Control' => 'public, max-age=200'}],
|
|
84
|
+
[%w(png jpg), {'Cache-Control' => 'public, max-age=300'}],
|
|
85
|
+
['/cgi/assets/folder/', {'Cache-Control' => 'public, max-age=400'}],
|
|
86
|
+
['cgi/assets/javascripts', {'Cache-Control' => 'public, max-age=500'}],
|
|
87
|
+
[/\.(css|erb)\z/, {'Cache-Control' => 'public, max-age=600'}]
|
|
88
|
+
]}
|
|
89
|
+
@header_request = Rack::MockRequest.new(static(DummyApp.new, HEADER_OPTIONS))
|
|
90
|
+
|
|
91
|
+
it "supports header rule :all" do
|
|
92
|
+
# Headers for all files via :all shortcut
|
|
93
|
+
res = @header_request.get('/cgi/assets/index.html')
|
|
94
|
+
res.should.be.ok
|
|
95
|
+
res.headers['Cache-Control'].should == 'public, max-age=100'
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it "supports header rule :fonts" do
|
|
99
|
+
# Headers for web fonts via :fonts shortcut
|
|
100
|
+
res = @header_request.get('/cgi/assets/fonts/font.eot')
|
|
101
|
+
res.should.be.ok
|
|
102
|
+
res.headers['Cache-Control'].should == 'public, max-age=200'
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it "supports file extension header rules provided as an Array" do
|
|
106
|
+
# Headers for file extensions via array
|
|
107
|
+
res = @header_request.get('/cgi/assets/images/image.png')
|
|
108
|
+
res.should.be.ok
|
|
109
|
+
res.headers['Cache-Control'].should == 'public, max-age=300'
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "supports folder rules provided as a String" do
|
|
113
|
+
# Headers for files in folder via string
|
|
114
|
+
res = @header_request.get('/cgi/assets/folder/test.js')
|
|
115
|
+
res.should.be.ok
|
|
116
|
+
res.headers['Cache-Control'].should == 'public, max-age=400'
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it "supports folder header rules provided as a String not starting with a slash" do
|
|
120
|
+
res = @header_request.get('/cgi/assets/javascripts/app.js')
|
|
121
|
+
res.should.be.ok
|
|
122
|
+
res.headers['Cache-Control'].should == 'public, max-age=500'
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "supports flexible header rules provided as Regexp" do
|
|
126
|
+
# Flexible Headers via Regexp
|
|
127
|
+
res = @header_request.get('/cgi/assets/stylesheets/app.css')
|
|
128
|
+
res.should.be.ok
|
|
129
|
+
res.headers['Cache-Control'].should == 'public, max-age=600'
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
it "prioritizes header rules over fixed cache-control setting (legacy option)" do
|
|
133
|
+
opts = OPTIONS.merge(
|
|
134
|
+
:cache_control => 'public, max-age=24',
|
|
135
|
+
:header_rules => [
|
|
136
|
+
[:all, {'Cache-Control' => 'public, max-age=42'}]
|
|
137
|
+
])
|
|
138
|
+
|
|
139
|
+
request = Rack::MockRequest.new(static(DummyApp.new, opts))
|
|
140
|
+
res = request.get("/cgi/test")
|
|
141
|
+
res.should.be.ok
|
|
142
|
+
res.headers['Cache-Control'].should == 'public, max-age=42'
|
|
143
|
+
end
|
|
144
|
+
|
|
64
145
|
end
|
data/test/spec_urlmap.rb
CHANGED
|
@@ -10,11 +10,11 @@ describe Rack::URLMap do
|
|
|
10
10
|
'Content-Type' => 'text/plain'
|
|
11
11
|
}, [""]]
|
|
12
12
|
}
|
|
13
|
-
map = Rack::URLMap.new({
|
|
13
|
+
map = Rack::Lint.new(Rack::URLMap.new({
|
|
14
14
|
'http://foo.org/bar' => app,
|
|
15
15
|
'/foo' => app,
|
|
16
16
|
'/foo/bar' => app
|
|
17
|
-
})
|
|
17
|
+
}))
|
|
18
18
|
|
|
19
19
|
res = Rack::MockRequest.new(map).get("/")
|
|
20
20
|
res.should.be.not_found
|
|
@@ -66,7 +66,7 @@ describe Rack::URLMap do
|
|
|
66
66
|
|
|
67
67
|
|
|
68
68
|
it "dispatches hosts correctly" do
|
|
69
|
-
map = Rack::URLMap.new("http://foo.org/" => lambda { |env|
|
|
69
|
+
map = Rack::Lint.new(Rack::URLMap.new("http://foo.org/" => lambda { |env|
|
|
70
70
|
[200,
|
|
71
71
|
{ "Content-Type" => "text/plain",
|
|
72
72
|
"X-Position" => "foo.org",
|
|
@@ -90,7 +90,7 @@ describe Rack::URLMap do
|
|
|
90
90
|
"X-Position" => "default.org",
|
|
91
91
|
"X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
|
|
92
92
|
}, [""]]}
|
|
93
|
-
)
|
|
93
|
+
))
|
|
94
94
|
|
|
95
95
|
res = Rack::MockRequest.new(map).get("/")
|
|
96
96
|
res.should.be.ok
|
|
@@ -124,7 +124,7 @@ describe Rack::URLMap do
|
|
|
124
124
|
end
|
|
125
125
|
|
|
126
126
|
should "be nestable" do
|
|
127
|
-
map = Rack::URLMap.new("/foo" =>
|
|
127
|
+
map = Rack::Lint.new(Rack::URLMap.new("/foo" =>
|
|
128
128
|
Rack::URLMap.new("/bar" =>
|
|
129
129
|
Rack::URLMap.new("/quux" => lambda { |env|
|
|
130
130
|
[200,
|
|
@@ -133,7 +133,7 @@ describe Rack::URLMap do
|
|
|
133
133
|
"X-PathInfo" => env["PATH_INFO"],
|
|
134
134
|
"X-ScriptName" => env["SCRIPT_NAME"],
|
|
135
135
|
}, [""]]}
|
|
136
|
-
)))
|
|
136
|
+
))))
|
|
137
137
|
|
|
138
138
|
res = Rack::MockRequest.new(map).get("/foo/bar")
|
|
139
139
|
res.should.be.not_found
|
|
@@ -146,7 +146,7 @@ describe Rack::URLMap do
|
|
|
146
146
|
end
|
|
147
147
|
|
|
148
148
|
should "route root apps correctly" do
|
|
149
|
-
map = Rack::URLMap.new("/" => lambda { |env|
|
|
149
|
+
map = Rack::Lint.new(Rack::URLMap.new("/" => lambda { |env|
|
|
150
150
|
[200,
|
|
151
151
|
{ "Content-Type" => "text/plain",
|
|
152
152
|
"X-Position" => "root",
|
|
@@ -160,7 +160,7 @@ describe Rack::URLMap do
|
|
|
160
160
|
"X-PathInfo" => env["PATH_INFO"],
|
|
161
161
|
"X-ScriptName" => env["SCRIPT_NAME"]
|
|
162
162
|
}, [""]]}
|
|
163
|
-
)
|
|
163
|
+
))
|
|
164
164
|
|
|
165
165
|
res = Rack::MockRequest.new(map).get("/foo/bar")
|
|
166
166
|
res.should.be.ok
|
|
@@ -188,7 +188,7 @@ describe Rack::URLMap do
|
|
|
188
188
|
end
|
|
189
189
|
|
|
190
190
|
should "not squeeze slashes" do
|
|
191
|
-
map = Rack::URLMap.new("/" => lambda { |env|
|
|
191
|
+
map = Rack::Lint.new(Rack::URLMap.new("/" => lambda { |env|
|
|
192
192
|
[200,
|
|
193
193
|
{ "Content-Type" => "text/plain",
|
|
194
194
|
"X-Position" => "root",
|
|
@@ -202,7 +202,7 @@ describe Rack::URLMap do
|
|
|
202
202
|
"X-PathInfo" => env["PATH_INFO"],
|
|
203
203
|
"X-ScriptName" => env["SCRIPT_NAME"]
|
|
204
204
|
}, [""]]}
|
|
205
|
-
)
|
|
205
|
+
))
|
|
206
206
|
|
|
207
207
|
res = Rack::MockRequest.new(map).get("/http://example.org/bar")
|
|
208
208
|
res.should.be.ok
|
data/test/spec_utils.rb
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
2
|
require 'rack/utils'
|
|
3
3
|
require 'rack/mock'
|
|
4
|
+
require 'timeout'
|
|
4
5
|
|
|
5
6
|
describe Rack::Utils do
|
|
7
|
+
|
|
8
|
+
# A helper method which checks
|
|
9
|
+
# if certain query parameters
|
|
10
|
+
# are equal.
|
|
11
|
+
def equal_query_to(query)
|
|
12
|
+
parts = query.split('&')
|
|
13
|
+
lambda{|other| (parts & other.split('&')) == parts }
|
|
14
|
+
end
|
|
15
|
+
|
|
6
16
|
def kcodeu
|
|
7
17
|
one8 = RUBY_VERSION.to_f < 1.9
|
|
8
18
|
default_kcode, $KCODE = $KCODE, 'U' if one8
|
|
@@ -103,6 +113,14 @@ describe Rack::Utils do
|
|
|
103
113
|
Rack::Utils.parse_query("my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F").
|
|
104
114
|
should.equal "my weird field" => "q1!2\"'w$5&7/z8)?"
|
|
105
115
|
Rack::Utils.parse_query("foo%3Dbaz=bar").should.equal "foo=baz" => "bar"
|
|
116
|
+
Rack::Utils.parse_query("=").should.equal "" => ""
|
|
117
|
+
Rack::Utils.parse_query("=value").should.equal "" => "value"
|
|
118
|
+
Rack::Utils.parse_query("key=").should.equal "key" => ""
|
|
119
|
+
Rack::Utils.parse_query("&key&").should.equal "key" => nil
|
|
120
|
+
Rack::Utils.parse_query(";key;", ";,").should.equal "key" => nil
|
|
121
|
+
Rack::Utils.parse_query(",key,", ";,").should.equal "key" => nil
|
|
122
|
+
Rack::Utils.parse_query(";foo=bar,;", ";,").should.equal "foo" => "bar"
|
|
123
|
+
Rack::Utils.parse_query(",foo=bar;,", ";,").should.equal "foo" => "bar"
|
|
106
124
|
end
|
|
107
125
|
|
|
108
126
|
should "parse nested query strings correctly" do
|
|
@@ -179,7 +197,7 @@ describe Rack::Utils do
|
|
|
179
197
|
|
|
180
198
|
lambda { Rack::Utils.parse_nested_query("x[y]=1&x[]=1") }.
|
|
181
199
|
should.raise(TypeError).
|
|
182
|
-
message.should.
|
|
200
|
+
message.should.match(/expected Array \(got [^)]*\) for param `x'/)
|
|
183
201
|
|
|
184
202
|
lambda { Rack::Utils.parse_nested_query("x[y]=1&x[y][][w]=2") }.
|
|
185
203
|
should.raise(TypeError).
|
|
@@ -187,13 +205,13 @@ describe Rack::Utils do
|
|
|
187
205
|
end
|
|
188
206
|
|
|
189
207
|
should "build query strings correctly" do
|
|
190
|
-
Rack::Utils.build_query("foo" => "bar").should.
|
|
208
|
+
Rack::Utils.build_query("foo" => "bar").should.be equal_query_to("foo=bar")
|
|
191
209
|
Rack::Utils.build_query("foo" => ["bar", "quux"]).
|
|
192
|
-
should.
|
|
210
|
+
should.be equal_query_to("foo=bar&foo=quux")
|
|
193
211
|
Rack::Utils.build_query("foo" => "1", "bar" => "2").
|
|
194
|
-
should.
|
|
212
|
+
should.be equal_query_to("foo=1&bar=2")
|
|
195
213
|
Rack::Utils.build_query("my weird field" => "q1!2\"'w$5&7/z8)?").
|
|
196
|
-
should.
|
|
214
|
+
should.be equal_query_to("my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F")
|
|
197
215
|
end
|
|
198
216
|
|
|
199
217
|
should "build nested query strings correctly" do
|
|
@@ -202,9 +220,9 @@ describe Rack::Utils do
|
|
|
202
220
|
Rack::Utils.build_nested_query("foo" => "bar").should.equal "foo=bar"
|
|
203
221
|
|
|
204
222
|
Rack::Utils.build_nested_query("foo" => "1", "bar" => "2").
|
|
205
|
-
should.
|
|
223
|
+
should.be equal_query_to("foo=1&bar=2")
|
|
206
224
|
Rack::Utils.build_nested_query("my weird field" => "q1!2\"'w$5&7/z8)?").
|
|
207
|
-
should.
|
|
225
|
+
should.be equal_query_to("my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F")
|
|
208
226
|
|
|
209
227
|
Rack::Utils.build_nested_query("foo" => [nil]).
|
|
210
228
|
should.equal "foo[]"
|
|
@@ -313,6 +331,11 @@ describe Rack::Utils do
|
|
|
313
331
|
Rack::Utils.bytesize("FOO\xE2\x82\xAC").should.equal 6
|
|
314
332
|
end
|
|
315
333
|
|
|
334
|
+
should "should perform constant time string comparison" do
|
|
335
|
+
Rack::Utils.secure_compare('a', 'a').should.equal true
|
|
336
|
+
Rack::Utils.secure_compare('a', 'b').should.equal false
|
|
337
|
+
end
|
|
338
|
+
|
|
316
339
|
should "return status code for integer" do
|
|
317
340
|
Rack::Utils.status_code(200).should.equal 200
|
|
318
341
|
end
|
|
@@ -347,6 +370,10 @@ describe Rack::Utils, "byte_range" do
|
|
|
347
370
|
Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=499-499"},500).should.equal [(499..499)]
|
|
348
371
|
end
|
|
349
372
|
|
|
373
|
+
should "parse several byte ranges" do
|
|
374
|
+
Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=500-600,601-999"},1000).should.equal [(500..600),(601..999)]
|
|
375
|
+
end
|
|
376
|
+
|
|
350
377
|
should "truncate byte ranges" do
|
|
351
378
|
Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=123-999"},500).should.equal [(123..499)]
|
|
352
379
|
Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=600-999"},500).should.equal []
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
another index!
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rack
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
4
|
+
hash: 13
|
|
5
5
|
prerelease:
|
|
6
6
|
segments:
|
|
7
7
|
- 1
|
|
8
8
|
- 4
|
|
9
|
-
-
|
|
10
|
-
version: 1.4.
|
|
9
|
+
- 5
|
|
10
|
+
version: 1.4.5
|
|
11
11
|
platform: ruby
|
|
12
12
|
authors:
|
|
13
13
|
- Christian Neukirchen
|
|
@@ -15,7 +15,7 @@ autorequire:
|
|
|
15
15
|
bindir: bin
|
|
16
16
|
cert_chain: []
|
|
17
17
|
|
|
18
|
-
date:
|
|
18
|
+
date: 2013-02-08 00:00:00 Z
|
|
19
19
|
dependencies:
|
|
20
20
|
- !ruby/object:Gem::Dependency
|
|
21
21
|
name: bacon
|
|
@@ -81,7 +81,7 @@ dependencies:
|
|
|
81
81
|
requirements:
|
|
82
82
|
- - ">="
|
|
83
83
|
- !ruby/object:Gem::Version
|
|
84
|
-
hash:
|
|
84
|
+
hash: 3904189667
|
|
85
85
|
segments:
|
|
86
86
|
- 1
|
|
87
87
|
- 2
|
|
@@ -112,7 +112,7 @@ description: |
|
|
|
112
112
|
servers, web frameworks, and software in between (the so-called
|
|
113
113
|
middleware) into a single method call.
|
|
114
114
|
|
|
115
|
-
Also see http://rack.
|
|
115
|
+
Also see http://rack.github.com/.
|
|
116
116
|
|
|
117
117
|
email: chneukirchen@gmail.com
|
|
118
118
|
executables:
|
|
@@ -124,7 +124,10 @@ extra_rdoc_files:
|
|
|
124
124
|
- KNOWN-ISSUES
|
|
125
125
|
files:
|
|
126
126
|
- bin/rackup
|
|
127
|
+
- contrib/rack.png
|
|
128
|
+
- contrib/rack.svg
|
|
127
129
|
- contrib/rack_logo.svg
|
|
130
|
+
- contrib/rdoc.css
|
|
128
131
|
- example/lobster.ru
|
|
129
132
|
- example/protectedlobster.rb
|
|
130
133
|
- example/protectedlobster.ru
|
|
@@ -137,6 +140,7 @@ files:
|
|
|
137
140
|
- lib/rack/auth/digest/request.rb
|
|
138
141
|
- lib/rack/backports/uri/common_18.rb
|
|
139
142
|
- lib/rack/backports/uri/common_192.rb
|
|
143
|
+
- lib/rack/backports/uri/common_193.rb
|
|
140
144
|
- lib/rack/body_proxy.rb
|
|
141
145
|
- lib/rack/builder.rb
|
|
142
146
|
- lib/rack/cascade.rb
|
|
@@ -194,7 +198,14 @@ files:
|
|
|
194
198
|
- test/builder/anything.rb
|
|
195
199
|
- test/builder/comment.ru
|
|
196
200
|
- test/builder/end.ru
|
|
201
|
+
- test/builder/line.ru
|
|
197
202
|
- test/builder/options.ru
|
|
203
|
+
- test/cgi/assets/folder/test.js
|
|
204
|
+
- test/cgi/assets/fonts/font.eot
|
|
205
|
+
- test/cgi/assets/images/image.png
|
|
206
|
+
- test/cgi/assets/index.html
|
|
207
|
+
- test/cgi/assets/javascripts/app.js
|
|
208
|
+
- test/cgi/assets/stylesheets/app.css
|
|
198
209
|
- test/cgi/lighttpd.conf
|
|
199
210
|
- test/cgi/rackup_stub.rb
|
|
200
211
|
- test/cgi/sample_rackup.ru
|
|
@@ -213,6 +224,9 @@ files:
|
|
|
213
224
|
- test/multipart/filename_with_escaped_quotes
|
|
214
225
|
- test/multipart/filename_with_escaped_quotes_and_modification_param
|
|
215
226
|
- test/multipart/filename_with_percent_escaped_quotes
|
|
227
|
+
- test/multipart/filename_with_unescaped_percentages
|
|
228
|
+
- test/multipart/filename_with_unescaped_percentages2
|
|
229
|
+
- test/multipart/filename_with_unescaped_percentages3
|
|
216
230
|
- test/multipart/filename_with_unescaped_quotes
|
|
217
231
|
- test/multipart/ie
|
|
218
232
|
- test/multipart/mixed_files
|
|
@@ -223,6 +237,7 @@ files:
|
|
|
223
237
|
- test/multipart/webkit
|
|
224
238
|
- test/rackup/config.ru
|
|
225
239
|
- test/registering_handler/rack/handler/registering_myself.rb
|
|
240
|
+
- test/spec_auth.rb
|
|
226
241
|
- test/spec_auth_basic.rb
|
|
227
242
|
- test/spec_auth_digest.rb
|
|
228
243
|
- test/spec_body_proxy.rb
|
|
@@ -269,6 +284,7 @@ files:
|
|
|
269
284
|
- test/spec_urlmap.rb
|
|
270
285
|
- test/spec_utils.rb
|
|
271
286
|
- test/spec_webrick.rb
|
|
287
|
+
- test/static/another/index.html
|
|
272
288
|
- test/static/index.html
|
|
273
289
|
- test/testrequest.rb
|
|
274
290
|
- test/unregistered_handler/rack/handler/unregistered.rb
|
|
@@ -279,7 +295,7 @@ files:
|
|
|
279
295
|
- Rakefile
|
|
280
296
|
- README.rdoc
|
|
281
297
|
- SPEC
|
|
282
|
-
homepage: http://rack.
|
|
298
|
+
homepage: http://rack.github.com/
|
|
283
299
|
licenses: []
|
|
284
300
|
|
|
285
301
|
post_install_message:
|
|
@@ -308,11 +324,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
308
324
|
requirements: []
|
|
309
325
|
|
|
310
326
|
rubyforge_project: rack
|
|
311
|
-
rubygems_version: 1.8.
|
|
327
|
+
rubygems_version: 1.8.24
|
|
312
328
|
signing_key:
|
|
313
329
|
specification_version: 3
|
|
314
330
|
summary: a modular Ruby webserver interface
|
|
315
331
|
test_files:
|
|
332
|
+
- test/spec_auth.rb
|
|
316
333
|
- test/spec_auth_basic.rb
|
|
317
334
|
- test/spec_auth_digest.rb
|
|
318
335
|
- test/spec_body_proxy.rb
|
|
@@ -359,3 +376,4 @@ test_files:
|
|
|
359
376
|
- test/spec_urlmap.rb
|
|
360
377
|
- test/spec_utils.rb
|
|
361
378
|
- test/spec_webrick.rb
|
|
379
|
+
has_rdoc:
|