rack 1.1.2 → 1.1.3
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 +4 -0
- data/lib/rack.rb +1 -1
- data/lib/rack/utils.rb +78 -11
- data/rack.gemspec +2 -1
- data/test/spec_rack_camping.rb +4 -0
- data/test/spec_rack_logger.rb +2 -2
- data/test/spec_rack_request.rb +49 -0
- data/test/spec_rack_response.rb +3 -3
- metadata +151 -139
data/README
CHANGED
@@ -317,6 +317,10 @@ run on port 11211) and memcache-client installed.
|
|
317
317
|
* Security fix in Rack::Auth::Digest::MD5: when authenticator
|
318
318
|
returned nil, permission was granted on empty password.
|
319
319
|
|
320
|
+
* December 28th, 2011: Twenty first public release: 1.1.3.
|
321
|
+
* Security fix. http://www.ocert.org/advisories/ocert-2011-003.html
|
322
|
+
Further information here: http://jruby.org/2011/12/27/jruby-1-6-5-1
|
323
|
+
|
320
324
|
== Contact
|
321
325
|
|
322
326
|
Please post bugs, suggestions and patches to
|
data/lib/rack.rb
CHANGED
data/lib/rack/utils.rb
CHANGED
@@ -28,6 +28,14 @@ module Rack
|
|
28
28
|
|
29
29
|
DEFAULT_SEP = /[&;] */n
|
30
30
|
|
31
|
+
class << self
|
32
|
+
attr_accessor :key_space_limit
|
33
|
+
end
|
34
|
+
|
35
|
+
# The default number of bytes to allow parameter keys to take up.
|
36
|
+
# This helps prevent a rogue client from flooding a Request.
|
37
|
+
self.key_space_limit = 65536
|
38
|
+
|
31
39
|
# Stolen from Mongrel, with some small modifications:
|
32
40
|
# Parses a query string by breaking it up at the '&'
|
33
41
|
# and ';' characters. You can also use this to parse
|
@@ -36,8 +44,19 @@ module Rack
|
|
36
44
|
def parse_query(qs, d = nil)
|
37
45
|
params = {}
|
38
46
|
|
47
|
+
max_key_space = Utils.key_space_limit
|
48
|
+
bytes = 0
|
49
|
+
|
39
50
|
(qs || '').split(d ? /[#{d}] */n : DEFAULT_SEP).each do |p|
|
40
51
|
k, v = p.split('=', 2).map { |x| unescape(x) }
|
52
|
+
|
53
|
+
if k
|
54
|
+
bytes += k.size
|
55
|
+
if bytes > max_key_space
|
56
|
+
raise RangeError, "exceeded available parameter key space"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
41
60
|
if cur = params[k]
|
42
61
|
if cur.class == Array
|
43
62
|
params[k] << v
|
@@ -56,8 +75,19 @@ module Rack
|
|
56
75
|
def parse_nested_query(qs, d = nil)
|
57
76
|
params = {}
|
58
77
|
|
78
|
+
max_key_space = Utils.key_space_limit
|
79
|
+
bytes = 0
|
80
|
+
|
59
81
|
(qs || '').split(d ? /[#{d}] */n : DEFAULT_SEP).each do |p|
|
60
82
|
k, v = unescape(p).split('=', 2)
|
83
|
+
|
84
|
+
if k
|
85
|
+
bytes += k.size
|
86
|
+
if bytes > max_key_space
|
87
|
+
raise RangeError, "exceeded available parameter key space"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
61
91
|
normalize_params(params, k, v)
|
62
92
|
end
|
63
93
|
|
@@ -174,8 +204,8 @@ module Rack
|
|
174
204
|
path = "; path=" + value[:path] if value[:path]
|
175
205
|
# According to RFC 2109, we need dashes here.
|
176
206
|
# N.B.: cgi.rb uses spaces...
|
177
|
-
expires = "; expires=" +
|
178
|
-
|
207
|
+
expires = "; expires=" +
|
208
|
+
rfc2822(value[:expires].clone.gmtime) if value[:expires]
|
179
209
|
secure = "; secure" if value[:secure]
|
180
210
|
httponly = "; HttpOnly" if value[:httponly]
|
181
211
|
value = value[:value]
|
@@ -186,12 +216,12 @@ module Rack
|
|
186
216
|
"#{domain}#{path}#{expires}#{secure}#{httponly}"
|
187
217
|
|
188
218
|
case header["Set-Cookie"]
|
189
|
-
when
|
190
|
-
header["Set-Cookie"] << cookie
|
191
|
-
when String
|
192
|
-
header["Set-Cookie"] = [header["Set-Cookie"], cookie]
|
193
|
-
when nil
|
219
|
+
when nil, ''
|
194
220
|
header["Set-Cookie"] = cookie
|
221
|
+
when String
|
222
|
+
header["Set-Cookie"] = [header["Set-Cookie"], cookie].join("\n")
|
223
|
+
when Array
|
224
|
+
header["Set-Cookie"] = (header["Set-Cookie"] + [cookie]).join("\n")
|
195
225
|
end
|
196
226
|
|
197
227
|
nil
|
@@ -199,14 +229,25 @@ module Rack
|
|
199
229
|
module_function :set_cookie_header!
|
200
230
|
|
201
231
|
def delete_cookie_header!(header, key, value = {})
|
202
|
-
|
203
|
-
|
232
|
+
case header["Set-Cookie"]
|
233
|
+
when nil, ''
|
234
|
+
cookies = []
|
235
|
+
when String
|
236
|
+
cookies = header["Set-Cookie"].split("\n")
|
237
|
+
when Array
|
238
|
+
cookies = header["Set-Cookie"]
|
204
239
|
end
|
205
240
|
|
206
|
-
|
207
|
-
|
241
|
+
cookies.reject! { |cookie|
|
242
|
+
if value[:domain]
|
243
|
+
cookie =~ /\A#{escape(key)}=.*domain=#{value[:domain]}/
|
244
|
+
else
|
245
|
+
cookie =~ /\A#{escape(key)}=/
|
246
|
+
end
|
208
247
|
}
|
209
248
|
|
249
|
+
header["Set-Cookie"] = cookies.join("\n")
|
250
|
+
|
210
251
|
set_cookie_header!(header, key,
|
211
252
|
{:value => '', :path => nil, :domain => nil,
|
212
253
|
:expires => Time.at(0) }.merge(value))
|
@@ -215,6 +256,22 @@ module Rack
|
|
215
256
|
end
|
216
257
|
module_function :delete_cookie_header!
|
217
258
|
|
259
|
+
# Modified version of stdlib time.rb Time#rfc2822 to use '%d-%b-%Y' instead
|
260
|
+
# of '% %b %Y'.
|
261
|
+
# It assumes that the time is in GMT to comply to the RFC 2109.
|
262
|
+
#
|
263
|
+
# NOTE: I'm not sure the RFC says it requires GMT, but is ambigous enough
|
264
|
+
# that I'm certain someone implemented only that option.
|
265
|
+
# Do not use %a and %b from Time.strptime, it would use localized names for
|
266
|
+
# weekday and month.
|
267
|
+
#
|
268
|
+
def rfc2822(time)
|
269
|
+
wday = Time::RFC2822_DAY_NAME[time.wday]
|
270
|
+
mon = Time::RFC2822_MONTH_NAME[time.mon - 1]
|
271
|
+
time.strftime("#{wday}, %d-#{mon}-%Y %H:%M:%S GMT")
|
272
|
+
end
|
273
|
+
module_function :rfc2822
|
274
|
+
|
218
275
|
# Return the bytesize of String; uses String#length under Ruby 1.8 and
|
219
276
|
# String#bytesize under 1.9.
|
220
277
|
if ''.respond_to?(:bytesize)
|
@@ -462,6 +519,9 @@ module Rack
|
|
462
519
|
|
463
520
|
rx = /(?:#{EOL})?#{Regexp.quote boundary}(#{EOL}|--)/n
|
464
521
|
|
522
|
+
max_key_space = Utils.key_space_limit
|
523
|
+
bytes = 0
|
524
|
+
|
465
525
|
loop {
|
466
526
|
head = nil
|
467
527
|
body = ''
|
@@ -476,6 +536,13 @@ module Rack
|
|
476
536
|
content_type = head[/Content-Type: (.*)#{EOL}/ni, 1]
|
477
537
|
name = head[/Content-Disposition:.*\s+name="?([^\";]*)"?/ni, 1] || head[/Content-ID:\s*([^#{EOL}]*)/ni, 1]
|
478
538
|
|
539
|
+
if name
|
540
|
+
bytes += name.size
|
541
|
+
if bytes > max_key_space
|
542
|
+
raise RangeError, "exceeded available parameter key space"
|
543
|
+
end
|
544
|
+
end
|
545
|
+
|
479
546
|
if content_type || filename
|
480
547
|
body = Tempfile.new("RackMultipart")
|
481
548
|
body.binmode if body.respond_to?(:binmode)
|
data/rack.gemspec
CHANGED
@@ -33,7 +33,8 @@ EOF
|
|
33
33
|
|
34
34
|
s.add_development_dependency 'test-spec'
|
35
35
|
|
36
|
-
s.add_development_dependency '
|
36
|
+
s.add_development_dependency 'activesupport', '< 2'
|
37
|
+
s.add_development_dependency 'camping', '< 1.6'
|
37
38
|
s.add_development_dependency 'fcgi'
|
38
39
|
s.add_development_dependency 'memcache-client'
|
39
40
|
s.add_development_dependency 'mongrel'
|
data/test/spec_rack_camping.rb
CHANGED
@@ -6,6 +6,10 @@ begin
|
|
6
6
|
require 'rack/mock'
|
7
7
|
|
8
8
|
$-w, w = nil, $-w # yuck
|
9
|
+
|
10
|
+
# campings dependencies also don't pull this in anymore:
|
11
|
+
class Object;def meta_def m,&b;(class<<self;self;end).send:define_method,m,&b end end
|
12
|
+
|
9
13
|
require 'camping'
|
10
14
|
require 'rack/adapter/camping'
|
11
15
|
|
data/test/spec_rack_logger.rb
CHANGED
@@ -15,7 +15,7 @@ context "Rack::Logger" do
|
|
15
15
|
|
16
16
|
errors = StringIO.new
|
17
17
|
Rack::Logger.new(app).call({'rack.errors' => errors})
|
18
|
-
errors.string.should.match "
|
19
|
-
errors.string.should.match "
|
18
|
+
errors.string.should.match "Program started"
|
19
|
+
errors.string.should.match "Nothing to do"
|
20
20
|
end
|
21
21
|
end
|
data/test/spec_rack_request.rb
CHANGED
@@ -79,6 +79,32 @@ context "Rack::Request" do
|
|
79
79
|
req.params.should.equal "foo" => "bar", "quux" => "bla"
|
80
80
|
end
|
81
81
|
|
82
|
+
specify "limit the keys from the GET query string" do
|
83
|
+
env = Rack::MockRequest.env_for("/?foo=bar")
|
84
|
+
|
85
|
+
old, Rack::Utils.key_space_limit = Rack::Utils.key_space_limit, 1
|
86
|
+
begin
|
87
|
+
req = Rack::Request.new(env)
|
88
|
+
lambda { req.GET }.should.raise(RangeError)
|
89
|
+
ensure
|
90
|
+
Rack::Utils.key_space_limit = old
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
specify "limit the keys from the POST form data" do
|
95
|
+
env = Rack::MockRequest.env_for("",
|
96
|
+
"REQUEST_METHOD" => 'POST',
|
97
|
+
:input => "foo=bar&quux=bla")
|
98
|
+
|
99
|
+
old, Rack::Utils.key_space_limit = Rack::Utils.key_space_limit, 1
|
100
|
+
begin
|
101
|
+
req = Rack::Request.new(env)
|
102
|
+
lambda { req.POST }.should.raise(RangeError)
|
103
|
+
ensure
|
104
|
+
Rack::Utils.key_space_limit = old
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
82
108
|
specify "can parse POST data with explicit content type regardless of method" do
|
83
109
|
req = Rack::Request.new \
|
84
110
|
Rack::MockRequest.env_for("/",
|
@@ -295,6 +321,29 @@ context "Rack::Request" do
|
|
295
321
|
req.media_type_params['bling'].should.equal 'bam'
|
296
322
|
end
|
297
323
|
|
324
|
+
specify "raise RangeError if the key space is exhausted" do
|
325
|
+
input = <<EOF
|
326
|
+
--AaB03x\r
|
327
|
+
Content-Disposition: form-data; name="text"\r
|
328
|
+
Content-Type: text/plain; charset=US-ASCII\r
|
329
|
+
\r
|
330
|
+
contents\r
|
331
|
+
--AaB03x--\r
|
332
|
+
EOF
|
333
|
+
|
334
|
+
env = Rack::MockRequest.env_for("/",
|
335
|
+
"CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
|
336
|
+
"CONTENT_LENGTH" => input.size,
|
337
|
+
:input => input)
|
338
|
+
|
339
|
+
old, Rack::Utils.key_space_limit = Rack::Utils.key_space_limit, 1
|
340
|
+
begin
|
341
|
+
lambda { Rack::Utils::Multipart.parse_multipart(env) }.should.raise(RangeError)
|
342
|
+
ensure
|
343
|
+
Rack::Utils.key_space_limit = old
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
298
347
|
specify "can parse multipart form data" do
|
299
348
|
# Adapted from RFC 1867.
|
300
349
|
input = <<EOF
|
data/test/spec_rack_response.rb
CHANGED
@@ -50,9 +50,9 @@ context "Rack::Response" do
|
|
50
50
|
response.set_cookie "foo", "bar"
|
51
51
|
response["Set-Cookie"].should.equal "foo=bar"
|
52
52
|
response.set_cookie "foo2", "bar2"
|
53
|
-
response["Set-Cookie"].should.equal ["foo=bar", "foo2=bar2"]
|
53
|
+
response["Set-Cookie"].should.equal ["foo=bar", "foo2=bar2"].join("\n")
|
54
54
|
response.set_cookie "foo3", "bar3"
|
55
|
-
response["Set-Cookie"].should.equal ["foo=bar", "foo2=bar2", "foo3=bar3"]
|
55
|
+
response["Set-Cookie"].should.equal ["foo=bar", "foo2=bar2", "foo3=bar3"].join("\n")
|
56
56
|
end
|
57
57
|
|
58
58
|
specify "formats the Cookie expiration date accordingly to RFC 2109" do
|
@@ -81,7 +81,7 @@ context "Rack::Response" do
|
|
81
81
|
response.set_cookie "foo2", "bar2"
|
82
82
|
response.delete_cookie "foo"
|
83
83
|
response["Set-Cookie"].should.equal ["foo2=bar2",
|
84
|
-
"foo=; expires=Thu, 01-Jan-1970 00:00:00 GMT"]
|
84
|
+
"foo=; expires=Thu, 01-Jan-1970 00:00:00 GMT"].join("\n")
|
85
85
|
end
|
86
86
|
|
87
87
|
specify "can do redirects" do
|
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:
|
5
|
-
prerelease:
|
4
|
+
hash: 21
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 1.1.
|
9
|
+
- 3
|
10
|
+
version: 1.1.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Christian Neukirchen
|
@@ -15,8 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
19
|
-
default_executable:
|
18
|
+
date: 2011-12-28 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
21
|
name: test-spec
|
@@ -33,36 +32,36 @@ dependencies:
|
|
33
32
|
type: :development
|
34
33
|
version_requirements: *id001
|
35
34
|
- !ruby/object:Gem::Dependency
|
36
|
-
name:
|
35
|
+
name: activesupport
|
37
36
|
prerelease: false
|
38
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
38
|
none: false
|
40
39
|
requirements:
|
41
40
|
- - <
|
42
41
|
- !ruby/object:Gem::Version
|
43
|
-
hash:
|
42
|
+
hash: 7
|
44
43
|
segments:
|
45
|
-
-
|
46
|
-
|
47
|
-
version: "1.5"
|
44
|
+
- 2
|
45
|
+
version: "2"
|
48
46
|
type: :development
|
49
47
|
version_requirements: *id002
|
50
48
|
- !ruby/object:Gem::Dependency
|
51
|
-
name:
|
49
|
+
name: camping
|
52
50
|
prerelease: false
|
53
51
|
requirement: &id003 !ruby/object:Gem::Requirement
|
54
52
|
none: false
|
55
53
|
requirements:
|
56
|
-
- -
|
54
|
+
- - <
|
57
55
|
- !ruby/object:Gem::Version
|
58
56
|
hash: 3
|
59
57
|
segments:
|
60
|
-
-
|
61
|
-
|
58
|
+
- 1
|
59
|
+
- 6
|
60
|
+
version: "1.6"
|
62
61
|
type: :development
|
63
62
|
version_requirements: *id003
|
64
63
|
- !ruby/object:Gem::Dependency
|
65
|
-
name:
|
64
|
+
name: fcgi
|
66
65
|
prerelease: false
|
67
66
|
requirement: &id004 !ruby/object:Gem::Requirement
|
68
67
|
none: false
|
@@ -76,7 +75,7 @@ dependencies:
|
|
76
75
|
type: :development
|
77
76
|
version_requirements: *id004
|
78
77
|
- !ruby/object:Gem::Dependency
|
79
|
-
name:
|
78
|
+
name: memcache-client
|
80
79
|
prerelease: false
|
81
80
|
requirement: &id005 !ruby/object:Gem::Requirement
|
82
81
|
none: false
|
@@ -90,9 +89,23 @@ dependencies:
|
|
90
89
|
type: :development
|
91
90
|
version_requirements: *id005
|
92
91
|
- !ruby/object:Gem::Dependency
|
93
|
-
name:
|
92
|
+
name: mongrel
|
94
93
|
prerelease: false
|
95
94
|
requirement: &id006 !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
hash: 3
|
100
|
+
segments:
|
101
|
+
- 0
|
102
|
+
version: "0"
|
103
|
+
type: :development
|
104
|
+
version_requirements: *id006
|
105
|
+
- !ruby/object:Gem::Dependency
|
106
|
+
name: thin
|
107
|
+
prerelease: false
|
108
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
96
109
|
none: false
|
97
110
|
requirements:
|
98
111
|
- - <
|
@@ -103,7 +116,7 @@ dependencies:
|
|
103
116
|
- 2
|
104
117
|
version: "1.2"
|
105
118
|
type: :development
|
106
|
-
version_requirements: *
|
119
|
+
version_requirements: *id007
|
107
120
|
description: |
|
108
121
|
Rack provides minimal, modular and adaptable interface for developing
|
109
122
|
web applications in Ruby. By wrapping HTTP requests and responses in
|
@@ -125,65 +138,65 @@ extra_rdoc_files:
|
|
125
138
|
files:
|
126
139
|
- bin/rackup
|
127
140
|
- contrib/rack_logo.svg
|
128
|
-
- example/protectedlobster.ru
|
129
141
|
- example/lobster.ru
|
130
142
|
- example/protectedlobster.rb
|
131
|
-
-
|
132
|
-
- lib/rack/
|
133
|
-
- lib/rack/
|
134
|
-
- lib/rack/
|
135
|
-
- lib/rack/
|
136
|
-
- lib/rack/
|
137
|
-
- lib/rack/
|
138
|
-
- lib/rack/
|
139
|
-
- lib/rack/
|
140
|
-
- lib/rack/urlmap.rb
|
141
|
-
- lib/rack/chunked.rb
|
142
|
-
- lib/rack/head.rb
|
143
|
-
- lib/rack/runtime.rb
|
144
|
-
- lib/rack/handler/webrick.rb
|
145
|
-
- lib/rack/handler/thin.rb
|
146
|
-
- lib/rack/handler/scgi.rb
|
147
|
-
- lib/rack/handler/mongrel.rb
|
148
|
-
- lib/rack/handler/evented_mongrel.rb
|
149
|
-
- lib/rack/handler/swiftiplied_mongrel.rb
|
150
|
-
- lib/rack/handler/lsws.rb
|
151
|
-
- lib/rack/handler/fastcgi.rb
|
152
|
-
- lib/rack/handler/cgi.rb
|
153
|
-
- lib/rack/lock.rb
|
143
|
+
- example/protectedlobster.ru
|
144
|
+
- lib/rack/adapter/camping.rb
|
145
|
+
- lib/rack/auth/abstract/handler.rb
|
146
|
+
- lib/rack/auth/abstract/request.rb
|
147
|
+
- lib/rack/auth/basic.rb
|
148
|
+
- lib/rack/auth/digest/md5.rb
|
149
|
+
- lib/rack/auth/digest/nonce.rb
|
150
|
+
- lib/rack/auth/digest/params.rb
|
151
|
+
- lib/rack/auth/digest/request.rb
|
154
152
|
- lib/rack/builder.rb
|
155
|
-
- lib/rack/
|
156
|
-
- lib/rack/
|
157
|
-
- lib/rack/
|
158
|
-
- lib/rack/
|
153
|
+
- lib/rack/cascade.rb
|
154
|
+
- lib/rack/chunked.rb
|
155
|
+
- lib/rack/commonlogger.rb
|
156
|
+
- lib/rack/conditionalget.rb
|
157
|
+
- lib/rack/config.rb
|
158
|
+
- lib/rack/content_length.rb
|
159
159
|
- lib/rack/content_type.rb
|
160
|
-
- lib/rack/
|
160
|
+
- lib/rack/deflater.rb
|
161
161
|
- lib/rack/directory.rb
|
162
|
-
- lib/rack/
|
163
|
-
- lib/rack/adapter/camping.rb
|
162
|
+
- lib/rack/etag.rb
|
164
163
|
- lib/rack/file.rb
|
165
|
-
- lib/rack/
|
164
|
+
- lib/rack/handler/cgi.rb
|
165
|
+
- lib/rack/handler/evented_mongrel.rb
|
166
|
+
- lib/rack/handler/fastcgi.rb
|
167
|
+
- lib/rack/handler/lsws.rb
|
168
|
+
- lib/rack/handler/mongrel.rb
|
169
|
+
- lib/rack/handler/scgi.rb
|
170
|
+
- lib/rack/handler/swiftiplied_mongrel.rb
|
171
|
+
- lib/rack/handler/thin.rb
|
172
|
+
- lib/rack/handler/webrick.rb
|
173
|
+
- lib/rack/handler.rb
|
174
|
+
- lib/rack/head.rb
|
175
|
+
- lib/rack/lint.rb
|
166
176
|
- lib/rack/lobster.rb
|
167
|
-
- lib/rack/
|
168
|
-
- lib/rack/config.rb
|
169
|
-
- lib/rack/utils.rb
|
170
|
-
- lib/rack/etag.rb
|
171
|
-
- lib/rack/methodoverride.rb
|
172
|
-
- lib/rack/cascade.rb
|
177
|
+
- lib/rack/lock.rb
|
173
178
|
- lib/rack/logger.rb
|
174
|
-
- lib/rack/
|
175
|
-
- lib/rack/
|
176
|
-
- lib/rack/
|
177
|
-
- lib/rack/auth/digest/md5.rb
|
178
|
-
- lib/rack/auth/basic.rb
|
179
|
-
- lib/rack/auth/abstract/handler.rb
|
180
|
-
- lib/rack/auth/abstract/request.rb
|
181
|
-
- lib/rack/content_length.rb
|
179
|
+
- lib/rack/methodoverride.rb
|
180
|
+
- lib/rack/mime.rb
|
181
|
+
- lib/rack/mock.rb
|
182
182
|
- lib/rack/nulllogger.rb
|
183
|
-
- lib/rack/lint.rb
|
184
183
|
- lib/rack/recursive.rb
|
185
|
-
- lib/rack/mime.rb
|
186
184
|
- lib/rack/reloader.rb
|
185
|
+
- lib/rack/request.rb
|
186
|
+
- lib/rack/response.rb
|
187
|
+
- lib/rack/rewindable_input.rb
|
188
|
+
- lib/rack/runtime.rb
|
189
|
+
- lib/rack/sendfile.rb
|
190
|
+
- lib/rack/server.rb
|
191
|
+
- lib/rack/session/abstract/id.rb
|
192
|
+
- lib/rack/session/cookie.rb
|
193
|
+
- lib/rack/session/memcache.rb
|
194
|
+
- lib/rack/session/pool.rb
|
195
|
+
- lib/rack/showexceptions.rb
|
196
|
+
- lib/rack/showstatus.rb
|
197
|
+
- lib/rack/static.rb
|
198
|
+
- lib/rack/urlmap.rb
|
199
|
+
- lib/rack/utils.rb
|
187
200
|
- lib/rack.rb
|
188
201
|
- COPYING
|
189
202
|
- KNOWN-ISSUES
|
@@ -191,51 +204,50 @@ files:
|
|
191
204
|
- RDOX
|
192
205
|
- README
|
193
206
|
- SPEC
|
194
|
-
- test/
|
207
|
+
- test/spec_rack_auth_basic.rb
|
208
|
+
- test/spec_rack_auth_digest.rb
|
209
|
+
- test/spec_rack_builder.rb
|
210
|
+
- test/spec_rack_camping.rb
|
211
|
+
- test/spec_rack_cascade.rb
|
212
|
+
- test/spec_rack_cgi.rb
|
213
|
+
- test/spec_rack_chunked.rb
|
214
|
+
- test/spec_rack_commonlogger.rb
|
215
|
+
- test/spec_rack_conditionalget.rb
|
216
|
+
- test/spec_rack_config.rb
|
195
217
|
- test/spec_rack_content_length.rb
|
196
|
-
- test/
|
218
|
+
- test/spec_rack_content_type.rb
|
219
|
+
- test/spec_rack_deflater.rb
|
220
|
+
- test/spec_rack_directory.rb
|
197
221
|
- test/spec_rack_etag.rb
|
222
|
+
- test/spec_rack_fastcgi.rb
|
223
|
+
- test/spec_rack_file.rb
|
224
|
+
- test/spec_rack_handler.rb
|
225
|
+
- test/spec_rack_head.rb
|
198
226
|
- test/spec_rack_lint.rb
|
199
|
-
- test/
|
200
|
-
- test/
|
201
|
-
- test/spec_rack_showexceptions.rb
|
202
|
-
- test/spec_rack_session_cookie.rb
|
203
|
-
- test/spec_rack_conditionalget.rb
|
204
|
-
- test/spec_rack_mock.rb
|
205
|
-
- test/spec_rack_showstatus.rb
|
227
|
+
- test/spec_rack_lobster.rb
|
228
|
+
- test/spec_rack_lock.rb
|
206
229
|
- test/spec_rack_logger.rb
|
207
|
-
- test/
|
208
|
-
- test/
|
209
|
-
- test/
|
210
|
-
- test/
|
230
|
+
- test/spec_rack_methodoverride.rb
|
231
|
+
- test/spec_rack_mock.rb
|
232
|
+
- test/spec_rack_mongrel.rb
|
233
|
+
- test/spec_rack_nulllogger.rb
|
211
234
|
- test/spec_rack_recursive.rb
|
212
|
-
- test/
|
213
|
-
- test/
|
235
|
+
- test/spec_rack_request.rb
|
236
|
+
- test/spec_rack_response.rb
|
237
|
+
- test/spec_rack_rewindable_input.rb
|
238
|
+
- test/spec_rack_runtime.rb
|
239
|
+
- test/spec_rack_sendfile.rb
|
240
|
+
- test/spec_rack_session_cookie.rb
|
214
241
|
- test/spec_rack_session_memcache.rb
|
215
|
-
- test/
|
242
|
+
- test/spec_rack_session_pool.rb
|
243
|
+
- test/spec_rack_showexceptions.rb
|
244
|
+
- test/spec_rack_showstatus.rb
|
216
245
|
- test/spec_rack_static.rb
|
217
|
-
- test/
|
218
|
-
- test/spec_rack_cascade.rb
|
219
|
-
- test/spec_rack_auth_digest.rb
|
220
|
-
- test/spec_rack_chunked.rb
|
221
|
-
- test/spec_rack_mongrel.rb
|
222
|
-
- test/spec_rack_cgi.rb
|
223
|
-
- test/spec_rack_head.rb
|
246
|
+
- test/spec_rack_thin.rb
|
224
247
|
- test/spec_rack_urlmap.rb
|
225
|
-
- test/
|
226
|
-
- test/spec_rack_lock.rb
|
227
|
-
- test/spec_rack_file.rb
|
228
|
-
- test/spec_rack_response.rb
|
229
|
-
- test/spec_rack_nulllogger.rb
|
230
|
-
- test/spec_rack_handler.rb
|
231
|
-
- test/spec_rack_sendfile.rb
|
248
|
+
- test/spec_rack_utils.rb
|
232
249
|
- test/spec_rack_webrick.rb
|
233
|
-
- test/
|
234
|
-
- test/spec_rack_content_type.rb
|
235
|
-
- test/spec_rack_deflater.rb
|
236
|
-
- test/spec_rack_fastcgi.rb
|
237
|
-
- test/spec_rack_session_pool.rb
|
238
|
-
has_rdoc: true
|
250
|
+
- test/spec_rackup.rb
|
239
251
|
homepage: http://rack.rubyforge.org
|
240
252
|
licenses: []
|
241
253
|
|
@@ -265,52 +277,52 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
265
277
|
requirements: []
|
266
278
|
|
267
279
|
rubyforge_project: rack
|
268
|
-
rubygems_version: 1.
|
280
|
+
rubygems_version: 1.8.12
|
269
281
|
signing_key:
|
270
282
|
specification_version: 3
|
271
283
|
summary: a modular Ruby webserver interface
|
272
284
|
test_files:
|
273
|
-
- test/
|
285
|
+
- test/spec_rack_auth_basic.rb
|
286
|
+
- test/spec_rack_auth_digest.rb
|
287
|
+
- test/spec_rack_builder.rb
|
288
|
+
- test/spec_rack_camping.rb
|
289
|
+
- test/spec_rack_cascade.rb
|
290
|
+
- test/spec_rack_cgi.rb
|
291
|
+
- test/spec_rack_chunked.rb
|
292
|
+
- test/spec_rack_commonlogger.rb
|
293
|
+
- test/spec_rack_conditionalget.rb
|
294
|
+
- test/spec_rack_config.rb
|
274
295
|
- test/spec_rack_content_length.rb
|
275
|
-
- test/
|
296
|
+
- test/spec_rack_content_type.rb
|
297
|
+
- test/spec_rack_deflater.rb
|
298
|
+
- test/spec_rack_directory.rb
|
276
299
|
- test/spec_rack_etag.rb
|
300
|
+
- test/spec_rack_fastcgi.rb
|
301
|
+
- test/spec_rack_file.rb
|
302
|
+
- test/spec_rack_handler.rb
|
303
|
+
- test/spec_rack_head.rb
|
277
304
|
- test/spec_rack_lint.rb
|
278
|
-
- test/
|
279
|
-
- test/
|
280
|
-
- test/spec_rack_showexceptions.rb
|
281
|
-
- test/spec_rack_session_cookie.rb
|
282
|
-
- test/spec_rack_conditionalget.rb
|
283
|
-
- test/spec_rack_mock.rb
|
284
|
-
- test/spec_rack_showstatus.rb
|
305
|
+
- test/spec_rack_lobster.rb
|
306
|
+
- test/spec_rack_lock.rb
|
285
307
|
- test/spec_rack_logger.rb
|
286
|
-
- test/
|
287
|
-
- test/
|
288
|
-
- test/
|
289
|
-
- test/
|
308
|
+
- test/spec_rack_methodoverride.rb
|
309
|
+
- test/spec_rack_mock.rb
|
310
|
+
- test/spec_rack_mongrel.rb
|
311
|
+
- test/spec_rack_nulllogger.rb
|
290
312
|
- test/spec_rack_recursive.rb
|
291
|
-
- test/
|
292
|
-
- test/
|
313
|
+
- test/spec_rack_request.rb
|
314
|
+
- test/spec_rack_response.rb
|
315
|
+
- test/spec_rack_rewindable_input.rb
|
316
|
+
- test/spec_rack_runtime.rb
|
317
|
+
- test/spec_rack_sendfile.rb
|
318
|
+
- test/spec_rack_session_cookie.rb
|
293
319
|
- test/spec_rack_session_memcache.rb
|
294
|
-
- test/
|
320
|
+
- test/spec_rack_session_pool.rb
|
321
|
+
- test/spec_rack_showexceptions.rb
|
322
|
+
- test/spec_rack_showstatus.rb
|
295
323
|
- test/spec_rack_static.rb
|
296
|
-
- test/
|
297
|
-
- test/spec_rack_cascade.rb
|
298
|
-
- test/spec_rack_auth_digest.rb
|
299
|
-
- test/spec_rack_chunked.rb
|
300
|
-
- test/spec_rack_mongrel.rb
|
301
|
-
- test/spec_rack_cgi.rb
|
302
|
-
- test/spec_rack_head.rb
|
324
|
+
- test/spec_rack_thin.rb
|
303
325
|
- test/spec_rack_urlmap.rb
|
304
|
-
- test/
|
305
|
-
- test/spec_rack_lock.rb
|
306
|
-
- test/spec_rack_file.rb
|
307
|
-
- test/spec_rack_response.rb
|
308
|
-
- test/spec_rack_nulllogger.rb
|
309
|
-
- test/spec_rack_handler.rb
|
310
|
-
- test/spec_rack_sendfile.rb
|
326
|
+
- test/spec_rack_utils.rb
|
311
327
|
- test/spec_rack_webrick.rb
|
312
|
-
- test/
|
313
|
-
- test/spec_rack_content_type.rb
|
314
|
-
- test/spec_rack_deflater.rb
|
315
|
-
- test/spec_rack_fastcgi.rb
|
316
|
-
- test/spec_rack_session_pool.rb
|
328
|
+
- test/spec_rackup.rb
|