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.

Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +600 -13
  3. data/CONTRIBUTING.md +136 -0
  4. data/README.rdoc +83 -39
  5. data/Rakefile +14 -7
  6. data/{SPEC → SPEC.rdoc} +35 -6
  7. data/lib/rack/auth/abstract/request.rb +0 -2
  8. data/lib/rack/auth/basic.rb +3 -3
  9. data/lib/rack/auth/digest/md5.rb +4 -4
  10. data/lib/rack/auth/digest/request.rb +3 -3
  11. data/lib/rack/body_proxy.rb +13 -9
  12. data/lib/rack/builder.rb +77 -8
  13. data/lib/rack/cascade.rb +23 -8
  14. data/lib/rack/chunked.rb +48 -23
  15. data/lib/rack/common_logger.rb +25 -21
  16. data/lib/rack/conditional_get.rb +18 -16
  17. data/lib/rack/content_length.rb +6 -7
  18. data/lib/rack/content_type.rb +3 -4
  19. data/lib/rack/deflater.rb +45 -35
  20. data/lib/rack/directory.rb +77 -60
  21. data/lib/rack/etag.rb +2 -3
  22. data/lib/rack/events.rb +15 -18
  23. data/lib/rack/file.rb +1 -1
  24. data/lib/rack/files.rb +96 -56
  25. data/lib/rack/handler/cgi.rb +1 -4
  26. data/lib/rack/handler/fastcgi.rb +1 -3
  27. data/lib/rack/handler/lsws.rb +1 -3
  28. data/lib/rack/handler/scgi.rb +1 -3
  29. data/lib/rack/handler/thin.rb +15 -11
  30. data/lib/rack/handler/webrick.rb +12 -5
  31. data/lib/rack/head.rb +0 -2
  32. data/lib/rack/lint.rb +58 -15
  33. data/lib/rack/lobster.rb +3 -5
  34. data/lib/rack/lock.rb +0 -1
  35. data/lib/rack/mock.rb +22 -4
  36. data/lib/rack/multipart/generator.rb +11 -6
  37. data/lib/rack/multipart/parser.rb +8 -17
  38. data/lib/rack/multipart/uploaded_file.rb +13 -7
  39. data/lib/rack/multipart.rb +5 -4
  40. data/lib/rack/query_parser.rb +7 -8
  41. data/lib/rack/recursive.rb +1 -1
  42. data/lib/rack/reloader.rb +1 -3
  43. data/lib/rack/request.rb +172 -76
  44. data/lib/rack/response.rb +62 -19
  45. data/lib/rack/rewindable_input.rb +0 -1
  46. data/lib/rack/runtime.rb +3 -3
  47. data/lib/rack/sendfile.rb +0 -3
  48. data/lib/rack/server.rb +9 -8
  49. data/lib/rack/session/abstract/id.rb +20 -18
  50. data/lib/rack/session/cookie.rb +2 -3
  51. data/lib/rack/session/pool.rb +1 -1
  52. data/lib/rack/show_exceptions.rb +2 -4
  53. data/lib/rack/show_status.rb +1 -3
  54. data/lib/rack/static.rb +13 -6
  55. data/lib/rack/tempfile_reaper.rb +0 -2
  56. data/lib/rack/urlmap.rb +1 -4
  57. data/lib/rack/utils.rb +64 -65
  58. data/lib/rack/version.rb +29 -0
  59. data/lib/rack.rb +7 -16
  60. data/rack.gemspec +31 -29
  61. 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 'core_ext/regexp'
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
  "&" => "&amp;",
@@ -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
- accept_encoding.each_with_object([]) do |(m, q), list|
185
- if m == "*"
186
- (available_encodings - accept_encoding.map(&:first))
187
- .each { |m2| list << [m2, q] }
188
- else
189
- list << [m, q]
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.sort_by { |_, q| -q }.map!(&:first)
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 2109:
214
- # If multiple cookies satisfy the criteria above, they are ordered in
215
- # the Cookie header such that those with more specific Path attributes
216
- # precede those with less specific. Ordering with respect to other
217
- # attributes (e.g., Domain) is unspecified.
218
- return {} unless header
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
- regexp = if value[:domain]
286
- /\A#{escape(key)}=.*domain=#{value[:domain]}/
287
- elsif value[:path]
288
- /\A#{escape(key)}=.*path=#{value[:path]}/
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#{escape(key)}=/
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 unless range_spec.include?('-')
354
- range = range_spec.split('-')
355
- r0, r1 = range[0], range[1]
356
- if r0.nil? || r0.empty?
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.nil?
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
- clean.unshift '/' if parts.empty? || parts.first.empty?
597
-
598
- ::File.join clean
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
@@ -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
- 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.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 = File.read('lib/rack.rb')[/RELEASE += +([\"\'])([\d][\w\.]+)\1/, 2]
6
- s.platform = Gem::Platform::RUBY
7
- s.summary = "a modular Ruby webserver interface"
8
- s.license = "MIT"
9
-
10
- s.description = <<-EOF
11
- Rack provides a minimal, modular and adaptable interface for developing
12
- web applications in Ruby. By wrapping HTTP requests and responses in
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
- Also see https://rack.github.io/.
18
- EOF
19
-
20
- s.files = Dir['{bin/*,contrib/*,example/*,lib/**/*}'] +
21
- %w(MIT-LICENSE rack.gemspec Rakefile README.rdoc SPEC)
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 = 'Leah Neukirchen'
28
- s.email = 'leah@vuxu.org'
29
- s.homepage = 'https://rack.github.io/'
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",
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.1.4.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: 2023-01-17 00:00:00.000000000 Z
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. By wrapping HTTP requests and responses in
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://rack.github.io/
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.2.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.6
189
- signing_key:
187
+ rubygems_version: 3.1.2
188
+ signing_key:
190
189
  specification_version: 4
191
- summary: a modular Ruby webserver interface
190
+ summary: A modular Ruby webserver interface.
192
191
  test_files: []