actionpack 7.0.8.7 → 7.2.2.1
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 +90 -537
- data/MIT-LICENSE +1 -1
- data/README.rdoc +2 -2
- data/lib/abstract_controller/asset_paths.rb +2 -0
- data/lib/abstract_controller/base.rb +119 -106
- data/lib/abstract_controller/caching/fragments.rb +51 -52
- data/lib/abstract_controller/caching.rb +2 -0
- data/lib/abstract_controller/callbacks.rb +94 -67
- data/lib/abstract_controller/collector.rb +6 -6
- data/lib/abstract_controller/deprecator.rb +9 -0
- data/lib/abstract_controller/error.rb +2 -0
- data/lib/abstract_controller/helpers.rb +121 -91
- data/lib/abstract_controller/logger.rb +2 -0
- data/lib/abstract_controller/railties/routes_helpers.rb +3 -16
- data/lib/abstract_controller/rendering.rb +14 -13
- data/lib/abstract_controller/translation.rb +12 -30
- data/lib/abstract_controller/url_for.rb +9 -5
- data/lib/abstract_controller.rb +8 -0
- data/lib/action_controller/api/api_rendering.rb +2 -0
- data/lib/action_controller/api.rb +78 -73
- data/lib/action_controller/base.rb +199 -141
- data/lib/action_controller/caching.rb +16 -11
- data/lib/action_controller/deprecator.rb +9 -0
- data/lib/action_controller/form_builder.rb +21 -16
- data/lib/action_controller/log_subscriber.rb +19 -5
- data/lib/action_controller/metal/allow_browser.rb +123 -0
- data/lib/action_controller/metal/basic_implicit_render.rb +2 -0
- data/lib/action_controller/metal/conditional_get.rb +187 -174
- data/lib/action_controller/metal/content_security_policy.rb +26 -25
- data/lib/action_controller/metal/cookies.rb +4 -2
- data/lib/action_controller/metal/data_streaming.rb +65 -54
- data/lib/action_controller/metal/default_headers.rb +6 -2
- data/lib/action_controller/metal/etag_with_flash.rb +4 -0
- data/lib/action_controller/metal/etag_with_template_digest.rb +18 -14
- data/lib/action_controller/metal/exceptions.rb +19 -9
- data/lib/action_controller/metal/flash.rb +12 -10
- data/lib/action_controller/metal/head.rb +20 -16
- data/lib/action_controller/metal/helpers.rb +64 -67
- data/lib/action_controller/metal/http_authentication.rb +212 -199
- data/lib/action_controller/metal/implicit_render.rb +21 -17
- data/lib/action_controller/metal/instrumentation.rb +22 -12
- data/lib/action_controller/metal/live.rb +125 -92
- data/lib/action_controller/metal/logging.rb +6 -4
- data/lib/action_controller/metal/mime_responds.rb +151 -142
- data/lib/action_controller/metal/parameter_encoding.rb +34 -32
- data/lib/action_controller/metal/params_wrapper.rb +58 -58
- data/lib/action_controller/metal/permissions_policy.rb +14 -13
- data/lib/action_controller/metal/rate_limiting.rb +62 -0
- data/lib/action_controller/metal/redirecting.rb +110 -84
- data/lib/action_controller/metal/renderers.rb +50 -49
- data/lib/action_controller/metal/rendering.rb +103 -82
- data/lib/action_controller/metal/request_forgery_protection.rb +279 -161
- data/lib/action_controller/metal/rescue.rb +12 -8
- data/lib/action_controller/metal/streaming.rb +174 -132
- data/lib/action_controller/metal/strong_parameters.rb +598 -473
- data/lib/action_controller/metal/testing.rb +2 -0
- data/lib/action_controller/metal/url_for.rb +23 -14
- data/lib/action_controller/metal.rb +145 -61
- data/lib/action_controller/railtie.rb +25 -9
- data/lib/action_controller/railties/helpers.rb +2 -0
- data/lib/action_controller/renderer.rb +105 -66
- data/lib/action_controller/template_assertions.rb +4 -2
- data/lib/action_controller/test_case.rb +157 -128
- data/lib/action_controller.rb +17 -3
- data/lib/action_dispatch/constants.rb +34 -0
- data/lib/action_dispatch/deprecator.rb +9 -0
- data/lib/action_dispatch/http/cache.rb +28 -29
- data/lib/action_dispatch/http/content_disposition.rb +2 -0
- data/lib/action_dispatch/http/content_security_policy.rb +48 -45
- data/lib/action_dispatch/http/filter_parameters.rb +18 -8
- data/lib/action_dispatch/http/filter_redirect.rb +22 -1
- data/lib/action_dispatch/http/headers.rb +23 -21
- data/lib/action_dispatch/http/mime_negotiation.rb +37 -48
- data/lib/action_dispatch/http/mime_type.rb +60 -30
- data/lib/action_dispatch/http/mime_types.rb +5 -1
- data/lib/action_dispatch/http/parameters.rb +12 -10
- data/lib/action_dispatch/http/permissions_policy.rb +32 -27
- data/lib/action_dispatch/http/rack_cache.rb +4 -0
- data/lib/action_dispatch/http/request.rb +132 -79
- data/lib/action_dispatch/http/response.rb +136 -103
- data/lib/action_dispatch/http/upload.rb +19 -15
- data/lib/action_dispatch/http/url.rb +75 -73
- data/lib/action_dispatch/journey/formatter.rb +19 -6
- data/lib/action_dispatch/journey/gtg/builder.rb +4 -3
- data/lib/action_dispatch/journey/gtg/simulator.rb +2 -0
- data/lib/action_dispatch/journey/gtg/transition_table.rb +10 -8
- data/lib/action_dispatch/journey/nfa/dot.rb +2 -0
- data/lib/action_dispatch/journey/nodes/node.rb +6 -5
- data/lib/action_dispatch/journey/parser.rb +4 -3
- data/lib/action_dispatch/journey/parser_extras.rb +2 -0
- data/lib/action_dispatch/journey/path/pattern.rb +18 -15
- data/lib/action_dispatch/journey/route.rb +12 -9
- data/lib/action_dispatch/journey/router/utils.rb +16 -15
- data/lib/action_dispatch/journey/router.rb +13 -10
- data/lib/action_dispatch/journey/routes.rb +6 -4
- data/lib/action_dispatch/journey/scanner.rb +4 -2
- data/lib/action_dispatch/journey/visitors.rb +2 -0
- data/lib/action_dispatch/journey.rb +2 -0
- data/lib/action_dispatch/log_subscriber.rb +25 -0
- data/lib/action_dispatch/middleware/actionable_exceptions.rb +7 -6
- data/lib/action_dispatch/middleware/assume_ssl.rb +27 -0
- data/lib/action_dispatch/middleware/callbacks.rb +4 -0
- data/lib/action_dispatch/middleware/cookies.rb +192 -194
- data/lib/action_dispatch/middleware/debug_exceptions.rb +36 -27
- data/lib/action_dispatch/middleware/debug_locks.rb +18 -13
- data/lib/action_dispatch/middleware/debug_view.rb +9 -2
- data/lib/action_dispatch/middleware/exception_wrapper.rb +181 -27
- data/lib/action_dispatch/middleware/executor.rb +9 -1
- data/lib/action_dispatch/middleware/flash.rb +65 -46
- data/lib/action_dispatch/middleware/host_authorization.rb +22 -17
- data/lib/action_dispatch/middleware/public_exceptions.rb +12 -8
- data/lib/action_dispatch/middleware/reloader.rb +9 -5
- data/lib/action_dispatch/middleware/remote_ip.rb +88 -83
- data/lib/action_dispatch/middleware/request_id.rb +15 -8
- data/lib/action_dispatch/middleware/server_timing.rb +8 -6
- data/lib/action_dispatch/middleware/session/abstract_store.rb +7 -0
- data/lib/action_dispatch/middleware/session/cache_store.rb +14 -7
- data/lib/action_dispatch/middleware/session/cookie_store.rb +32 -25
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +9 -3
- data/lib/action_dispatch/middleware/show_exceptions.rb +42 -28
- data/lib/action_dispatch/middleware/ssl.rb +60 -45
- data/lib/action_dispatch/middleware/stack.rb +15 -9
- data/lib/action_dispatch/middleware/static.rb +40 -34
- data/lib/action_dispatch/middleware/templates/rescues/_actions.html.erb +2 -2
- data/lib/action_dispatch/middleware/templates/rescues/_message_and_suggestions.html.erb +4 -4
- data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +8 -1
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +7 -7
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +2 -2
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +17 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.html.erb +16 -12
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +1 -1
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +3 -3
- data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +4 -4
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +1 -1
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +1 -1
- data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +3 -0
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +47 -38
- data/lib/action_dispatch/railtie.rb +12 -4
- data/lib/action_dispatch/request/session.rb +39 -27
- data/lib/action_dispatch/request/utils.rb +10 -3
- data/lib/action_dispatch/routing/endpoint.rb +2 -0
- data/lib/action_dispatch/routing/inspector.rb +59 -9
- data/lib/action_dispatch/routing/mapper.rb +686 -639
- data/lib/action_dispatch/routing/polymorphic_routes.rb +70 -61
- data/lib/action_dispatch/routing/redirection.rb +52 -38
- data/lib/action_dispatch/routing/route_set.rb +106 -62
- data/lib/action_dispatch/routing/routes_proxy.rb +16 -19
- data/lib/action_dispatch/routing/url_for.rb +131 -122
- data/lib/action_dispatch/routing.rb +152 -150
- data/lib/action_dispatch/system_test_case.rb +91 -81
- data/lib/action_dispatch/system_testing/browser.rb +27 -19
- data/lib/action_dispatch/system_testing/driver.rb +16 -22
- data/lib/action_dispatch/system_testing/server.rb +2 -0
- data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +53 -31
- data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +2 -0
- data/lib/action_dispatch/testing/assertion_response.rb +9 -7
- data/lib/action_dispatch/testing/assertions/response.rb +36 -26
- data/lib/action_dispatch/testing/assertions/routing.rb +203 -95
- data/lib/action_dispatch/testing/assertions.rb +5 -1
- data/lib/action_dispatch/testing/integration.rb +240 -229
- data/lib/action_dispatch/testing/request_encoder.rb +6 -1
- data/lib/action_dispatch/testing/test_helpers/page_dump_helper.rb +35 -0
- data/lib/action_dispatch/testing/test_process.rb +14 -9
- data/lib/action_dispatch/testing/test_request.rb +4 -2
- data/lib/action_dispatch/testing/test_response.rb +34 -19
- data/lib/action_dispatch.rb +52 -21
- data/lib/action_pack/gem_version.rb +6 -4
- data/lib/action_pack/version.rb +3 -1
- data/lib/action_pack.rb +18 -17
- metadata +86 -27
@@ -1,78 +1,133 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# :markup: markdown
|
4
|
+
|
3
5
|
module ActionController
|
4
|
-
#
|
5
|
-
# without requirement of being in controller actions.
|
6
|
-
#
|
7
|
-
# You get a concrete renderer class by invoking ActionController::Base#renderer.
|
8
|
-
# For example:
|
9
|
-
#
|
10
|
-
# ApplicationController.renderer
|
11
|
-
#
|
12
|
-
# It allows you to call method #render directly.
|
13
|
-
#
|
14
|
-
# ApplicationController.renderer.render template: '...'
|
6
|
+
# # Action Controller Renderer
|
15
7
|
#
|
16
|
-
#
|
8
|
+
# ActionController::Renderer allows you to render arbitrary templates without
|
9
|
+
# being inside a controller action.
|
17
10
|
#
|
18
|
-
#
|
11
|
+
# You can get a renderer instance by calling `renderer` on a controller class:
|
19
12
|
#
|
20
|
-
#
|
21
|
-
#
|
13
|
+
# ApplicationController.renderer
|
14
|
+
# PostsController.renderer
|
22
15
|
#
|
23
|
-
#
|
16
|
+
# and render a template by calling the #render method:
|
24
17
|
#
|
25
|
-
#
|
26
|
-
#
|
18
|
+
# ApplicationController.renderer.render template: "posts/show", assigns: { post: Post.first }
|
19
|
+
# PostsController.renderer.render :show, assigns: { post: Post.first }
|
27
20
|
#
|
28
|
-
#
|
21
|
+
# As a shortcut, you can also call `render` directly on the controller class
|
22
|
+
# itself:
|
29
23
|
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
# * by initializing an instance of renderer by passing it a custom environment.
|
33
|
-
#
|
34
|
-
# ApplicationController.renderer.new(method: 'post', https: true)
|
24
|
+
# ApplicationController.render template: "posts/show", assigns: { post: Post.first }
|
25
|
+
# PostsController.render :show, assigns: { post: Post.first }
|
35
26
|
#
|
36
27
|
class Renderer
|
37
|
-
attr_reader :
|
28
|
+
attr_reader :controller
|
38
29
|
|
39
30
|
DEFAULTS = {
|
40
|
-
http_host: "example.org",
|
41
|
-
https: false,
|
42
31
|
method: "get",
|
43
|
-
script_name: "",
|
44
32
|
input: ""
|
45
33
|
}.freeze
|
46
34
|
|
47
|
-
|
48
|
-
|
35
|
+
def self.normalize_env(env) # :nodoc:
|
36
|
+
new_env = {}
|
37
|
+
|
38
|
+
env.each_pair do |key, value|
|
39
|
+
case key
|
40
|
+
when :https
|
41
|
+
value = value ? "on" : "off"
|
42
|
+
when :method
|
43
|
+
value = -value.upcase
|
44
|
+
end
|
45
|
+
|
46
|
+
key = RACK_KEY_TRANSLATION[key] || key.to_s
|
47
|
+
|
48
|
+
new_env[key] = value
|
49
|
+
end
|
50
|
+
|
51
|
+
if new_env["HTTP_HOST"]
|
52
|
+
new_env["HTTPS"] ||= "off"
|
53
|
+
new_env["SCRIPT_NAME"] ||= ""
|
54
|
+
end
|
55
|
+
|
56
|
+
if new_env["HTTPS"]
|
57
|
+
new_env["rack.url_scheme"] = new_env["HTTPS"] == "on" ? "https" : "http"
|
58
|
+
end
|
59
|
+
|
60
|
+
new_env
|
61
|
+
end
|
62
|
+
|
63
|
+
# Creates a new renderer using the given controller class. See ::new.
|
64
|
+
def self.for(controller, env = nil, defaults = DEFAULTS)
|
49
65
|
new(controller, env, defaults)
|
50
66
|
end
|
51
67
|
|
52
|
-
#
|
53
|
-
|
54
|
-
|
68
|
+
# Creates a new renderer using the same controller, but with a new Rack env.
|
69
|
+
#
|
70
|
+
# ApplicationController.renderer.new(method: "post")
|
71
|
+
#
|
72
|
+
def new(env = nil)
|
73
|
+
self.class.new controller, env, @defaults
|
55
74
|
end
|
56
75
|
|
57
|
-
#
|
76
|
+
# Creates a new renderer using the same controller, but with the given defaults
|
77
|
+
# merged on top of the previous defaults.
|
58
78
|
def with_defaults(defaults)
|
59
|
-
self.class.new controller, @env,
|
79
|
+
self.class.new controller, @env, @defaults.merge(defaults)
|
60
80
|
end
|
61
81
|
|
62
|
-
#
|
63
|
-
#
|
64
|
-
#
|
82
|
+
# Initializes a new Renderer.
|
83
|
+
#
|
84
|
+
# #### Parameters
|
85
|
+
#
|
86
|
+
# * `controller` - The controller class to instantiate for rendering.
|
87
|
+
# * `env` - The Rack env to use for mocking a request when rendering. Entries
|
88
|
+
# can be typical Rack env keys and values, or they can be any of the
|
89
|
+
# following, which will be converted appropriately:
|
90
|
+
# * `:http_host` - The HTTP host for the incoming request. Converts to
|
91
|
+
# Rack's `HTTP_HOST`.
|
92
|
+
# * `:https` - Boolean indicating whether the incoming request uses HTTPS.
|
93
|
+
# Converts to Rack's `HTTPS`.
|
94
|
+
# * `:method` - The HTTP method for the incoming request,
|
95
|
+
# case-insensitive. Converts to Rack's `REQUEST_METHOD`.
|
96
|
+
# * `:script_name` - The portion of the incoming request's URL path that
|
97
|
+
# corresponds to the application. Converts to Rack's `SCRIPT_NAME`.
|
98
|
+
# * `:input` - The input stream. Converts to Rack's `rack.input`.
|
99
|
+
#
|
100
|
+
# * `defaults` - Default values for the Rack env. Entries are specified in the
|
101
|
+
# same format as `env`. `env` will be merged on top of these values.
|
102
|
+
# `defaults` will be retained when calling #new on a renderer instance.
|
103
|
+
#
|
104
|
+
#
|
105
|
+
# If no `http_host` is specified, the env HTTP host will be derived from the
|
106
|
+
# routes' `default_url_options`. In this case, the `https` boolean and the
|
107
|
+
# `script_name` will also be derived from `default_url_options` if they were not
|
108
|
+
# specified. Additionally, the `https` boolean will fall back to
|
109
|
+
# `Rails.application.config.force_ssl` if `default_url_options` does not specify
|
110
|
+
# a `protocol`.
|
65
111
|
def initialize(controller, env, defaults)
|
66
112
|
@controller = controller
|
67
113
|
@defaults = defaults
|
68
|
-
|
114
|
+
if env.blank? && @defaults == DEFAULTS
|
115
|
+
@env = DEFAULT_ENV
|
116
|
+
else
|
117
|
+
@env = normalize_env(@defaults)
|
118
|
+
@env.merge!(normalize_env(env)) unless env.blank?
|
119
|
+
end
|
69
120
|
end
|
70
121
|
|
71
|
-
|
72
|
-
|
73
|
-
|
122
|
+
def defaults
|
123
|
+
@defaults = @defaults.dup if @defaults.frozen?
|
124
|
+
@defaults
|
125
|
+
end
|
74
126
|
|
75
|
-
|
127
|
+
# Renders a template to a string, just like
|
128
|
+
# ActionController::Rendering#render_to_string.
|
129
|
+
def render(*args)
|
130
|
+
request = ActionDispatch::Request.new(env_for_request)
|
76
131
|
request.routes = controller._routes
|
77
132
|
|
78
133
|
instance = controller.new
|
@@ -83,19 +138,6 @@ module ActionController
|
|
83
138
|
alias_method :render_to_string, :render # :nodoc:
|
84
139
|
|
85
140
|
private
|
86
|
-
def normalize_keys(defaults, env)
|
87
|
-
new_env = {}
|
88
|
-
env.each_pair { |k, v| new_env[rack_key_for(k)] = rack_value_for(k, v) }
|
89
|
-
|
90
|
-
defaults.each_pair do |k, v|
|
91
|
-
key = rack_key_for(k)
|
92
|
-
new_env[key] = rack_value_for(k, v) unless new_env.key?(key)
|
93
|
-
end
|
94
|
-
|
95
|
-
new_env["rack.url_scheme"] = new_env["HTTPS"] == "on" ? "https" : "http"
|
96
|
-
new_env
|
97
|
-
end
|
98
|
-
|
99
141
|
RACK_KEY_TRANSLATION = {
|
100
142
|
http_host: "HTTP_HOST",
|
101
143
|
https: "HTTPS",
|
@@ -104,18 +146,15 @@ module ActionController
|
|
104
146
|
input: "rack.input"
|
105
147
|
}
|
106
148
|
|
107
|
-
|
108
|
-
RACK_KEY_TRANSLATION[key] || key.to_s
|
109
|
-
end
|
149
|
+
DEFAULT_ENV = normalize_env(DEFAULTS).freeze # :nodoc:
|
110
150
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
-value.upcase
|
151
|
+
delegate :normalize_env, to: :class
|
152
|
+
|
153
|
+
def env_for_request
|
154
|
+
if @env.key?("HTTP_HOST") || controller._routes.nil?
|
155
|
+
@env.dup
|
117
156
|
else
|
118
|
-
|
157
|
+
controller._routes.default_env.merge(@env)
|
119
158
|
end
|
120
159
|
end
|
121
160
|
end
|
@@ -1,11 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# :markup: markdown
|
4
|
+
|
3
5
|
module ActionController
|
4
6
|
module TemplateAssertions # :nodoc:
|
5
7
|
def assert_template(options = {}, message = nil)
|
6
8
|
raise NoMethodError,
|
7
|
-
|
8
|
-
add `gem
|
9
|
+
'assert_template has been extracted to a gem. To continue using it,
|
10
|
+
add `gem "rails-controller-testing"` to your Gemfile.'
|
9
11
|
end
|
10
12
|
end
|
11
13
|
end
|