rack 2.0.4 → 2.1.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.
- checksums.yaml +4 -4
- data/{HISTORY.md → CHANGELOG.md} +220 -155
- data/{COPYING → MIT-LICENSE} +4 -2
- data/README.rdoc +77 -119
- data/Rakefile +25 -18
- data/SPEC +3 -4
- data/bin/rackup +1 -0
- data/example/lobster.ru +2 -0
- data/example/protectedlobster.rb +3 -1
- data/example/protectedlobster.ru +2 -0
- data/lib/rack.rb +63 -60
- data/lib/rack/auth/abstract/handler.rb +3 -1
- data/lib/rack/auth/abstract/request.rb +2 -0
- data/lib/rack/auth/basic.rb +4 -1
- data/lib/rack/auth/digest/md5.rb +9 -7
- data/lib/rack/auth/digest/nonce.rb +6 -3
- data/lib/rack/auth/digest/params.rb +4 -2
- data/lib/rack/auth/digest/request.rb +2 -0
- data/lib/rack/body_proxy.rb +3 -6
- data/lib/rack/builder.rb +38 -15
- data/lib/rack/cascade.rb +6 -5
- data/lib/rack/chunked.rb +29 -6
- data/lib/rack/common_logger.rb +9 -8
- data/lib/rack/conditional_get.rb +3 -1
- data/lib/rack/config.rb +2 -0
- data/lib/rack/content_length.rb +3 -1
- data/lib/rack/content_type.rb +3 -1
- data/lib/rack/core_ext/regexp.rb +14 -0
- data/lib/rack/deflater.rb +28 -17
- data/lib/rack/directory.rb +17 -14
- data/lib/rack/etag.rb +3 -1
- data/lib/rack/events.rb +5 -3
- data/lib/rack/file.rb +5 -173
- data/lib/rack/files.rb +178 -0
- data/lib/rack/handler.rb +7 -2
- data/lib/rack/handler/cgi.rb +3 -1
- data/lib/rack/handler/fastcgi.rb +4 -2
- data/lib/rack/handler/lsws.rb +3 -1
- data/lib/rack/handler/scgi.rb +9 -6
- data/lib/rack/handler/thin.rb +3 -1
- data/lib/rack/handler/webrick.rb +4 -2
- data/lib/rack/head.rb +2 -0
- data/lib/rack/lint.rb +14 -11
- data/lib/rack/lobster.rb +7 -5
- data/lib/rack/lock.rb +2 -0
- data/lib/rack/logger.rb +2 -0
- data/lib/rack/media_type.rb +10 -5
- data/lib/rack/method_override.rb +9 -3
- data/lib/rack/mime.rb +9 -1
- data/lib/rack/mock.rb +74 -15
- data/lib/rack/multipart.rb +5 -3
- data/lib/rack/multipart/generator.rb +6 -7
- data/lib/rack/multipart/parser.rb +54 -51
- data/lib/rack/multipart/uploaded_file.rb +2 -0
- data/lib/rack/null_logger.rb +2 -0
- data/lib/rack/query_parser.rb +51 -25
- data/lib/rack/recursive.rb +7 -5
- data/lib/rack/reloader.rb +10 -4
- data/lib/rack/request.rb +89 -23
- data/lib/rack/response.rb +71 -31
- data/lib/rack/rewindable_input.rb +4 -2
- data/lib/rack/runtime.rb +4 -2
- data/lib/rack/sendfile.rb +15 -8
- data/lib/rack/server.rb +88 -16
- data/lib/rack/session/abstract/id.rb +104 -21
- data/lib/rack/session/cookie.rb +21 -11
- data/lib/rack/session/memcache.rb +4 -87
- data/lib/rack/session/pool.rb +17 -8
- data/lib/rack/show_exceptions.rb +16 -10
- data/lib/rack/show_status.rb +4 -2
- data/lib/rack/static.rb +15 -10
- data/lib/rack/tempfile_reaper.rb +2 -0
- data/lib/rack/urlmap.rb +11 -2
- data/lib/rack/utils.rb +55 -70
- data/rack.gemspec +19 -9
- metadata +32 -173
- data/test/builder/an_underscore_app.rb +0 -5
- data/test/builder/anything.rb +0 -5
- data/test/builder/comment.ru +0 -4
- data/test/builder/end.ru +0 -5
- data/test/builder/line.ru +0 -1
- data/test/builder/options.ru +0 -2
- data/test/cgi/assets/folder/test.js +0 -1
- data/test/cgi/assets/fonts/font.eot +0 -1
- data/test/cgi/assets/images/image.png +0 -1
- data/test/cgi/assets/index.html +0 -1
- data/test/cgi/assets/javascripts/app.js +0 -1
- data/test/cgi/assets/stylesheets/app.css +0 -1
- data/test/cgi/lighttpd.conf +0 -26
- data/test/cgi/rackup_stub.rb +0 -6
- data/test/cgi/sample_rackup.ru +0 -5
- data/test/cgi/test +0 -9
- data/test/cgi/test+directory/test+file +0 -1
- data/test/cgi/test.fcgi +0 -9
- data/test/cgi/test.gz +0 -0
- data/test/cgi/test.ru +0 -5
- data/test/gemloader.rb +0 -10
- data/test/helper.rb +0 -34
- data/test/multipart/bad_robots +0 -259
- data/test/multipart/binary +0 -0
- data/test/multipart/content_type_and_no_filename +0 -6
- data/test/multipart/empty +0 -10
- data/test/multipart/fail_16384_nofile +0 -814
- data/test/multipart/file1.txt +0 -1
- data/test/multipart/filename_and_modification_param +0 -7
- data/test/multipart/filename_and_no_name +0 -6
- data/test/multipart/filename_with_encoded_words +0 -7
- data/test/multipart/filename_with_escaped_quotes +0 -6
- data/test/multipart/filename_with_escaped_quotes_and_modification_param +0 -7
- data/test/multipart/filename_with_null_byte +0 -7
- data/test/multipart/filename_with_percent_escaped_quotes +0 -6
- data/test/multipart/filename_with_single_quote +0 -7
- data/test/multipart/filename_with_unescaped_percentages +0 -6
- data/test/multipart/filename_with_unescaped_percentages2 +0 -6
- data/test/multipart/filename_with_unescaped_percentages3 +0 -6
- data/test/multipart/filename_with_unescaped_quotes +0 -6
- data/test/multipart/ie +0 -6
- data/test/multipart/invalid_character +0 -6
- data/test/multipart/mixed_files +0 -21
- data/test/multipart/nested +0 -10
- data/test/multipart/none +0 -9
- data/test/multipart/quoted +0 -15
- data/test/multipart/rack-logo.png +0 -0
- data/test/multipart/semicolon +0 -6
- data/test/multipart/text +0 -15
- data/test/multipart/three_files_three_fields +0 -31
- data/test/multipart/unity3d_wwwform +0 -11
- data/test/multipart/webkit +0 -32
- data/test/rackup/config.ru +0 -31
- data/test/registering_handler/rack/handler/registering_myself.rb +0 -8
- data/test/spec_auth_basic.rb +0 -89
- data/test/spec_auth_digest.rb +0 -260
- data/test/spec_body_proxy.rb +0 -85
- data/test/spec_builder.rb +0 -233
- data/test/spec_cascade.rb +0 -63
- data/test/spec_cgi.rb +0 -84
- data/test/spec_chunked.rb +0 -103
- data/test/spec_common_logger.rb +0 -95
- data/test/spec_conditional_get.rb +0 -103
- data/test/spec_config.rb +0 -23
- data/test/spec_content_length.rb +0 -86
- data/test/spec_content_type.rb +0 -46
- data/test/spec_deflater.rb +0 -375
- data/test/spec_directory.rb +0 -148
- data/test/spec_etag.rb +0 -108
- data/test/spec_events.rb +0 -133
- data/test/spec_fastcgi.rb +0 -85
- data/test/spec_file.rb +0 -264
- data/test/spec_handler.rb +0 -57
- data/test/spec_head.rb +0 -46
- data/test/spec_lint.rb +0 -515
- data/test/spec_lobster.rb +0 -59
- data/test/spec_lock.rb +0 -204
- data/test/spec_logger.rb +0 -24
- data/test/spec_media_type.rb +0 -42
- data/test/spec_method_override.rb +0 -96
- data/test/spec_mime.rb +0 -51
- data/test/spec_mock.rb +0 -359
- data/test/spec_multipart.rb +0 -722
- data/test/spec_null_logger.rb +0 -21
- data/test/spec_recursive.rb +0 -75
- data/test/spec_request.rb +0 -1393
- data/test/spec_response.rb +0 -510
- data/test/spec_rewindable_input.rb +0 -128
- data/test/spec_runtime.rb +0 -50
- data/test/spec_sendfile.rb +0 -125
- data/test/spec_server.rb +0 -193
- data/test/spec_session_abstract_id.rb +0 -31
- data/test/spec_session_abstract_session_hash.rb +0 -45
- data/test/spec_session_cookie.rb +0 -442
- data/test/spec_session_memcache.rb +0 -320
- data/test/spec_session_pool.rb +0 -210
- data/test/spec_show_exceptions.rb +0 -80
- data/test/spec_show_status.rb +0 -104
- data/test/spec_static.rb +0 -184
- data/test/spec_tempfile_reaper.rb +0 -64
- data/test/spec_thin.rb +0 -96
- data/test/spec_urlmap.rb +0 -237
- data/test/spec_utils.rb +0 -742
- data/test/spec_version.rb +0 -11
- data/test/spec_webrick.rb +0 -206
- data/test/static/another/index.html +0 -1
- data/test/static/foo.html +0 -1
- data/test/static/index.html +0 -1
- data/test/testrequest.rb +0 -78
- data/test/unregistered_handler/rack/handler/unregistered.rb +0 -7
- data/test/unregistered_handler/rack/handler/unregistered_long_one.rb +0 -7
data/lib/rack/utils.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
# -*- encoding: binary -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
require 'uri'
|
3
5
|
require 'fileutils'
|
4
6
|
require 'set'
|
@@ -6,11 +8,15 @@ require 'tempfile'
|
|
6
8
|
require 'rack/query_parser'
|
7
9
|
require 'time'
|
8
10
|
|
11
|
+
require_relative 'core_ext/regexp'
|
12
|
+
|
9
13
|
module Rack
|
10
14
|
# Rack::Utils contains a grab-bag of useful methods for writing web
|
11
15
|
# applications adopted from all kinds of Ruby libraries.
|
12
16
|
|
13
17
|
module Utils
|
18
|
+
using ::Rack::RegexpExtensions
|
19
|
+
|
14
20
|
ParameterTypeError = QueryParser::ParameterTypeError
|
15
21
|
InvalidParameterError = QueryParser::InvalidParameterError
|
16
22
|
DEFAULT_SEP = QueryParser::DEFAULT_SEP
|
@@ -118,7 +124,7 @@ module Rack
|
|
118
124
|
when Hash
|
119
125
|
value.map { |k, v|
|
120
126
|
build_nested_query(v, prefix ? "#{prefix}[#{escape(k)}]" : escape(k))
|
121
|
-
}.
|
127
|
+
}.delete_if(&:empty?).join('&')
|
122
128
|
when nil
|
123
129
|
prefix
|
124
130
|
else
|
@@ -132,7 +138,7 @@ module Rack
|
|
132
138
|
q_value_header.to_s.split(/\s*,\s*/).map do |part|
|
133
139
|
value, parameters = part.split(/\s*;\s*/, 2)
|
134
140
|
quality = 1.0
|
135
|
-
if md = /\Aq=([\d.]+)/.match(parameters)
|
141
|
+
if parameters && (md = /\Aq=([\d.]+)/.match(parameters))
|
136
142
|
quality = md[1].to_f
|
137
143
|
end
|
138
144
|
[value, quality]
|
@@ -175,27 +181,26 @@ module Rack
|
|
175
181
|
# http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
|
176
182
|
|
177
183
|
expanded_accept_encoding =
|
178
|
-
accept_encoding.
|
184
|
+
accept_encoding.each_with_object([]) do |(m, q), list|
|
179
185
|
if m == "*"
|
180
|
-
(available_encodings - accept_encoding.map
|
186
|
+
(available_encodings - accept_encoding.map(&:first))
|
187
|
+
.each { |m2| list << [m2, q] }
|
181
188
|
else
|
182
|
-
[
|
189
|
+
list << [m, q]
|
183
190
|
end
|
184
|
-
|
185
|
-
mem + list
|
186
|
-
}
|
191
|
+
end
|
187
192
|
|
188
|
-
encoding_candidates = expanded_accept_encoding.sort_by { |_, q| -q }.map
|
193
|
+
encoding_candidates = expanded_accept_encoding.sort_by { |_, q| -q }.map!(&:first)
|
189
194
|
|
190
195
|
unless encoding_candidates.include?("identity")
|
191
196
|
encoding_candidates.push("identity")
|
192
197
|
end
|
193
198
|
|
194
|
-
expanded_accept_encoding.each
|
199
|
+
expanded_accept_encoding.each do |m, q|
|
195
200
|
encoding_candidates.delete(m) if q == 0.0
|
196
|
-
|
201
|
+
end
|
197
202
|
|
198
|
-
|
203
|
+
(encoding_candidates & available_encodings)[0]
|
199
204
|
end
|
200
205
|
module_function :select_best_encoding
|
201
206
|
|
@@ -211,7 +216,7 @@ module Rack
|
|
211
216
|
# precede those with less specific. Ordering with respect to other
|
212
217
|
# attributes (e.g., Domain) is unspecified.
|
213
218
|
cookies = parse_query(header, ';,') { |s| unescape(s) rescue s }
|
214
|
-
cookies.each_with_object({}) { |(k,v), hash| hash[k] = Array === v ? v.first : v }
|
219
|
+
cookies.each_with_object({}) { |(k, v), hash| hash[k] = Array === v ? v.first : v }
|
215
220
|
end
|
216
221
|
module_function :parse_cookies_header
|
217
222
|
|
@@ -221,41 +226,19 @@ module Rack
|
|
221
226
|
domain = "; domain=#{value[:domain]}" if value[:domain]
|
222
227
|
path = "; path=#{value[:path]}" if value[:path]
|
223
228
|
max_age = "; max-age=#{value[:max_age]}" if value[:max_age]
|
224
|
-
|
225
|
-
# only are there contradicting RFCs and examples within RFC text, but
|
226
|
-
# there are also numerous conflicting names of fields and partially
|
227
|
-
# cross-applicable specifications.
|
228
|
-
#
|
229
|
-
# These are best described in RFC 2616 3.3.1. This RFC text also
|
230
|
-
# specifies that RFC 822 as updated by RFC 1123 is preferred. That is a
|
231
|
-
# fixed length format with space-date delimited fields.
|
232
|
-
#
|
233
|
-
# See also RFC 1123 section 5.2.14.
|
234
|
-
#
|
235
|
-
# RFC 6265 also specifies "sane-cookie-date" as RFC 1123 date, defined
|
236
|
-
# in RFC 2616 3.3.1. RFC 6265 also gives examples that clearly denote
|
237
|
-
# the space delimited format. These formats are compliant with RFC 2822.
|
238
|
-
#
|
239
|
-
# For reference, all involved RFCs are:
|
240
|
-
# RFC 822
|
241
|
-
# RFC 1123
|
242
|
-
# RFC 2109
|
243
|
-
# RFC 2616
|
244
|
-
# RFC 2822
|
245
|
-
# RFC 2965
|
246
|
-
# RFC 6265
|
247
|
-
expires = "; expires=" +
|
248
|
-
rfc2822(value[:expires].clone.gmtime) if value[:expires]
|
229
|
+
expires = "; expires=#{value[:expires].httpdate}" if value[:expires]
|
249
230
|
secure = "; secure" if value[:secure]
|
250
231
|
httponly = "; HttpOnly" if (value.key?(:httponly) ? value[:httponly] : value[:http_only])
|
251
232
|
same_site =
|
252
233
|
case value[:same_site]
|
253
234
|
when false, nil
|
254
235
|
nil
|
236
|
+
when :none, 'None', :None
|
237
|
+
'; SameSite=None'
|
255
238
|
when :lax, 'Lax', :Lax
|
256
|
-
'; SameSite=Lax'
|
239
|
+
'; SameSite=Lax'
|
257
240
|
when true, :strict, 'Strict', :Strict
|
258
|
-
'; SameSite=Strict'
|
241
|
+
'; SameSite=Strict'
|
259
242
|
else
|
260
243
|
raise ArgumentError, "Invalid SameSite value: #{value[:same_site].inspect}"
|
261
244
|
end
|
@@ -295,15 +278,15 @@ module Rack
|
|
295
278
|
cookies = header
|
296
279
|
end
|
297
280
|
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
}
|
281
|
+
regexp = if value[:domain]
|
282
|
+
/\A#{escape(key)}=.*domain=#{value[:domain]}/
|
283
|
+
elsif value[:path]
|
284
|
+
/\A#{escape(key)}=.*path=#{value[:path]}/
|
285
|
+
else
|
286
|
+
/\A#{escape(key)}=/
|
287
|
+
end
|
288
|
+
|
289
|
+
cookies.reject! { |cookie| regexp.match? cookie }
|
307
290
|
|
308
291
|
cookies.join("\n")
|
309
292
|
end
|
@@ -321,9 +304,9 @@ module Rack
|
|
321
304
|
new_header = make_delete_cookie_header(header, key, value)
|
322
305
|
|
323
306
|
add_cookie_to_header(new_header, key,
|
324
|
-
{:
|
325
|
-
:
|
326
|
-
:
|
307
|
+
{ value: '', path: nil, domain: nil,
|
308
|
+
max_age: '0',
|
309
|
+
expires: Time.at(0) }.merge(value))
|
327
310
|
|
328
311
|
end
|
329
312
|
module_function :add_remove_cookie_to_header
|
@@ -364,7 +347,7 @@ module Rack
|
|
364
347
|
ranges = []
|
365
348
|
$1.split(/,\s*/).each do |range_spec|
|
366
349
|
return nil unless range_spec =~ /(\d*)-(\d*)/
|
367
|
-
r0,r1 = $1, $2
|
350
|
+
r0, r1 = $1, $2
|
368
351
|
if r0.empty?
|
369
352
|
return nil if r1.empty?
|
370
353
|
# suffix-byte-range-spec, represents trailing suffix of file
|
@@ -378,7 +361,7 @@ module Rack
|
|
378
361
|
else
|
379
362
|
r1 = r1.to_i
|
380
363
|
return nil if r1 < r0 # backwards range is syntactically invalid
|
381
|
-
r1 = size-1 if r1 >= size
|
364
|
+
r1 = size - 1 if r1 >= size
|
382
365
|
end
|
383
366
|
end
|
384
367
|
ranges << (r0..r1) if r0 <= r1
|
@@ -399,7 +382,7 @@ module Rack
|
|
399
382
|
l = a.unpack("C*")
|
400
383
|
|
401
384
|
r, i = 0, -1
|
402
|
-
b.each_byte { |v| r |= v ^ l[i+=1] }
|
385
|
+
b.each_byte { |v| r |= v ^ l[i += 1] }
|
403
386
|
r == 0
|
404
387
|
end
|
405
388
|
module_function :secure_compare
|
@@ -425,19 +408,17 @@ module Rack
|
|
425
408
|
self.class.new(@for, app)
|
426
409
|
end
|
427
410
|
|
428
|
-
def context(env, app
|
411
|
+
def context(env, app = @app)
|
429
412
|
recontext(app).call(env)
|
430
413
|
end
|
431
414
|
end
|
432
415
|
|
433
416
|
# A case-insensitive Hash that preserves the original case of a
|
434
417
|
# header when set.
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
def initialize(hash={})
|
418
|
+
#
|
419
|
+
# @api private
|
420
|
+
class HeaderHash < Hash # :nodoc:
|
421
|
+
def initialize(hash = {})
|
441
422
|
super()
|
442
423
|
@names = {}
|
443
424
|
hash.each { |k, v| self[k] = v }
|
@@ -457,7 +438,7 @@ module Rack
|
|
457
438
|
|
458
439
|
def to_hash
|
459
440
|
hash = {}
|
460
|
-
each { |k,v| hash[k] = v }
|
441
|
+
each { |k, v| hash[k] = v }
|
461
442
|
hash
|
462
443
|
end
|
463
444
|
|
@@ -510,13 +491,14 @@ module Rack
|
|
510
491
|
|
511
492
|
# Every standard HTTP code mapped to the appropriate message.
|
512
493
|
# Generated with:
|
513
|
-
#
|
514
|
-
#
|
515
|
-
#
|
494
|
+
# curl -s https://www.iana.org/assignments/http-status-codes/http-status-codes-1.csv | \
|
495
|
+
# ruby -ne 'm = /^(\d{3}),(?!Unassigned|\(Unused\))([^,]+)/.match($_) and \
|
496
|
+
# puts "#{m[1]} => \x27#{m[2].strip}\x27,"'
|
516
497
|
HTTP_STATUS_CODES = {
|
517
498
|
100 => 'Continue',
|
518
499
|
101 => 'Switching Protocols',
|
519
500
|
102 => 'Processing',
|
501
|
+
103 => 'Early Hints',
|
520
502
|
200 => 'OK',
|
521
503
|
201 => 'Created',
|
522
504
|
202 => 'Accepted',
|
@@ -533,6 +515,7 @@ module Rack
|
|
533
515
|
303 => 'See Other',
|
534
516
|
304 => 'Not Modified',
|
535
517
|
305 => 'Use Proxy',
|
518
|
+
306 => '(Unused)',
|
536
519
|
307 => 'Temporary Redirect',
|
537
520
|
308 => 'Permanent Redirect',
|
538
521
|
400 => 'Bad Request',
|
@@ -557,6 +540,7 @@ module Rack
|
|
557
540
|
422 => 'Unprocessable Entity',
|
558
541
|
423 => 'Locked',
|
559
542
|
424 => 'Failed Dependency',
|
543
|
+
425 => 'Too Early',
|
560
544
|
426 => 'Upgrade Required',
|
561
545
|
428 => 'Precondition Required',
|
562
546
|
429 => 'Too Many Requests',
|
@@ -571,12 +555,13 @@ module Rack
|
|
571
555
|
506 => 'Variant Also Negotiates',
|
572
556
|
507 => 'Insufficient Storage',
|
573
557
|
508 => 'Loop Detected',
|
558
|
+
509 => 'Bandwidth Limit Exceeded',
|
574
559
|
510 => 'Not Extended',
|
575
560
|
511 => 'Network Authentication Required'
|
576
561
|
}
|
577
562
|
|
578
563
|
# Responses with HTTP status codes that should not have an entity body
|
579
|
-
STATUS_WITH_NO_ENTITY_BODY =
|
564
|
+
STATUS_WITH_NO_ENTITY_BODY = Hash[((100..199).to_a << 204 << 304).product([true])]
|
580
565
|
|
581
566
|
SYMBOL_TO_STATUS_CODE = Hash[*HTTP_STATUS_CODES.map { |code, message|
|
582
567
|
[message.downcase.gsub(/\s|-|'/, '_').to_sym, code]
|
@@ -584,7 +569,7 @@ module Rack
|
|
584
569
|
|
585
570
|
def status_code(status)
|
586
571
|
if status.is_a?(Symbol)
|
587
|
-
SYMBOL_TO_STATUS_CODE
|
572
|
+
SYMBOL_TO_STATUS_CODE.fetch(status) { raise ArgumentError, "Unrecognized status code #{status.inspect}" }
|
588
573
|
else
|
589
574
|
status.to_i
|
590
575
|
end
|
@@ -605,11 +590,11 @@ module Rack
|
|
605
590
|
|
606
591
|
clean.unshift '/' if parts.empty? || parts.first.empty?
|
607
592
|
|
608
|
-
::File.join
|
593
|
+
::File.join clean
|
609
594
|
end
|
610
595
|
module_function :clean_path_info
|
611
596
|
|
612
|
-
NULL_BYTE = "\0"
|
597
|
+
NULL_BYTE = "\0"
|
613
598
|
|
614
599
|
def valid_path?(path)
|
615
600
|
path.valid_encoding? && !path.include?(NULL_BYTE)
|
data/rack.gemspec
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
Gem::Specification.new do |s|
|
2
|
-
s.name
|
4
|
+
s.name = "rack"
|
3
5
|
s.version = File.read('lib/rack.rb')[/RELEASE += +([\"\'])([\d][\w\.]+)\1/, 2]
|
4
6
|
s.platform = Gem::Platform::RUBY
|
5
7
|
s.summary = "a modular Ruby webserver interface"
|
@@ -15,20 +17,28 @@ middleware) into a single method call.
|
|
15
17
|
Also see https://rack.github.io/.
|
16
18
|
EOF
|
17
19
|
|
18
|
-
s.files = Dir['{bin/*,contrib/*,example/*,lib
|
19
|
-
%w(
|
20
|
+
s.files = Dir['{bin/*,contrib/*,example/*,lib/**/*}'] +
|
21
|
+
%w(MIT-LICENSE rack.gemspec Rakefile README.rdoc SPEC)
|
20
22
|
s.bindir = 'bin'
|
21
|
-
s.executables
|
22
|
-
s.require_path
|
23
|
-
s.extra_rdoc_files = ['README.rdoc', '
|
24
|
-
s.test_files = Dir['test/spec_*.rb']
|
23
|
+
s.executables << 'rackup'
|
24
|
+
s.require_path = 'lib'
|
25
|
+
s.extra_rdoc_files = ['README.rdoc', 'CHANGELOG.md']
|
25
26
|
|
26
|
-
s.author = '
|
27
|
-
s.email = '
|
27
|
+
s.author = 'Leah Neukirchen'
|
28
|
+
s.email = 'leah@vuxu.org'
|
28
29
|
s.homepage = 'https://rack.github.io/'
|
29
30
|
s.required_ruby_version = '>= 2.2.2'
|
31
|
+
s.metadata = {
|
32
|
+
"bug_tracker_uri" => "https://github.com/rack/rack/issues",
|
33
|
+
"changelog_uri" => "https://github.com/rack/rack/blob/master/CHANGELOG.md",
|
34
|
+
"documentation_uri" => "https://rubydoc.info/github/rack/rack",
|
35
|
+
"homepage_uri" => "https://rack.github.io",
|
36
|
+
"mailing_list_uri" => "https://groups.google.com/forum/#!forum/rack-devel",
|
37
|
+
"source_code_uri" => "https://github.com/rack/rack"
|
38
|
+
}
|
30
39
|
|
31
40
|
s.add_development_dependency 'minitest', "~> 5.0"
|
32
41
|
s.add_development_dependency 'minitest-sprint'
|
42
|
+
s.add_development_dependency 'minitest-global_expectations'
|
33
43
|
s.add_development_dependency 'rake'
|
34
44
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Leah Neukirchen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest-global_expectations
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rake
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -60,16 +74,16 @@ description: |
|
|
60
74
|
middleware) into a single method call.
|
61
75
|
|
62
76
|
Also see https://rack.github.io/.
|
63
|
-
email:
|
77
|
+
email: leah@vuxu.org
|
64
78
|
executables:
|
65
79
|
- rackup
|
66
80
|
extensions: []
|
67
81
|
extra_rdoc_files:
|
68
82
|
- README.rdoc
|
69
|
-
-
|
83
|
+
- CHANGELOG.md
|
70
84
|
files:
|
71
|
-
-
|
72
|
-
-
|
85
|
+
- CHANGELOG.md
|
86
|
+
- MIT-LICENSE
|
73
87
|
- README.rdoc
|
74
88
|
- Rakefile
|
75
89
|
- SPEC
|
@@ -98,11 +112,13 @@ files:
|
|
98
112
|
- lib/rack/config.rb
|
99
113
|
- lib/rack/content_length.rb
|
100
114
|
- lib/rack/content_type.rb
|
115
|
+
- lib/rack/core_ext/regexp.rb
|
101
116
|
- lib/rack/deflater.rb
|
102
117
|
- lib/rack/directory.rb
|
103
118
|
- lib/rack/etag.rb
|
104
119
|
- lib/rack/events.rb
|
105
120
|
- lib/rack/file.rb
|
121
|
+
- lib/rack/files.rb
|
106
122
|
- lib/rack/handler.rb
|
107
123
|
- lib/rack/handler/cgi.rb
|
108
124
|
- lib/rack/handler/fastcgi.rb
|
@@ -144,121 +160,16 @@ files:
|
|
144
160
|
- lib/rack/urlmap.rb
|
145
161
|
- lib/rack/utils.rb
|
146
162
|
- rack.gemspec
|
147
|
-
- test/builder/an_underscore_app.rb
|
148
|
-
- test/builder/anything.rb
|
149
|
-
- test/builder/comment.ru
|
150
|
-
- test/builder/end.ru
|
151
|
-
- test/builder/line.ru
|
152
|
-
- test/builder/options.ru
|
153
|
-
- test/cgi/assets/folder/test.js
|
154
|
-
- test/cgi/assets/fonts/font.eot
|
155
|
-
- test/cgi/assets/images/image.png
|
156
|
-
- test/cgi/assets/index.html
|
157
|
-
- test/cgi/assets/javascripts/app.js
|
158
|
-
- test/cgi/assets/stylesheets/app.css
|
159
|
-
- test/cgi/lighttpd.conf
|
160
|
-
- test/cgi/rackup_stub.rb
|
161
|
-
- test/cgi/sample_rackup.ru
|
162
|
-
- test/cgi/test
|
163
|
-
- test/cgi/test+directory/test+file
|
164
|
-
- test/cgi/test.fcgi
|
165
|
-
- test/cgi/test.gz
|
166
|
-
- test/cgi/test.ru
|
167
|
-
- test/gemloader.rb
|
168
|
-
- test/helper.rb
|
169
|
-
- test/multipart/bad_robots
|
170
|
-
- test/multipart/binary
|
171
|
-
- test/multipart/content_type_and_no_filename
|
172
|
-
- test/multipart/empty
|
173
|
-
- test/multipart/fail_16384_nofile
|
174
|
-
- test/multipart/file1.txt
|
175
|
-
- test/multipart/filename_and_modification_param
|
176
|
-
- test/multipart/filename_and_no_name
|
177
|
-
- test/multipart/filename_with_encoded_words
|
178
|
-
- test/multipart/filename_with_escaped_quotes
|
179
|
-
- test/multipart/filename_with_escaped_quotes_and_modification_param
|
180
|
-
- test/multipart/filename_with_null_byte
|
181
|
-
- test/multipart/filename_with_percent_escaped_quotes
|
182
|
-
- test/multipart/filename_with_single_quote
|
183
|
-
- test/multipart/filename_with_unescaped_percentages
|
184
|
-
- test/multipart/filename_with_unescaped_percentages2
|
185
|
-
- test/multipart/filename_with_unescaped_percentages3
|
186
|
-
- test/multipart/filename_with_unescaped_quotes
|
187
|
-
- test/multipart/ie
|
188
|
-
- test/multipart/invalid_character
|
189
|
-
- test/multipart/mixed_files
|
190
|
-
- test/multipart/nested
|
191
|
-
- test/multipart/none
|
192
|
-
- test/multipart/quoted
|
193
|
-
- test/multipart/rack-logo.png
|
194
|
-
- test/multipart/semicolon
|
195
|
-
- test/multipart/text
|
196
|
-
- test/multipart/three_files_three_fields
|
197
|
-
- test/multipart/unity3d_wwwform
|
198
|
-
- test/multipart/webkit
|
199
|
-
- test/rackup/config.ru
|
200
|
-
- test/registering_handler/rack/handler/registering_myself.rb
|
201
|
-
- test/spec_auth_basic.rb
|
202
|
-
- test/spec_auth_digest.rb
|
203
|
-
- test/spec_body_proxy.rb
|
204
|
-
- test/spec_builder.rb
|
205
|
-
- test/spec_cascade.rb
|
206
|
-
- test/spec_cgi.rb
|
207
|
-
- test/spec_chunked.rb
|
208
|
-
- test/spec_common_logger.rb
|
209
|
-
- test/spec_conditional_get.rb
|
210
|
-
- test/spec_config.rb
|
211
|
-
- test/spec_content_length.rb
|
212
|
-
- test/spec_content_type.rb
|
213
|
-
- test/spec_deflater.rb
|
214
|
-
- test/spec_directory.rb
|
215
|
-
- test/spec_etag.rb
|
216
|
-
- test/spec_events.rb
|
217
|
-
- test/spec_fastcgi.rb
|
218
|
-
- test/spec_file.rb
|
219
|
-
- test/spec_handler.rb
|
220
|
-
- test/spec_head.rb
|
221
|
-
- test/spec_lint.rb
|
222
|
-
- test/spec_lobster.rb
|
223
|
-
- test/spec_lock.rb
|
224
|
-
- test/spec_logger.rb
|
225
|
-
- test/spec_media_type.rb
|
226
|
-
- test/spec_method_override.rb
|
227
|
-
- test/spec_mime.rb
|
228
|
-
- test/spec_mock.rb
|
229
|
-
- test/spec_multipart.rb
|
230
|
-
- test/spec_null_logger.rb
|
231
|
-
- test/spec_recursive.rb
|
232
|
-
- test/spec_request.rb
|
233
|
-
- test/spec_response.rb
|
234
|
-
- test/spec_rewindable_input.rb
|
235
|
-
- test/spec_runtime.rb
|
236
|
-
- test/spec_sendfile.rb
|
237
|
-
- test/spec_server.rb
|
238
|
-
- test/spec_session_abstract_id.rb
|
239
|
-
- test/spec_session_abstract_session_hash.rb
|
240
|
-
- test/spec_session_cookie.rb
|
241
|
-
- test/spec_session_memcache.rb
|
242
|
-
- test/spec_session_pool.rb
|
243
|
-
- test/spec_show_exceptions.rb
|
244
|
-
- test/spec_show_status.rb
|
245
|
-
- test/spec_static.rb
|
246
|
-
- test/spec_tempfile_reaper.rb
|
247
|
-
- test/spec_thin.rb
|
248
|
-
- test/spec_urlmap.rb
|
249
|
-
- test/spec_utils.rb
|
250
|
-
- test/spec_version.rb
|
251
|
-
- test/spec_webrick.rb
|
252
|
-
- test/static/another/index.html
|
253
|
-
- test/static/foo.html
|
254
|
-
- test/static/index.html
|
255
|
-
- test/testrequest.rb
|
256
|
-
- test/unregistered_handler/rack/handler/unregistered.rb
|
257
|
-
- test/unregistered_handler/rack/handler/unregistered_long_one.rb
|
258
163
|
homepage: https://rack.github.io/
|
259
164
|
licenses:
|
260
165
|
- MIT
|
261
|
-
metadata:
|
166
|
+
metadata:
|
167
|
+
bug_tracker_uri: https://github.com/rack/rack/issues
|
168
|
+
changelog_uri: https://github.com/rack/rack/blob/master/CHANGELOG.md
|
169
|
+
documentation_uri: https://rubydoc.info/github/rack/rack
|
170
|
+
homepage_uri: https://rack.github.io
|
171
|
+
mailing_list_uri: https://groups.google.com/forum/#!forum/rack-devel
|
172
|
+
source_code_uri: https://github.com/rack/rack
|
262
173
|
post_install_message:
|
263
174
|
rdoc_options: []
|
264
175
|
require_paths:
|
@@ -274,60 +185,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
274
185
|
- !ruby/object:Gem::Version
|
275
186
|
version: '0'
|
276
187
|
requirements: []
|
277
|
-
|
278
|
-
rubygems_version: 2.7.3
|
188
|
+
rubygems_version: 3.1.1
|
279
189
|
signing_key:
|
280
190
|
specification_version: 4
|
281
191
|
summary: a modular Ruby webserver interface
|
282
|
-
test_files:
|
283
|
-
- test/spec_multipart.rb
|
284
|
-
- test/spec_deflater.rb
|
285
|
-
- test/spec_static.rb
|
286
|
-
- test/spec_session_cookie.rb
|
287
|
-
- test/spec_session_pool.rb
|
288
|
-
- test/spec_etag.rb
|
289
|
-
- test/spec_version.rb
|
290
|
-
- test/spec_handler.rb
|
291
|
-
- test/spec_thin.rb
|
292
|
-
- test/spec_session_abstract_id.rb
|
293
|
-
- test/spec_mime.rb
|
294
|
-
- test/spec_recursive.rb
|
295
|
-
- test/spec_null_logger.rb
|
296
|
-
- test/spec_media_type.rb
|
297
|
-
- test/spec_cgi.rb
|
298
|
-
- test/spec_method_override.rb
|
299
|
-
- test/spec_content_type.rb
|
300
|
-
- test/spec_session_abstract_session_hash.rb
|
301
|
-
- test/spec_request.rb
|
302
|
-
- test/spec_chunked.rb
|
303
|
-
- test/spec_show_exceptions.rb
|
304
|
-
- test/spec_runtime.rb
|
305
|
-
- test/spec_fastcgi.rb
|
306
|
-
- test/spec_common_logger.rb
|
307
|
-
- test/spec_builder.rb
|
308
|
-
- test/spec_config.rb
|
309
|
-
- test/spec_utils.rb
|
310
|
-
- test/spec_sendfile.rb
|
311
|
-
- test/spec_lobster.rb
|
312
|
-
- test/spec_lint.rb
|
313
|
-
- test/spec_conditional_get.rb
|
314
|
-
- test/spec_tempfile_reaper.rb
|
315
|
-
- test/spec_mock.rb
|
316
|
-
- test/spec_server.rb
|
317
|
-
- test/spec_directory.rb
|
318
|
-
- test/spec_webrick.rb
|
319
|
-
- test/spec_response.rb
|
320
|
-
- test/spec_file.rb
|
321
|
-
- test/spec_show_status.rb
|
322
|
-
- test/spec_body_proxy.rb
|
323
|
-
- test/spec_logger.rb
|
324
|
-
- test/spec_auth_digest.rb
|
325
|
-
- test/spec_urlmap.rb
|
326
|
-
- test/spec_events.rb
|
327
|
-
- test/spec_cascade.rb
|
328
|
-
- test/spec_auth_basic.rb
|
329
|
-
- test/spec_head.rb
|
330
|
-
- test/spec_lock.rb
|
331
|
-
- test/spec_rewindable_input.rb
|
332
|
-
- test/spec_session_memcache.rb
|
333
|
-
- test/spec_content_length.rb
|
192
|
+
test_files: []
|