rack 2.1.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of rack might be problematic. Click here for more details.

Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +377 -16
  3. data/CONTRIBUTING.md +144 -0
  4. data/MIT-LICENSE +1 -1
  5. data/README.md +328 -0
  6. data/SPEC.rdoc +365 -0
  7. data/lib/rack/auth/abstract/handler.rb +3 -1
  8. data/lib/rack/auth/abstract/request.rb +2 -2
  9. data/lib/rack/auth/basic.rb +4 -7
  10. data/lib/rack/bad_request.rb +8 -0
  11. data/lib/rack/body_proxy.rb +34 -12
  12. data/lib/rack/builder.rb +162 -59
  13. data/lib/rack/cascade.rb +24 -10
  14. data/lib/rack/common_logger.rb +43 -28
  15. data/lib/rack/conditional_get.rb +30 -25
  16. data/lib/rack/constants.rb +66 -0
  17. data/lib/rack/content_length.rb +10 -16
  18. data/lib/rack/content_type.rb +9 -7
  19. data/lib/rack/deflater.rb +78 -50
  20. data/lib/rack/directory.rb +86 -63
  21. data/lib/rack/etag.rb +14 -22
  22. data/lib/rack/events.rb +18 -17
  23. data/lib/rack/files.rb +99 -61
  24. data/lib/rack/head.rb +8 -9
  25. data/lib/rack/headers.rb +238 -0
  26. data/lib/rack/lint.rb +868 -642
  27. data/lib/rack/lock.rb +2 -6
  28. data/lib/rack/logger.rb +3 -0
  29. data/lib/rack/media_type.rb +9 -4
  30. data/lib/rack/method_override.rb +6 -2
  31. data/lib/rack/mime.rb +14 -5
  32. data/lib/rack/mock.rb +1 -253
  33. data/lib/rack/mock_request.rb +171 -0
  34. data/lib/rack/mock_response.rb +124 -0
  35. data/lib/rack/multipart/generator.rb +15 -8
  36. data/lib/rack/multipart/parser.rb +238 -107
  37. data/lib/rack/multipart/uploaded_file.rb +17 -7
  38. data/lib/rack/multipart.rb +54 -42
  39. data/lib/rack/null_logger.rb +9 -0
  40. data/lib/rack/query_parser.rb +87 -105
  41. data/lib/rack/recursive.rb +3 -1
  42. data/lib/rack/reloader.rb +0 -4
  43. data/lib/rack/request.rb +366 -135
  44. data/lib/rack/response.rb +186 -68
  45. data/lib/rack/rewindable_input.rb +24 -6
  46. data/lib/rack/runtime.rb +8 -7
  47. data/lib/rack/sendfile.rb +29 -27
  48. data/lib/rack/show_exceptions.rb +27 -12
  49. data/lib/rack/show_status.rb +21 -13
  50. data/lib/rack/static.rb +19 -12
  51. data/lib/rack/tempfile_reaper.rb +14 -5
  52. data/lib/rack/urlmap.rb +5 -6
  53. data/lib/rack/utils.rb +274 -260
  54. data/lib/rack/version.rb +21 -0
  55. data/lib/rack.rb +18 -103
  56. metadata +25 -52
  57. data/README.rdoc +0 -262
  58. data/Rakefile +0 -123
  59. data/SPEC +0 -263
  60. data/bin/rackup +0 -5
  61. data/contrib/rack.png +0 -0
  62. data/contrib/rack.svg +0 -150
  63. data/contrib/rack_logo.svg +0 -164
  64. data/contrib/rdoc.css +0 -412
  65. data/example/lobster.ru +0 -6
  66. data/example/protectedlobster.rb +0 -16
  67. data/example/protectedlobster.ru +0 -10
  68. data/lib/rack/auth/digest/md5.rb +0 -131
  69. data/lib/rack/auth/digest/nonce.rb +0 -54
  70. data/lib/rack/auth/digest/params.rb +0 -54
  71. data/lib/rack/auth/digest/request.rb +0 -43
  72. data/lib/rack/chunked.rb +0 -92
  73. data/lib/rack/core_ext/regexp.rb +0 -14
  74. data/lib/rack/file.rb +0 -8
  75. data/lib/rack/handler/cgi.rb +0 -62
  76. data/lib/rack/handler/fastcgi.rb +0 -102
  77. data/lib/rack/handler/lsws.rb +0 -63
  78. data/lib/rack/handler/scgi.rb +0 -73
  79. data/lib/rack/handler/thin.rb +0 -38
  80. data/lib/rack/handler/webrick.rb +0 -122
  81. data/lib/rack/handler.rb +0 -104
  82. data/lib/rack/lobster.rb +0 -72
  83. data/lib/rack/server.rb +0 -467
  84. data/lib/rack/session/abstract/id.rb +0 -528
  85. data/lib/rack/session/cookie.rb +0 -205
  86. data/lib/rack/session/memcache.rb +0 -10
  87. data/lib/rack/session/pool.rb +0 -85
  88. data/rack.gemspec +0 -44
data/lib/rack/head.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rack/body_proxy'
3
+ require_relative 'constants'
4
+ require_relative 'body_proxy'
4
5
 
5
6
  module Rack
6
7
  # Rack::Head returns an empty body for all HEAD requests. It leaves
@@ -11,17 +12,15 @@ module Rack
11
12
  end
12
13
 
13
14
  def call(env)
14
- status, headers, body = @app.call(env)
15
+ _, _, body = response = @app.call(env)
15
16
 
16
17
  if env[REQUEST_METHOD] == HEAD
17
- [
18
- status, headers, Rack::BodyProxy.new([]) do
19
- body.close if body.respond_to? :close
20
- end
21
- ]
22
- else
23
- [status, headers, body]
18
+ response[2] = Rack::BodyProxy.new([]) do
19
+ body.close if body.respond_to? :close
20
+ end
24
21
  end
22
+
23
+ response
25
24
  end
26
25
  end
27
26
  end
@@ -0,0 +1,238 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rack
4
+ # Rack::Headers is a Hash subclass that downcases all keys. It's designed
5
+ # to be used by rack applications that don't implement the Rack 3 SPEC
6
+ # (by using non-lowercase response header keys), automatically handling
7
+ # the downcasing of keys.
8
+ class Headers < Hash
9
+ KNOWN_HEADERS = {}
10
+ %w(
11
+ Accept-CH
12
+ Accept-Patch
13
+ Accept-Ranges
14
+ Access-Control-Allow-Credentials
15
+ Access-Control-Allow-Headers
16
+ Access-Control-Allow-Methods
17
+ Access-Control-Allow-Origin
18
+ Access-Control-Expose-Headers
19
+ Access-Control-Max-Age
20
+ Age
21
+ Allow
22
+ Alt-Svc
23
+ Cache-Control
24
+ Connection
25
+ Content-Disposition
26
+ Content-Encoding
27
+ Content-Language
28
+ Content-Length
29
+ Content-Location
30
+ Content-MD5
31
+ Content-Range
32
+ Content-Security-Policy
33
+ Content-Security-Policy-Report-Only
34
+ Content-Type
35
+ Date
36
+ Delta-Base
37
+ ETag
38
+ Expect-CT
39
+ Expires
40
+ Feature-Policy
41
+ IM
42
+ Last-Modified
43
+ Link
44
+ Location
45
+ NEL
46
+ P3P
47
+ Permissions-Policy
48
+ Pragma
49
+ Preference-Applied
50
+ Proxy-Authenticate
51
+ Public-Key-Pins
52
+ Referrer-Policy
53
+ Refresh
54
+ Report-To
55
+ Retry-After
56
+ Server
57
+ Set-Cookie
58
+ Status
59
+ Strict-Transport-Security
60
+ Timing-Allow-Origin
61
+ Tk
62
+ Trailer
63
+ Transfer-Encoding
64
+ Upgrade
65
+ Vary
66
+ Via
67
+ WWW-Authenticate
68
+ Warning
69
+ X-Cascade
70
+ X-Content-Duration
71
+ X-Content-Security-Policy
72
+ X-Content-Type-Options
73
+ X-Correlation-ID
74
+ X-Correlation-Id
75
+ X-Download-Options
76
+ X-Frame-Options
77
+ X-Permitted-Cross-Domain-Policies
78
+ X-Powered-By
79
+ X-Redirect-By
80
+ X-Request-ID
81
+ X-Request-Id
82
+ X-Runtime
83
+ X-UA-Compatible
84
+ X-WebKit-CS
85
+ X-XSS-Protection
86
+ ).each do |str|
87
+ downcased = str.downcase.freeze
88
+ KNOWN_HEADERS[str] = KNOWN_HEADERS[downcased] = downcased
89
+ end
90
+
91
+ def self.[](*items)
92
+ if items.length % 2 != 0
93
+ if items.length == 1 && items.first.is_a?(Hash)
94
+ new.merge!(items.first)
95
+ else
96
+ raise ArgumentError, "odd number of arguments for Rack::Headers"
97
+ end
98
+ else
99
+ hash = new
100
+ loop do
101
+ break if items.length == 0
102
+ key = items.shift
103
+ value = items.shift
104
+ hash[key] = value
105
+ end
106
+ hash
107
+ end
108
+ end
109
+
110
+ def [](key)
111
+ super(downcase_key(key))
112
+ end
113
+
114
+ def []=(key, value)
115
+ super(KNOWN_HEADERS[key] || key.downcase.freeze, value)
116
+ end
117
+ alias store []=
118
+
119
+ def assoc(key)
120
+ super(downcase_key(key))
121
+ end
122
+
123
+ def compare_by_identity
124
+ raise TypeError, "Rack::Headers cannot compare by identity, use regular Hash"
125
+ end
126
+
127
+ def delete(key)
128
+ super(downcase_key(key))
129
+ end
130
+
131
+ def dig(key, *a)
132
+ super(downcase_key(key), *a)
133
+ end
134
+
135
+ def fetch(key, *default, &block)
136
+ key = downcase_key(key)
137
+ super
138
+ end
139
+
140
+ def fetch_values(*a)
141
+ super(*a.map!{|key| downcase_key(key)})
142
+ end
143
+
144
+ def has_key?(key)
145
+ super(downcase_key(key))
146
+ end
147
+ alias include? has_key?
148
+ alias key? has_key?
149
+ alias member? has_key?
150
+
151
+ def invert
152
+ hash = self.class.new
153
+ each{|key, value| hash[value] = key}
154
+ hash
155
+ end
156
+
157
+ def merge(hash, &block)
158
+ dup.merge!(hash, &block)
159
+ end
160
+
161
+ def reject(&block)
162
+ hash = dup
163
+ hash.reject!(&block)
164
+ hash
165
+ end
166
+
167
+ def replace(hash)
168
+ clear
169
+ update(hash)
170
+ end
171
+
172
+ def select(&block)
173
+ hash = dup
174
+ hash.select!(&block)
175
+ hash
176
+ end
177
+
178
+ def to_proc
179
+ lambda{|x| self[x]}
180
+ end
181
+
182
+ def transform_values(&block)
183
+ dup.transform_values!(&block)
184
+ end
185
+
186
+ def update(hash, &block)
187
+ hash.each do |key, value|
188
+ self[key] = if block_given? && include?(key)
189
+ block.call(key, self[key], value)
190
+ else
191
+ value
192
+ end
193
+ end
194
+ self
195
+ end
196
+ alias merge! update
197
+
198
+ def values_at(*keys)
199
+ keys.map{|key| self[key]}
200
+ end
201
+
202
+ # :nocov:
203
+ if RUBY_VERSION >= '2.5'
204
+ # :nocov:
205
+ def slice(*a)
206
+ h = self.class.new
207
+ a.each{|k| h[k] = self[k] if has_key?(k)}
208
+ h
209
+ end
210
+
211
+ def transform_keys(&block)
212
+ dup.transform_keys!(&block)
213
+ end
214
+
215
+ def transform_keys!
216
+ hash = self.class.new
217
+ each do |k, v|
218
+ hash[yield k] = v
219
+ end
220
+ replace(hash)
221
+ end
222
+ end
223
+
224
+ # :nocov:
225
+ if RUBY_VERSION >= '3.0'
226
+ # :nocov:
227
+ def except(*a)
228
+ super(*a.map!{|key| downcase_key(key)})
229
+ end
230
+ end
231
+
232
+ private
233
+
234
+ def downcase_key(key)
235
+ key.is_a?(String) ? KNOWN_HEADERS[key] || key.downcase : key
236
+ end
237
+ end
238
+ end