roda 3.55.0 → 3.58.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +34 -0
- data/doc/conventions.rdoc +14 -11
- data/doc/release_notes/3.56.0.txt +33 -0
- data/doc/release_notes/3.57.0.txt +34 -0
- data/doc/release_notes/3.58.0.txt +16 -0
- data/lib/roda/plugins/chunked.rb +1 -1
- data/lib/roda/plugins/common_logger.rb +12 -1
- data/lib/roda/plugins/cookies.rb +2 -0
- data/lib/roda/plugins/exception_page.rb +20 -4
- data/lib/roda/plugins/filter_common_logger.rb +46 -0
- data/lib/roda/plugins/hash_branch_view_subdir.rb +76 -0
- data/lib/roda/plugins/hash_branches.rb +145 -0
- data/lib/roda/plugins/hash_paths.rb +128 -0
- data/lib/roda/plugins/hash_routes.rb +13 -176
- data/lib/roda/plugins/heartbeat.rb +5 -10
- data/lib/roda/plugins/json_parser.rb +6 -2
- data/lib/roda/plugins/multi_public.rb +8 -0
- data/lib/roda/plugins/multi_route.rb +1 -1
- data/lib/roda/plugins/multi_view.rb +0 -4
- data/lib/roda/plugins/named_routes.rb +1 -2
- data/lib/roda/plugins/not_allowed.rb +13 -0
- data/lib/roda/plugins/public.rb +8 -0
- data/lib/roda/plugins/route_csrf.rb +1 -0
- data/lib/roda/plugins/run_append_slash.rb +1 -1
- data/lib/roda/plugins/run_require_slash.rb +46 -0
- data/lib/roda/plugins/sessions.rb +1 -0
- data/lib/roda/plugins/sinatra_helpers.rb +10 -0
- data/lib/roda/plugins/static.rb +2 -0
- data/lib/roda/plugins/static_routing.rb +1 -1
- data/lib/roda/plugins/status_303.rb +6 -3
- data/lib/roda/plugins/status_handler.rb +35 -9
- data/lib/roda/plugins/symbol_status.rb +2 -0
- data/lib/roda/plugins/unescape_path.rb +2 -0
- data/lib/roda/request.rb +35 -1
- data/lib/roda/response.rb +5 -0
- data/lib/roda/version.rb +1 -1
- metadata +30 -5
@@ -15,24 +15,53 @@ class Roda
|
|
15
15
|
# status_handler(403) do
|
16
16
|
# "You are forbidden from seeing that!"
|
17
17
|
# end
|
18
|
+
#
|
18
19
|
# status_handler(404) do
|
19
20
|
# "Where did it go?"
|
20
21
|
# end
|
21
22
|
#
|
23
|
+
# status_handler(405, keep_headers: ['Accept']) do
|
24
|
+
# "Use a different method!"
|
25
|
+
# end
|
26
|
+
#
|
22
27
|
# Before a block is called, any existing headers on the response will be
|
23
|
-
# cleared
|
24
|
-
#
|
28
|
+
# cleared, unless the +:keep_headers+ option is used. If the +:keep_headers+
|
29
|
+
# option is used, the value should be an array, and only the headers listed
|
30
|
+
# in the array will be kept.
|
25
31
|
module StatusHandler
|
32
|
+
CLEAR_HEADERS = :clear.to_proc
|
33
|
+
private_constant :CLEAR_HEADERS
|
34
|
+
|
26
35
|
def self.configure(app)
|
27
36
|
app.opts[:status_handler] ||= {}
|
28
37
|
end
|
29
38
|
|
30
39
|
module ClassMethods
|
31
40
|
# Install the given block as a status handler for the given HTTP response code.
|
32
|
-
def status_handler(code, &block)
|
41
|
+
def status_handler(code, opts=OPTS, &block)
|
33
42
|
# For backwards compatibility, pass request argument if block accepts argument
|
34
43
|
arity = block.arity == 0 ? 0 : 1
|
35
|
-
|
44
|
+
handle_headers = case keep_headers = opts[:keep_headers]
|
45
|
+
when nil, false
|
46
|
+
CLEAR_HEADERS
|
47
|
+
when Array
|
48
|
+
# :nocov:
|
49
|
+
if Rack.release >= '2.3'
|
50
|
+
keep_headers = keep_headers.map(&:downcase)
|
51
|
+
end
|
52
|
+
# :nocov:
|
53
|
+
lambda{|headers| headers.delete_if{|k,_| !keep_headers.include?(k)}}
|
54
|
+
else
|
55
|
+
raise RodaError, "Invalid :keep_headers option"
|
56
|
+
end
|
57
|
+
|
58
|
+
meth = define_roda_method(:"_roda_status_handler__#{code}", arity, &block)
|
59
|
+
self.opts[:status_handler][code] = define_roda_method(:"_roda_status_handler_#{code}", 1) do |result|
|
60
|
+
res = @_response
|
61
|
+
res.status = result[0]
|
62
|
+
handle_headers.call(res.headers)
|
63
|
+
result.replace(_roda_handle_route{arity == 1 ? send(meth, @_request) : send(meth)})
|
64
|
+
end
|
36
65
|
end
|
37
66
|
|
38
67
|
# Freeze the hash of status handlers so that there can be no thread safety issues at runtime.
|
@@ -47,11 +76,8 @@ class Roda
|
|
47
76
|
|
48
77
|
# If routing returns a response we have a handler for, call that handler.
|
49
78
|
def _roda_after_20__status_handler(result)
|
50
|
-
if result && (meth
|
51
|
-
|
52
|
-
res.headers.clear
|
53
|
-
res.status = result[0]
|
54
|
-
result.replace(_roda_handle_route{arity == 1 ? send(meth, @_request) : send(meth)})
|
79
|
+
if result && (meth = opts[:status_handler][result[0]]) && (v = result[2]).is_a?(Array) && v.empty?
|
80
|
+
send(meth, result)
|
55
81
|
end
|
56
82
|
end
|
57
83
|
end
|
data/lib/roda/request.rb
CHANGED
@@ -1,6 +1,19 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
|
3
|
+
# :nocov:
|
4
|
+
begin
|
5
|
+
require "rack/version"
|
6
|
+
rescue LoadError
|
7
|
+
require "rack"
|
8
|
+
else
|
9
|
+
if Rack.release >= '2.3'
|
10
|
+
require "rack/request"
|
11
|
+
else
|
12
|
+
require "rack"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
# :nocov:
|
16
|
+
|
4
17
|
require_relative "cache"
|
5
18
|
|
6
19
|
class Roda
|
@@ -116,6 +129,27 @@ class Roda
|
|
116
129
|
"#<#{self.class.inspect} #{@env["REQUEST_METHOD"]} #{path}>"
|
117
130
|
end
|
118
131
|
|
132
|
+
# :nocov:
|
133
|
+
if Rack.release >= '2.3'
|
134
|
+
def http_version
|
135
|
+
# Prefer SERVER_PROTOCOL as it is required in Rack 3.
|
136
|
+
# Still fall back to HTTP_VERSION if SERVER_PROTOCOL
|
137
|
+
# is not set, in case the server in use is not Rack 3
|
138
|
+
# compliant.
|
139
|
+
@env['SERVER_PROTOCOL'] || @env['HTTP_VERSION']
|
140
|
+
end
|
141
|
+
else
|
142
|
+
# :nocov:
|
143
|
+
# What HTTP version the request was submitted with.
|
144
|
+
def http_version
|
145
|
+
# Prefer HTTP_VERSION as it is backwards compatible
|
146
|
+
# with previous Roda versions. Fallback to
|
147
|
+
# SERVER_PROTOCOL for servers that do not set
|
148
|
+
# HTTP_VERSION.
|
149
|
+
@env['HTTP_VERSION'] || @env['SERVER_PROTOCOL']
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
119
153
|
# Does a terminal match on the current path, matching only if the arguments
|
120
154
|
# have fully matched the path. If it matches, the match block is
|
121
155
|
# executed, and when the match block returns, the rack response is
|
data/lib/roda/response.rb
CHANGED
data/lib/roda/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roda
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.58.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 5.7.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest-hooks
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: minitest-global_expectations
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -213,6 +227,9 @@ extra_rdoc_files:
|
|
213
227
|
- doc/release_notes/3.53.0.txt
|
214
228
|
- doc/release_notes/3.54.0.txt
|
215
229
|
- doc/release_notes/3.55.0.txt
|
230
|
+
- doc/release_notes/3.56.0.txt
|
231
|
+
- doc/release_notes/3.57.0.txt
|
232
|
+
- doc/release_notes/3.58.0.txt
|
216
233
|
- doc/release_notes/3.6.0.txt
|
217
234
|
- doc/release_notes/3.7.0.txt
|
218
235
|
- doc/release_notes/3.8.0.txt
|
@@ -275,6 +292,9 @@ files:
|
|
275
292
|
- doc/release_notes/3.53.0.txt
|
276
293
|
- doc/release_notes/3.54.0.txt
|
277
294
|
- doc/release_notes/3.55.0.txt
|
295
|
+
- doc/release_notes/3.56.0.txt
|
296
|
+
- doc/release_notes/3.57.0.txt
|
297
|
+
- doc/release_notes/3.58.0.txt
|
278
298
|
- doc/release_notes/3.6.0.txt
|
279
299
|
- doc/release_notes/3.7.0.txt
|
280
300
|
- doc/release_notes/3.8.0.txt
|
@@ -318,10 +338,14 @@ files:
|
|
318
338
|
- lib/roda/plugins/error_handler.rb
|
319
339
|
- lib/roda/plugins/error_mail.rb
|
320
340
|
- lib/roda/plugins/exception_page.rb
|
341
|
+
- lib/roda/plugins/filter_common_logger.rb
|
321
342
|
- lib/roda/plugins/flash.rb
|
322
343
|
- lib/roda/plugins/h.rb
|
323
344
|
- lib/roda/plugins/halt.rb
|
345
|
+
- lib/roda/plugins/hash_branch_view_subdir.rb
|
346
|
+
- lib/roda/plugins/hash_branches.rb
|
324
347
|
- lib/roda/plugins/hash_matcher.rb
|
348
|
+
- lib/roda/plugins/hash_paths.rb
|
325
349
|
- lib/roda/plugins/hash_routes.rb
|
326
350
|
- lib/roda/plugins/head.rb
|
327
351
|
- lib/roda/plugins/header_matchers.rb
|
@@ -374,6 +398,7 @@ files:
|
|
374
398
|
- lib/roda/plugins/route_csrf.rb
|
375
399
|
- lib/roda/plugins/run_append_slash.rb
|
376
400
|
- lib/roda/plugins/run_handler.rb
|
401
|
+
- lib/roda/plugins/run_require_slash.rb
|
377
402
|
- lib/roda/plugins/sessions.rb
|
378
403
|
- lib/roda/plugins/shared_vars.rb
|
379
404
|
- lib/roda/plugins/sinatra_helpers.rb
|
@@ -396,13 +421,13 @@ files:
|
|
396
421
|
- lib/roda/response.rb
|
397
422
|
- lib/roda/session_middleware.rb
|
398
423
|
- lib/roda/version.rb
|
399
|
-
homepage:
|
424
|
+
homepage: https://roda.jeremyevans.net
|
400
425
|
licenses:
|
401
426
|
- MIT
|
402
427
|
metadata:
|
403
428
|
bug_tracker_uri: https://github.com/jeremyevans/roda/issues
|
404
|
-
changelog_uri:
|
405
|
-
documentation_uri:
|
429
|
+
changelog_uri: https://roda.jeremyevans.net/rdoc/files/CHANGELOG.html
|
430
|
+
documentation_uri: https://roda.jeremyevans.net/documentation.html
|
406
431
|
mailing_list_uri: https://github.com/jeremyevans/roda/discussions
|
407
432
|
source_code_uri: https://github.com/jeremyevans/roda
|
408
433
|
post_install_message:
|