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 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
@@ -20,7 +20,7 @@ module Rack
20
20
 
21
21
  # Return the Rack release as a dotted string.
22
22
  def self.release
23
- "1.1.2"
23
+ "1.1.3"
24
24
  end
25
25
 
26
26
  autoload :Builder, "rack/builder"
@@ -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=" + value[:expires].clone.gmtime.
178
- strftime("%a, %d-%b-%Y %H:%M:%S GMT") if value[:expires]
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 Array
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
- unless Array === header["Set-Cookie"]
203
- header["Set-Cookie"] = [header["Set-Cookie"]].compact
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
- header["Set-Cookie"].reject! { |cookie|
207
- cookie =~ /\A#{escape(key)}=/
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)
@@ -33,7 +33,8 @@ EOF
33
33
 
34
34
  s.add_development_dependency 'test-spec'
35
35
 
36
- s.add_development_dependency 'camping', '< 1.5'
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'
@@ -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
 
@@ -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 "INFO -- : Program started"
19
- errors.string.should.match "WARN -- : Nothing to do"
18
+ errors.string.should.match "Program started"
19
+ errors.string.should.match "Nothing to do"
20
20
  end
21
21
  end
@@ -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
@@ -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: 23
5
- prerelease: false
4
+ hash: 21
5
+ prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 1
9
- - 2
10
- version: 1.1.2
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-03-13 00:00:00 +01:00
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: camping
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: 5
42
+ hash: 7
44
43
  segments:
45
- - 1
46
- - 5
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: fcgi
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
- - 0
61
- version: "0"
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: memcache-client
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: mongrel
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: thin
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: *id006
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
- - lib/rack/session/cookie.rb
132
- - lib/rack/session/pool.rb
133
- - lib/rack/session/memcache.rb
134
- - lib/rack/session/abstract/id.rb
135
- - lib/rack/response.rb
136
- - lib/rack/conditionalget.rb
137
- - lib/rack/showstatus.rb
138
- - lib/rack/rewindable_input.rb
139
- - lib/rack/sendfile.rb
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/handler.rb
156
- - lib/rack/mock.rb
157
- - lib/rack/static.rb
158
- - lib/rack/deflater.rb
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/server.rb
160
+ - lib/rack/deflater.rb
161
161
  - lib/rack/directory.rb
162
- - lib/rack/showexceptions.rb
163
- - lib/rack/adapter/camping.rb
162
+ - lib/rack/etag.rb
164
163
  - lib/rack/file.rb
165
- - lib/rack/request.rb
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/commonlogger.rb
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/auth/digest/request.rb
175
- - lib/rack/auth/digest/nonce.rb
176
- - lib/rack/auth/digest/params.rb
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/spec_rack_lobster.rb
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/spec_rack_runtime.rb
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/spec_rack_builder.rb
200
- - test/spec_rack_rewindable_input.rb
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/spec_rack_request.rb
208
- - test/spec_rack_auth_basic.rb
209
- - test/spec_rack_directory.rb
210
- - test/spec_rack_utils.rb
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/spec_rackup.rb
213
- - test/spec_rack_thin.rb
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/spec_rack_commonlogger.rb
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/spec_rack_config.rb
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/spec_rack_methodoverride.rb
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/spec_rack_camping.rb
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.3.7
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/spec_rack_lobster.rb
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/spec_rack_runtime.rb
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/spec_rack_builder.rb
279
- - test/spec_rack_rewindable_input.rb
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/spec_rack_request.rb
287
- - test/spec_rack_auth_basic.rb
288
- - test/spec_rack_directory.rb
289
- - test/spec_rack_utils.rb
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/spec_rackup.rb
292
- - test/spec_rack_thin.rb
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/spec_rack_commonlogger.rb
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/spec_rack_config.rb
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/spec_rack_methodoverride.rb
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/spec_rack_camping.rb
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