rack 2.1.4.2 → 2.2.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/CHANGELOG.md +600 -13
- data/CONTRIBUTING.md +136 -0
- data/README.rdoc +83 -39
- data/Rakefile +14 -7
- data/{SPEC → SPEC.rdoc} +35 -6
- data/lib/rack/auth/abstract/request.rb +0 -2
- data/lib/rack/auth/basic.rb +3 -3
- data/lib/rack/auth/digest/md5.rb +4 -4
- data/lib/rack/auth/digest/request.rb +3 -3
- data/lib/rack/body_proxy.rb +13 -9
- data/lib/rack/builder.rb +77 -8
- data/lib/rack/cascade.rb +23 -8
- data/lib/rack/chunked.rb +48 -23
- data/lib/rack/common_logger.rb +25 -21
- data/lib/rack/conditional_get.rb +18 -16
- data/lib/rack/content_length.rb +6 -7
- data/lib/rack/content_type.rb +3 -4
- data/lib/rack/deflater.rb +45 -35
- data/lib/rack/directory.rb +77 -60
- data/lib/rack/etag.rb +2 -3
- data/lib/rack/events.rb +15 -18
- data/lib/rack/file.rb +1 -1
- data/lib/rack/files.rb +96 -56
- data/lib/rack/handler/cgi.rb +1 -4
- data/lib/rack/handler/fastcgi.rb +1 -3
- data/lib/rack/handler/lsws.rb +1 -3
- data/lib/rack/handler/scgi.rb +1 -3
- data/lib/rack/handler/thin.rb +15 -11
- data/lib/rack/handler/webrick.rb +12 -5
- data/lib/rack/head.rb +0 -2
- data/lib/rack/lint.rb +58 -15
- data/lib/rack/lobster.rb +3 -5
- data/lib/rack/lock.rb +0 -1
- data/lib/rack/mock.rb +22 -4
- data/lib/rack/multipart/generator.rb +11 -6
- data/lib/rack/multipart/parser.rb +8 -17
- data/lib/rack/multipart/uploaded_file.rb +13 -7
- data/lib/rack/multipart.rb +5 -4
- data/lib/rack/query_parser.rb +7 -8
- data/lib/rack/recursive.rb +1 -1
- data/lib/rack/reloader.rb +1 -3
- data/lib/rack/request.rb +172 -76
- data/lib/rack/response.rb +62 -19
- data/lib/rack/rewindable_input.rb +0 -1
- data/lib/rack/runtime.rb +3 -3
- data/lib/rack/sendfile.rb +0 -3
- data/lib/rack/server.rb +9 -8
- data/lib/rack/session/abstract/id.rb +20 -18
- data/lib/rack/session/cookie.rb +2 -3
- data/lib/rack/session/pool.rb +1 -1
- data/lib/rack/show_exceptions.rb +2 -4
- data/lib/rack/show_status.rb +1 -3
- data/lib/rack/static.rb +13 -6
- data/lib/rack/tempfile_reaper.rb +0 -2
- data/lib/rack/urlmap.rb +1 -4
- data/lib/rack/utils.rb +64 -65
- data/lib/rack/version.rb +29 -0
- data/lib/rack.rb +7 -16
- data/rack.gemspec +31 -29
- metadata +14 -15
data/lib/rack/utils.rb
CHANGED
@@ -5,17 +5,16 @@ require 'uri'
|
|
5
5
|
require 'fileutils'
|
6
6
|
require 'set'
|
7
7
|
require 'tempfile'
|
8
|
-
require 'rack/query_parser'
|
9
8
|
require 'time'
|
10
9
|
|
11
|
-
require_relative '
|
10
|
+
require_relative 'query_parser'
|
12
11
|
|
13
12
|
module Rack
|
14
13
|
# Rack::Utils contains a grab-bag of useful methods for writing web
|
15
14
|
# applications adopted from all kinds of Ruby libraries.
|
16
15
|
|
17
16
|
module Utils
|
18
|
-
using ::Rack::RegexpExtensions
|
17
|
+
(require_relative 'core_ext/regexp'; using ::Rack::RegexpExtensions) if RUBY_VERSION < '2.4'
|
19
18
|
|
20
19
|
ParameterTypeError = QueryParser::ParameterTypeError
|
21
20
|
InvalidParameterError = QueryParser::InvalidParameterError
|
@@ -30,33 +29,30 @@ module Rack
|
|
30
29
|
# This helps prevent a rogue client from flooding a Request.
|
31
30
|
self.default_query_parser = QueryParser.make_default(65536, 100)
|
32
31
|
|
32
|
+
module_function
|
33
|
+
|
33
34
|
# URI escapes. (CGI style space to +)
|
34
35
|
def escape(s)
|
35
36
|
URI.encode_www_form_component(s)
|
36
37
|
end
|
37
|
-
module_function :escape
|
38
38
|
|
39
39
|
# Like URI escaping, but with %20 instead of +. Strictly speaking this is
|
40
40
|
# true URI escaping.
|
41
41
|
def escape_path(s)
|
42
42
|
::URI::DEFAULT_PARSER.escape s
|
43
43
|
end
|
44
|
-
module_function :escape_path
|
45
44
|
|
46
45
|
# Unescapes the **path** component of a URI. See Rack::Utils.unescape for
|
47
46
|
# unescaping query parameters or form components.
|
48
47
|
def unescape_path(s)
|
49
48
|
::URI::DEFAULT_PARSER.unescape s
|
50
49
|
end
|
51
|
-
module_function :unescape_path
|
52
|
-
|
53
50
|
|
54
51
|
# Unescapes a URI escaped string with +encoding+. +encoding+ will be the
|
55
52
|
# target encoding of the string returned, and it defaults to UTF-8
|
56
53
|
def unescape(s, encoding = Encoding::UTF_8)
|
57
54
|
URI.decode_www_form_component(s, encoding)
|
58
55
|
end
|
59
|
-
module_function :unescape
|
60
56
|
|
61
57
|
class << self
|
62
58
|
attr_accessor :multipart_part_limit
|
@@ -88,21 +84,20 @@ module Rack
|
|
88
84
|
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
89
85
|
end
|
90
86
|
else
|
87
|
+
# :nocov:
|
91
88
|
def clock_time
|
92
89
|
Time.now.to_f
|
93
90
|
end
|
91
|
+
# :nocov:
|
94
92
|
end
|
95
|
-
module_function :clock_time
|
96
93
|
|
97
94
|
def parse_query(qs, d = nil, &unescaper)
|
98
95
|
Rack::Utils.default_query_parser.parse_query(qs, d, &unescaper)
|
99
96
|
end
|
100
|
-
module_function :parse_query
|
101
97
|
|
102
98
|
def parse_nested_query(qs, d = nil)
|
103
99
|
Rack::Utils.default_query_parser.parse_nested_query(qs, d)
|
104
100
|
end
|
105
|
-
module_function :parse_nested_query
|
106
101
|
|
107
102
|
def build_query(params)
|
108
103
|
params.map { |k, v|
|
@@ -113,7 +108,6 @@ module Rack
|
|
113
108
|
end
|
114
109
|
}.join("&")
|
115
110
|
end
|
116
|
-
module_function :build_query
|
117
111
|
|
118
112
|
def build_nested_query(value, prefix = nil)
|
119
113
|
case value
|
@@ -132,7 +126,6 @@ module Rack
|
|
132
126
|
"#{prefix}=#{escape(value)}"
|
133
127
|
end
|
134
128
|
end
|
135
|
-
module_function :build_nested_query
|
136
129
|
|
137
130
|
def q_values(q_value_header)
|
138
131
|
q_value_header.to_s.split(/\s*,\s*/).map do |part|
|
@@ -144,8 +137,11 @@ module Rack
|
|
144
137
|
[value, quality]
|
145
138
|
end
|
146
139
|
end
|
147
|
-
module_function :q_values
|
148
140
|
|
141
|
+
# Return best accept value to use, based on the algorithm
|
142
|
+
# in RFC 2616 Section 14. If there are multiple best
|
143
|
+
# matches (same specificity and quality), the value returned
|
144
|
+
# is arbitrary.
|
149
145
|
def best_q_match(q_value_header, available_mimes)
|
150
146
|
values = q_values(q_value_header)
|
151
147
|
|
@@ -158,7 +154,6 @@ module Rack
|
|
158
154
|
end.last
|
159
155
|
matches && matches.first
|
160
156
|
end
|
161
|
-
module_function :best_q_match
|
162
157
|
|
163
158
|
ESCAPE_HTML = {
|
164
159
|
"&" => "&",
|
@@ -175,22 +170,27 @@ module Rack
|
|
175
170
|
def escape_html(string)
|
176
171
|
string.to_s.gsub(ESCAPE_HTML_PATTERN){|c| ESCAPE_HTML[c] }
|
177
172
|
end
|
178
|
-
module_function :escape_html
|
179
173
|
|
180
174
|
def select_best_encoding(available_encodings, accept_encoding)
|
181
175
|
# http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
|
182
176
|
|
183
|
-
expanded_accept_encoding =
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
177
|
+
expanded_accept_encoding = []
|
178
|
+
|
179
|
+
accept_encoding.each do |m, q|
|
180
|
+
preference = available_encodings.index(m) || available_encodings.size
|
181
|
+
|
182
|
+
if m == "*"
|
183
|
+
(available_encodings - accept_encoding.map(&:first)).each do |m2|
|
184
|
+
expanded_accept_encoding << [m2, q, preference]
|
190
185
|
end
|
186
|
+
else
|
187
|
+
expanded_accept_encoding << [m, q, preference]
|
191
188
|
end
|
189
|
+
end
|
192
190
|
|
193
|
-
encoding_candidates = expanded_accept_encoding
|
191
|
+
encoding_candidates = expanded_accept_encoding
|
192
|
+
.sort_by { |_, q, p| [-q, p] }
|
193
|
+
.map!(&:first)
|
194
194
|
|
195
195
|
unless encoding_candidates.include?("identity")
|
196
196
|
encoding_candidates.push("identity")
|
@@ -202,27 +202,19 @@ module Rack
|
|
202
202
|
|
203
203
|
(encoding_candidates & available_encodings)[0]
|
204
204
|
end
|
205
|
-
module_function :select_best_encoding
|
206
205
|
|
207
206
|
def parse_cookies(env)
|
208
207
|
parse_cookies_header env[HTTP_COOKIE]
|
209
208
|
end
|
210
|
-
module_function :parse_cookies
|
211
209
|
|
212
210
|
def parse_cookies_header(header)
|
213
|
-
# According to RFC
|
214
|
-
#
|
215
|
-
#
|
216
|
-
#
|
217
|
-
|
218
|
-
|
219
|
-
header.split(/[;,] */n).each_with_object({}) do |cookie, cookies|
|
220
|
-
next if cookie.empty?
|
221
|
-
key, value = cookie.split('=', 2)
|
222
|
-
cookies[key] = (unescape(value) rescue value) unless cookies.key?(key)
|
223
|
-
end
|
211
|
+
# According to RFC 6265:
|
212
|
+
# The syntax for cookie headers only supports semicolons
|
213
|
+
# User Agent -> Server ==
|
214
|
+
# Cookie: SID=31d4d96e407aad42; lang=en-US
|
215
|
+
cookies = parse_query(header, ';') { |s| unescape(s) rescue s }
|
216
|
+
cookies.each_with_object({}) { |(k, v), hash| hash[k] = Array === v ? v.first : v }
|
224
217
|
end
|
225
|
-
module_function :parse_cookies_header
|
226
218
|
|
227
219
|
def add_cookie_to_header(header, key, value)
|
228
220
|
case value
|
@@ -264,13 +256,11 @@ module Rack
|
|
264
256
|
raise ArgumentError, "Unrecognized cookie header value. Expected String, Array, or nil, got #{header.inspect}"
|
265
257
|
end
|
266
258
|
end
|
267
|
-
module_function :add_cookie_to_header
|
268
259
|
|
269
260
|
def set_cookie_header!(header, key, value)
|
270
261
|
header[SET_COOKIE] = add_cookie_to_header(header[SET_COOKIE], key, value)
|
271
262
|
nil
|
272
263
|
end
|
273
|
-
module_function :set_cookie_header!
|
274
264
|
|
275
265
|
def make_delete_cookie_header(header, key, value)
|
276
266
|
case header
|
@@ -282,25 +272,30 @@ module Rack
|
|
282
272
|
cookies = header
|
283
273
|
end
|
284
274
|
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
275
|
+
key = escape(key)
|
276
|
+
domain = value[:domain]
|
277
|
+
path = value[:path]
|
278
|
+
regexp = if domain
|
279
|
+
if path
|
280
|
+
/\A#{key}=.*(?:domain=#{domain}(?:;|$).*path=#{path}(?:;|$)|path=#{path}(?:;|$).*domain=#{domain}(?:;|$))/
|
281
|
+
else
|
282
|
+
/\A#{key}=.*domain=#{domain}(?:;|$)/
|
283
|
+
end
|
284
|
+
elsif path
|
285
|
+
/\A#{key}=.*path=#{path}(?:;|$)/
|
289
286
|
else
|
290
|
-
/\A#{
|
287
|
+
/\A#{key}=/
|
291
288
|
end
|
292
289
|
|
293
290
|
cookies.reject! { |cookie| regexp.match? cookie }
|
294
291
|
|
295
292
|
cookies.join("\n")
|
296
293
|
end
|
297
|
-
module_function :make_delete_cookie_header
|
298
294
|
|
299
295
|
def delete_cookie_header!(header, key, value = {})
|
300
296
|
header[SET_COOKIE] = add_remove_cookie_to_header(header[SET_COOKIE], key, value)
|
301
297
|
nil
|
302
298
|
end
|
303
|
-
module_function :delete_cookie_header!
|
304
299
|
|
305
300
|
# Adds a cookie that will *remove* a cookie from the client. Hence the
|
306
301
|
# strange method name.
|
@@ -313,12 +308,10 @@ module Rack
|
|
313
308
|
expires: Time.at(0) }.merge(value))
|
314
309
|
|
315
310
|
end
|
316
|
-
module_function :add_remove_cookie_to_header
|
317
311
|
|
318
312
|
def rfc2822(time)
|
319
313
|
time.rfc2822
|
320
314
|
end
|
321
|
-
module_function :rfc2822
|
322
315
|
|
323
316
|
# Modified version of stdlib time.rb Time#rfc2822 to use '%d-%b-%Y' instead
|
324
317
|
# of '% %b %Y'.
|
@@ -334,7 +327,6 @@ module Rack
|
|
334
327
|
mon = Time::RFC2822_MONTH_NAME[time.mon - 1]
|
335
328
|
time.strftime("#{wday}, %d-#{mon}-%Y %H:%M:%S GMT")
|
336
329
|
end
|
337
|
-
module_function :rfc2109
|
338
330
|
|
339
331
|
# Parses the "Range:" header, if present, into an array of Range objects.
|
340
332
|
# Returns nil if the header is missing or syntactically invalid.
|
@@ -343,25 +335,23 @@ module Rack
|
|
343
335
|
warn "`byte_ranges` is deprecated, please use `get_byte_ranges`" if $VERBOSE
|
344
336
|
get_byte_ranges env['HTTP_RANGE'], size
|
345
337
|
end
|
346
|
-
module_function :byte_ranges
|
347
338
|
|
348
339
|
def get_byte_ranges(http_range, size)
|
349
340
|
# See <http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35>
|
350
341
|
return nil unless http_range && http_range =~ /bytes=([^;]+)/
|
351
342
|
ranges = []
|
352
343
|
$1.split(/,\s*/).each do |range_spec|
|
353
|
-
return nil
|
354
|
-
|
355
|
-
r0
|
356
|
-
|
357
|
-
return nil if r1.nil?
|
344
|
+
return nil unless range_spec =~ /(\d*)-(\d*)/
|
345
|
+
r0, r1 = $1, $2
|
346
|
+
if r0.empty?
|
347
|
+
return nil if r1.empty?
|
358
348
|
# suffix-byte-range-spec, represents trailing suffix of file
|
359
349
|
r0 = size - r1.to_i
|
360
350
|
r0 = 0 if r0 < 0
|
361
351
|
r1 = size - 1
|
362
352
|
else
|
363
353
|
r0 = r0.to_i
|
364
|
-
if r1.
|
354
|
+
if r1.empty?
|
365
355
|
r1 = size - 1
|
366
356
|
else
|
367
357
|
r1 = r1.to_i
|
@@ -373,7 +363,6 @@ module Rack
|
|
373
363
|
end
|
374
364
|
ranges
|
375
365
|
end
|
376
|
-
module_function :get_byte_ranges
|
377
366
|
|
378
367
|
# Constant time string comparison.
|
379
368
|
#
|
@@ -390,7 +379,6 @@ module Rack
|
|
390
379
|
b.each_byte { |v| r |= v ^ l[i += 1] }
|
391
380
|
r == 0
|
392
381
|
end
|
393
|
-
module_function :secure_compare
|
394
382
|
|
395
383
|
# Context allows the use of a compatible middleware at different points
|
396
384
|
# in a request handling stack. A compatible middleware must define
|
@@ -423,6 +411,14 @@ module Rack
|
|
423
411
|
#
|
424
412
|
# @api private
|
425
413
|
class HeaderHash < Hash # :nodoc:
|
414
|
+
def self.[](headers)
|
415
|
+
if headers.is_a?(HeaderHash) && !headers.frozen?
|
416
|
+
return headers
|
417
|
+
else
|
418
|
+
return self.new(headers)
|
419
|
+
end
|
420
|
+
end
|
421
|
+
|
426
422
|
def initialize(hash = {})
|
427
423
|
super()
|
428
424
|
@names = {}
|
@@ -435,6 +431,12 @@ module Rack
|
|
435
431
|
@names = other.names.dup
|
436
432
|
end
|
437
433
|
|
434
|
+
# on clear, we need to clear @names hash
|
435
|
+
def clear
|
436
|
+
super
|
437
|
+
@names.clear
|
438
|
+
end
|
439
|
+
|
438
440
|
def each
|
439
441
|
super do |k, v|
|
440
442
|
yield(k, v.respond_to?(:to_ary) ? v.to_ary.join("\n") : v)
|
@@ -579,7 +581,6 @@ module Rack
|
|
579
581
|
status.to_i
|
580
582
|
end
|
581
583
|
end
|
582
|
-
module_function :status_code
|
583
584
|
|
584
585
|
PATH_SEPS = Regexp.union(*[::File::SEPARATOR, ::File::ALT_SEPARATOR].compact)
|
585
586
|
|
@@ -593,18 +594,16 @@ module Rack
|
|
593
594
|
part == '..' ? clean.pop : clean << part
|
594
595
|
end
|
595
596
|
|
596
|
-
|
597
|
-
|
598
|
-
|
597
|
+
clean_path = clean.join(::File::SEPARATOR)
|
598
|
+
clean_path.prepend("/") if parts.empty? || parts.first.empty?
|
599
|
+
clean_path
|
599
600
|
end
|
600
|
-
module_function :clean_path_info
|
601
601
|
|
602
602
|
NULL_BYTE = "\0"
|
603
603
|
|
604
604
|
def valid_path?(path)
|
605
605
|
path.valid_encoding? && !path.include?(NULL_BYTE)
|
606
606
|
end
|
607
|
-
module_function :valid_path?
|
608
607
|
|
609
608
|
end
|
610
609
|
end
|
data/lib/rack/version.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright (C) 2007-2019 Leah Neukirchen <http://leahneukirchen.org/infopage.html>
|
4
|
+
#
|
5
|
+
# Rack is freely distributable under the terms of an MIT-style license.
|
6
|
+
# See MIT-LICENSE or https://opensource.org/licenses/MIT.
|
7
|
+
|
8
|
+
# The Rack main module, serving as a namespace for all core Rack
|
9
|
+
# modules and classes.
|
10
|
+
#
|
11
|
+
# All modules meant for use in your application are <tt>autoload</tt>ed here,
|
12
|
+
# so it should be enough just to <tt>require 'rack'</tt> in your code.
|
13
|
+
|
14
|
+
module Rack
|
15
|
+
# The Rack protocol version number implemented.
|
16
|
+
VERSION = [1, 3]
|
17
|
+
|
18
|
+
# Return the Rack protocol version as a dotted string.
|
19
|
+
def self.version
|
20
|
+
VERSION.join(".")
|
21
|
+
end
|
22
|
+
|
23
|
+
RELEASE = "2.2.0"
|
24
|
+
|
25
|
+
# Return the Rack release as a dotted string.
|
26
|
+
def self.release
|
27
|
+
RELEASE
|
28
|
+
end
|
29
|
+
end
|
data/lib/rack.rb
CHANGED
@@ -11,23 +11,11 @@
|
|
11
11
|
# All modules meant for use in your application are <tt>autoload</tt>ed here,
|
12
12
|
# so it should be enough just to <tt>require 'rack'</tt> in your code.
|
13
13
|
|
14
|
-
|
15
|
-
# The Rack protocol version number implemented.
|
16
|
-
VERSION = [1, 3]
|
17
|
-
|
18
|
-
# Return the Rack protocol version as a dotted string.
|
19
|
-
def self.version
|
20
|
-
VERSION.join(".")
|
21
|
-
end
|
22
|
-
|
23
|
-
RELEASE = "2.1.4.2"
|
24
|
-
|
25
|
-
# Return the Rack release as a dotted string.
|
26
|
-
def self.release
|
27
|
-
RELEASE
|
28
|
-
end
|
14
|
+
require_relative 'rack/version'
|
29
15
|
|
16
|
+
module Rack
|
30
17
|
HTTP_HOST = 'HTTP_HOST'
|
18
|
+
HTTP_PORT = 'HTTP_PORT'
|
31
19
|
HTTP_VERSION = 'HTTP_VERSION'
|
32
20
|
HTTPS = 'HTTPS'
|
33
21
|
PATH_INFO = 'PATH_INFO'
|
@@ -37,9 +25,9 @@ module Rack
|
|
37
25
|
QUERY_STRING = 'QUERY_STRING'
|
38
26
|
SERVER_PROTOCOL = 'SERVER_PROTOCOL'
|
39
27
|
SERVER_NAME = 'SERVER_NAME'
|
40
|
-
SERVER_ADDR = 'SERVER_ADDR'
|
41
28
|
SERVER_PORT = 'SERVER_PORT'
|
42
29
|
CACHE_CONTROL = 'Cache-Control'
|
30
|
+
EXPIRES = 'Expires'
|
43
31
|
CONTENT_LENGTH = 'Content-Length'
|
44
32
|
CONTENT_TYPE = 'Content-Type'
|
45
33
|
SET_COOKIE = 'Set-Cookie'
|
@@ -98,6 +86,7 @@ module Rack
|
|
98
86
|
autoload :ContentLength, "rack/content_length"
|
99
87
|
autoload :ContentType, "rack/content_type"
|
100
88
|
autoload :ETag, "rack/etag"
|
89
|
+
autoload :Events, "rack/events"
|
101
90
|
autoload :File, "rack/file"
|
102
91
|
autoload :Files, "rack/files"
|
103
92
|
autoload :Deflater, "rack/deflater"
|
@@ -108,11 +97,13 @@ module Rack
|
|
108
97
|
autoload :Lint, "rack/lint"
|
109
98
|
autoload :Lock, "rack/lock"
|
110
99
|
autoload :Logger, "rack/logger"
|
100
|
+
autoload :MediaType, "rack/media_type"
|
111
101
|
autoload :MethodOverride, "rack/method_override"
|
112
102
|
autoload :Mime, "rack/mime"
|
113
103
|
autoload :NullLogger, "rack/null_logger"
|
114
104
|
autoload :Recursive, "rack/recursive"
|
115
105
|
autoload :Reloader, "rack/reloader"
|
106
|
+
autoload :RewindableInput, "rack/rewindable_input"
|
116
107
|
autoload :Runtime, "rack/runtime"
|
117
108
|
autoload :Sendfile, "rack/sendfile"
|
118
109
|
autoload :Server, "rack/server"
|
data/rack.gemspec
CHANGED
@@ -1,39 +1,41 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative 'lib/rack/version'
|
4
|
+
|
3
5
|
Gem::Specification.new do |s|
|
4
6
|
s.name = "rack"
|
5
|
-
s.version =
|
6
|
-
s.platform
|
7
|
-
s.summary
|
8
|
-
s.license
|
9
|
-
|
10
|
-
s.description =
|
11
|
-
Rack provides a minimal, modular and adaptable interface for developing
|
12
|
-
web applications in Ruby.
|
13
|
-
the simplest way possible, it unifies and distills the API for web
|
14
|
-
servers, web frameworks, and software in between (the so-called
|
15
|
-
middleware) into a single method call.
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
s.bindir = 'bin'
|
7
|
+
s.version = Rack::RELEASE
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.summary = "A modular Ruby webserver interface."
|
10
|
+
s.license = "MIT"
|
11
|
+
|
12
|
+
s.description = <<~EOF
|
13
|
+
Rack provides a minimal, modular and adaptable interface for developing
|
14
|
+
web applications in Ruby. By wrapping HTTP requests and responses in
|
15
|
+
the simplest way possible, it unifies and distills the API for web
|
16
|
+
servers, web frameworks, and software in between (the so-called
|
17
|
+
middleware) into a single method call.
|
18
|
+
EOF
|
19
|
+
|
20
|
+
s.files = Dir['{bin/*,contrib/*,example/*,lib/**/*}'] +
|
21
|
+
%w(MIT-LICENSE rack.gemspec Rakefile README.rdoc SPEC.rdoc)
|
22
|
+
|
23
|
+
s.bindir = 'bin'
|
23
24
|
s.executables << 'rackup'
|
24
25
|
s.require_path = 'lib'
|
25
|
-
s.extra_rdoc_files = ['README.rdoc', 'CHANGELOG.md']
|
26
|
-
|
27
|
-
s.author
|
28
|
-
s.email
|
29
|
-
|
30
|
-
s.
|
31
|
-
|
32
|
-
|
33
|
-
|
26
|
+
s.extra_rdoc_files = ['README.rdoc', 'CHANGELOG.md', 'CONTRIBUTING.md']
|
27
|
+
|
28
|
+
s.author = 'Leah Neukirchen'
|
29
|
+
s.email = 'leah@vuxu.org'
|
30
|
+
|
31
|
+
s.homepage = 'https://github.com/rack/rack'
|
32
|
+
|
33
|
+
s.required_ruby_version = '>= 2.3.0'
|
34
|
+
|
35
|
+
s.metadata = {
|
36
|
+
"bug_tracker_uri" => "https://github.com/rack/rack/issues",
|
37
|
+
"changelog_uri" => "https://github.com/rack/rack/blob/master/CHANGELOG.md",
|
34
38
|
"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
39
|
"source_code_uri" => "https://github.com/rack/rack"
|
38
40
|
}
|
39
41
|
|
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.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leah Neukirchen
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-02-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -68,12 +68,10 @@ dependencies:
|
|
68
68
|
version: '0'
|
69
69
|
description: |
|
70
70
|
Rack provides a minimal, modular and adaptable interface for developing
|
71
|
-
web applications in Ruby.
|
71
|
+
web applications in Ruby. By wrapping HTTP requests and responses in
|
72
72
|
the simplest way possible, it unifies and distills the API for web
|
73
73
|
servers, web frameworks, and software in between (the so-called
|
74
74
|
middleware) into a single method call.
|
75
|
-
|
76
|
-
Also see https://rack.github.io/.
|
77
75
|
email: leah@vuxu.org
|
78
76
|
executables:
|
79
77
|
- rackup
|
@@ -81,12 +79,14 @@ extensions: []
|
|
81
79
|
extra_rdoc_files:
|
82
80
|
- README.rdoc
|
83
81
|
- CHANGELOG.md
|
82
|
+
- CONTRIBUTING.md
|
84
83
|
files:
|
85
84
|
- CHANGELOG.md
|
85
|
+
- CONTRIBUTING.md
|
86
86
|
- MIT-LICENSE
|
87
87
|
- README.rdoc
|
88
88
|
- Rakefile
|
89
|
-
- SPEC
|
89
|
+
- SPEC.rdoc
|
90
90
|
- bin/rackup
|
91
91
|
- contrib/rack.png
|
92
92
|
- contrib/rack.svg
|
@@ -159,18 +159,17 @@ files:
|
|
159
159
|
- lib/rack/tempfile_reaper.rb
|
160
160
|
- lib/rack/urlmap.rb
|
161
161
|
- lib/rack/utils.rb
|
162
|
+
- lib/rack/version.rb
|
162
163
|
- rack.gemspec
|
163
|
-
homepage: https://
|
164
|
+
homepage: https://github.com/rack/rack
|
164
165
|
licenses:
|
165
166
|
- MIT
|
166
167
|
metadata:
|
167
168
|
bug_tracker_uri: https://github.com/rack/rack/issues
|
168
169
|
changelog_uri: https://github.com/rack/rack/blob/master/CHANGELOG.md
|
169
170
|
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
171
|
source_code_uri: https://github.com/rack/rack
|
173
|
-
post_install_message:
|
172
|
+
post_install_message:
|
174
173
|
rdoc_options: []
|
175
174
|
require_paths:
|
176
175
|
- lib
|
@@ -178,15 +177,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
178
177
|
requirements:
|
179
178
|
- - ">="
|
180
179
|
- !ruby/object:Gem::Version
|
181
|
-
version: 2.
|
180
|
+
version: 2.3.0
|
182
181
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
183
182
|
requirements:
|
184
183
|
- - ">="
|
185
184
|
- !ruby/object:Gem::Version
|
186
185
|
version: '0'
|
187
186
|
requirements: []
|
188
|
-
rubygems_version: 3.1.
|
189
|
-
signing_key:
|
187
|
+
rubygems_version: 3.1.2
|
188
|
+
signing_key:
|
190
189
|
specification_version: 4
|
191
|
-
summary:
|
190
|
+
summary: A modular Ruby webserver interface.
|
192
191
|
test_files: []
|