rack 2.2.23 → 3.0.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +148 -183
- data/CONTRIBUTING.md +53 -47
- data/MIT-LICENSE +1 -1
- data/README.md +293 -0
- data/SPEC.rdoc +174 -126
- data/lib/rack/auth/abstract/handler.rb +3 -1
- data/lib/rack/auth/abstract/request.rb +3 -1
- data/lib/rack/auth/basic.rb +2 -1
- data/lib/rack/auth/digest/md5.rb +1 -131
- data/lib/rack/auth/digest/nonce.rb +1 -53
- data/lib/rack/auth/digest/params.rb +1 -54
- data/lib/rack/auth/digest/request.rb +1 -43
- data/lib/rack/auth/digest.rb +256 -0
- data/lib/rack/body_proxy.rb +3 -1
- data/lib/rack/builder.rb +60 -42
- data/lib/rack/cascade.rb +2 -0
- data/lib/rack/chunked.rb +16 -13
- data/lib/rack/common_logger.rb +24 -20
- data/lib/rack/conditional_get.rb +18 -15
- data/lib/rack/constants.rb +63 -0
- data/lib/rack/content_length.rb +12 -16
- data/lib/rack/content_type.rb +8 -5
- data/lib/rack/deflater.rb +40 -26
- data/lib/rack/directory.rb +12 -9
- data/lib/rack/etag.rb +14 -23
- data/lib/rack/events.rb +4 -0
- data/lib/rack/file.rb +2 -0
- data/lib/rack/files.rb +16 -18
- data/lib/rack/head.rb +9 -8
- data/lib/rack/headers.rb +154 -0
- data/lib/rack/lint.rb +754 -648
- data/lib/rack/lock.rb +2 -5
- data/lib/rack/logger.rb +2 -0
- data/lib/rack/media_type.rb +7 -17
- data/lib/rack/method_override.rb +5 -1
- data/lib/rack/mime.rb +8 -0
- data/lib/rack/mock.rb +1 -300
- data/lib/rack/mock_request.rb +166 -0
- data/lib/rack/mock_response.rb +126 -0
- data/lib/rack/multipart/generator.rb +7 -5
- data/lib/rack/multipart/parser.rb +119 -160
- data/lib/rack/multipart/uploaded_file.rb +4 -0
- data/lib/rack/multipart.rb +20 -40
- data/lib/rack/null_logger.rb +9 -0
- data/lib/rack/query_parser.rb +78 -91
- data/lib/rack/recursive.rb +2 -0
- data/lib/rack/reloader.rb +0 -2
- data/lib/rack/request.rb +190 -95
- data/lib/rack/response.rb +131 -61
- data/lib/rack/rewindable_input.rb +24 -5
- data/lib/rack/runtime.rb +7 -6
- data/lib/rack/sendfile.rb +40 -65
- data/lib/rack/show_exceptions.rb +15 -2
- data/lib/rack/show_status.rb +17 -7
- data/lib/rack/static.rb +12 -17
- data/lib/rack/tempfile_reaper.rb +15 -4
- data/lib/rack/urlmap.rb +4 -2
- data/lib/rack/utils.rb +219 -240
- data/lib/rack/version.rb +9 -4
- data/lib/rack.rb +5 -76
- metadata +18 -35
- data/README.rdoc +0 -355
- data/Rakefile +0 -130
- data/bin/rackup +0 -5
- data/contrib/rack.png +0 -0
- data/contrib/rack.svg +0 -150
- data/contrib/rack_logo.svg +0 -164
- data/contrib/rdoc.css +0 -412
- data/example/lobster.ru +0 -6
- data/example/protectedlobster.rb +0 -16
- data/example/protectedlobster.ru +0 -10
- data/lib/rack/core_ext/regexp.rb +0 -14
- data/lib/rack/handler/cgi.rb +0 -59
- data/lib/rack/handler/fastcgi.rb +0 -100
- data/lib/rack/handler/lsws.rb +0 -61
- data/lib/rack/handler/scgi.rb +0 -71
- data/lib/rack/handler/thin.rb +0 -34
- data/lib/rack/handler/webrick.rb +0 -129
- data/lib/rack/handler.rb +0 -104
- data/lib/rack/lobster.rb +0 -70
- data/lib/rack/server.rb +0 -466
- data/lib/rack/session/abstract/id.rb +0 -523
- data/lib/rack/session/cookie.rb +0 -203
- data/lib/rack/session/memcache.rb +0 -10
- data/lib/rack/session/pool.rb +0 -90
- data/rack.gemspec +0 -46
data/lib/rack/show_status.rb
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
require 'erb'
|
|
4
4
|
|
|
5
|
+
require_relative 'constants'
|
|
6
|
+
require_relative 'utils'
|
|
7
|
+
require_relative 'request'
|
|
8
|
+
require_relative 'body_proxy'
|
|
9
|
+
|
|
5
10
|
module Rack
|
|
6
11
|
# Rack::ShowStatus catches all empty responses and replaces them
|
|
7
12
|
# with a site explaining the error.
|
|
@@ -17,8 +22,7 @@ module Rack
|
|
|
17
22
|
end
|
|
18
23
|
|
|
19
24
|
def call(env)
|
|
20
|
-
status, headers, body = @app.call(env)
|
|
21
|
-
headers = Utils::HeaderHash[headers]
|
|
25
|
+
status, headers, body = response = @app.call(env)
|
|
22
26
|
empty = headers[CONTENT_LENGTH].to_i <= 0
|
|
23
27
|
|
|
24
28
|
# client or server error, or explicit message
|
|
@@ -33,12 +37,18 @@ module Rack
|
|
|
33
37
|
# Yes, it is dumb, but I don't like Ruby yelling at me.
|
|
34
38
|
detail = detail = env[RACK_SHOWSTATUS_DETAIL] || message
|
|
35
39
|
|
|
36
|
-
|
|
37
|
-
size =
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
40
|
+
html = @template.result(binding)
|
|
41
|
+
size = html.bytesize
|
|
42
|
+
|
|
43
|
+
response[2] = Rack::BodyProxy.new([html]) do
|
|
44
|
+
body.close if body.respond_to?(:close)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
headers[CONTENT_TYPE] = "text/html"
|
|
48
|
+
headers[CONTENT_LENGTH] = size.to_s
|
|
41
49
|
end
|
|
50
|
+
|
|
51
|
+
response
|
|
42
52
|
end
|
|
43
53
|
|
|
44
54
|
def h(obj) # :nodoc:
|
data/lib/rack/static.rb
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative 'constants'
|
|
4
|
+
require_relative 'files'
|
|
5
|
+
require_relative 'mime'
|
|
6
|
+
|
|
3
7
|
module Rack
|
|
4
8
|
|
|
5
9
|
# The Rack::Static middleware intercepts requests for static files
|
|
@@ -78,22 +82,17 @@ module Rack
|
|
|
78
82
|
# :header_rules => [
|
|
79
83
|
# # Cache all static files in public caches (e.g. Rack::Cache)
|
|
80
84
|
# # as well as in the browser
|
|
81
|
-
# [:all, {'
|
|
85
|
+
# [:all, {'cache-control' => 'public, max-age=31536000'}],
|
|
82
86
|
#
|
|
83
87
|
# # Provide web fonts with cross-origin access-control-headers
|
|
84
88
|
# # Firefox requires this when serving assets using a Content Delivery Network
|
|
85
|
-
# [:fonts, {'
|
|
89
|
+
# [:fonts, {'access-control-allow-origin' => '*'}]
|
|
86
90
|
# ]
|
|
87
91
|
#
|
|
88
92
|
class Static
|
|
89
|
-
(require_relative 'core_ext/regexp'; using ::Rack::RegexpExtensions) if RUBY_VERSION < '2.4'
|
|
90
|
-
|
|
91
93
|
def initialize(app, options = {})
|
|
92
94
|
@app = app
|
|
93
95
|
@urls = options[:urls] || ["/favicon.ico"]
|
|
94
|
-
if @urls.kind_of?(Array)
|
|
95
|
-
@urls = @urls.map { |url| [url, url.end_with?('/') ? url : "#{url}/".freeze].freeze }.freeze
|
|
96
|
-
end
|
|
97
96
|
@index = options[:index]
|
|
98
97
|
@gzip = options[:gzip]
|
|
99
98
|
@cascade = options[:cascade]
|
|
@@ -116,7 +115,7 @@ module Rack
|
|
|
116
115
|
end
|
|
117
116
|
|
|
118
117
|
def route_file(path)
|
|
119
|
-
@urls.kind_of?(Array) && @urls.any? { |url
|
|
118
|
+
@urls.kind_of?(Array) && @urls.any? { |url| path.index(url) == 0 }
|
|
120
119
|
end
|
|
121
120
|
|
|
122
121
|
def can_serve(path)
|
|
@@ -125,9 +124,8 @@ module Rack
|
|
|
125
124
|
|
|
126
125
|
def call(env)
|
|
127
126
|
path = env[PATH_INFO]
|
|
128
|
-
actual_path = Utils.clean_path_info(Utils.unescape_path(path))
|
|
129
127
|
|
|
130
|
-
if can_serve(
|
|
128
|
+
if can_serve(path)
|
|
131
129
|
if overwrite_file_path(path)
|
|
132
130
|
env[PATH_INFO] = (add_index_root?(path) ? path + @index : @urls[path])
|
|
133
131
|
elsif @gzip && env['HTTP_ACCEPT_ENCODING'] && /\bgzip\b/.match?(env['HTTP_ACCEPT_ENCODING'])
|
|
@@ -141,10 +139,8 @@ module Rack
|
|
|
141
139
|
elsif response[0] == 304
|
|
142
140
|
# Do nothing, leave headers as is
|
|
143
141
|
else
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
end
|
|
147
|
-
response[1]['Content-Encoding'] = 'gzip'
|
|
142
|
+
response[1][CONTENT_TYPE] = Mime.mime_type(::File.extname(path), 'text/plain')
|
|
143
|
+
response[1]['content-encoding'] = 'gzip'
|
|
148
144
|
end
|
|
149
145
|
end
|
|
150
146
|
|
|
@@ -168,8 +164,6 @@ module Rack
|
|
|
168
164
|
|
|
169
165
|
# Convert HTTP header rules to HTTP headers
|
|
170
166
|
def applicable_rules(path)
|
|
171
|
-
path = ::Rack::Utils.unescape_path(path)
|
|
172
|
-
|
|
173
167
|
@header_rules.find_all do |rule, new_headers|
|
|
174
168
|
case rule
|
|
175
169
|
when :all
|
|
@@ -177,9 +171,10 @@ module Rack
|
|
|
177
171
|
when :fonts
|
|
178
172
|
/\.(?:ttf|otf|eot|woff2|woff|svg)\z/.match?(path)
|
|
179
173
|
when String
|
|
174
|
+
path = ::Rack::Utils.unescape(path)
|
|
180
175
|
path.start_with?(rule) || path.start_with?('/' + rule)
|
|
181
176
|
when Array
|
|
182
|
-
|
|
177
|
+
/\.(#{rule.join('|')})\z/.match?(path)
|
|
183
178
|
when Regexp
|
|
184
179
|
rule.match?(path)
|
|
185
180
|
else
|
data/lib/rack/tempfile_reaper.rb
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative 'constants'
|
|
4
|
+
require_relative 'body_proxy'
|
|
5
|
+
|
|
3
6
|
module Rack
|
|
4
7
|
|
|
5
8
|
# Middleware tracks and cleans Tempfiles created throughout a request (i.e. Rack::Multipart)
|
|
@@ -12,11 +15,19 @@ module Rack
|
|
|
12
15
|
|
|
13
16
|
def call(env)
|
|
14
17
|
env[RACK_TEMPFILES] ||= []
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
+
|
|
19
|
+
begin
|
|
20
|
+
_, _, body = response = @app.call(env)
|
|
21
|
+
rescue Exception
|
|
22
|
+
env[RACK_TEMPFILES]&.each(&:close!)
|
|
23
|
+
raise
|
|
18
24
|
end
|
|
19
|
-
|
|
25
|
+
|
|
26
|
+
response[2] = BodyProxy.new(body) do
|
|
27
|
+
env[RACK_TEMPFILES]&.each(&:close!)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
response
|
|
20
31
|
end
|
|
21
32
|
end
|
|
22
33
|
end
|
data/lib/rack/urlmap.rb
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
require 'set'
|
|
4
4
|
|
|
5
|
+
require_relative 'constants'
|
|
6
|
+
|
|
5
7
|
module Rack
|
|
6
8
|
# Rack::URLMap takes a hash mapping urls or paths to apps, and
|
|
7
9
|
# dispatches accordingly. Support for HTTP/1.1 host names exists if
|
|
@@ -35,7 +37,7 @@ module Rack
|
|
|
35
37
|
end
|
|
36
38
|
|
|
37
39
|
location = location.chomp('/')
|
|
38
|
-
match = Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)",
|
|
40
|
+
match = Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", nil, 'n')
|
|
39
41
|
|
|
40
42
|
[host, location, match, app]
|
|
41
43
|
}.sort_by do |(host, location, _, _)|
|
|
@@ -74,7 +76,7 @@ module Rack
|
|
|
74
76
|
return app.call(env)
|
|
75
77
|
end
|
|
76
78
|
|
|
77
|
-
[404, { CONTENT_TYPE => "text/plain", "
|
|
79
|
+
[404, { CONTENT_TYPE => "text/plain", "x-cascade" => "pass" }, ["Not Found: #{path}"]]
|
|
78
80
|
|
|
79
81
|
ensure
|
|
80
82
|
env[PATH_INFO] = path
|