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.
Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +90 -537
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +2 -2
  5. data/lib/abstract_controller/asset_paths.rb +2 -0
  6. data/lib/abstract_controller/base.rb +119 -106
  7. data/lib/abstract_controller/caching/fragments.rb +51 -52
  8. data/lib/abstract_controller/caching.rb +2 -0
  9. data/lib/abstract_controller/callbacks.rb +94 -67
  10. data/lib/abstract_controller/collector.rb +6 -6
  11. data/lib/abstract_controller/deprecator.rb +9 -0
  12. data/lib/abstract_controller/error.rb +2 -0
  13. data/lib/abstract_controller/helpers.rb +121 -91
  14. data/lib/abstract_controller/logger.rb +2 -0
  15. data/lib/abstract_controller/railties/routes_helpers.rb +3 -16
  16. data/lib/abstract_controller/rendering.rb +14 -13
  17. data/lib/abstract_controller/translation.rb +12 -30
  18. data/lib/abstract_controller/url_for.rb +9 -5
  19. data/lib/abstract_controller.rb +8 -0
  20. data/lib/action_controller/api/api_rendering.rb +2 -0
  21. data/lib/action_controller/api.rb +78 -73
  22. data/lib/action_controller/base.rb +199 -141
  23. data/lib/action_controller/caching.rb +16 -11
  24. data/lib/action_controller/deprecator.rb +9 -0
  25. data/lib/action_controller/form_builder.rb +21 -16
  26. data/lib/action_controller/log_subscriber.rb +19 -5
  27. data/lib/action_controller/metal/allow_browser.rb +123 -0
  28. data/lib/action_controller/metal/basic_implicit_render.rb +2 -0
  29. data/lib/action_controller/metal/conditional_get.rb +187 -174
  30. data/lib/action_controller/metal/content_security_policy.rb +26 -25
  31. data/lib/action_controller/metal/cookies.rb +4 -2
  32. data/lib/action_controller/metal/data_streaming.rb +65 -54
  33. data/lib/action_controller/metal/default_headers.rb +6 -2
  34. data/lib/action_controller/metal/etag_with_flash.rb +4 -0
  35. data/lib/action_controller/metal/etag_with_template_digest.rb +18 -14
  36. data/lib/action_controller/metal/exceptions.rb +19 -9
  37. data/lib/action_controller/metal/flash.rb +12 -10
  38. data/lib/action_controller/metal/head.rb +20 -16
  39. data/lib/action_controller/metal/helpers.rb +64 -67
  40. data/lib/action_controller/metal/http_authentication.rb +212 -199
  41. data/lib/action_controller/metal/implicit_render.rb +21 -17
  42. data/lib/action_controller/metal/instrumentation.rb +22 -12
  43. data/lib/action_controller/metal/live.rb +125 -92
  44. data/lib/action_controller/metal/logging.rb +6 -4
  45. data/lib/action_controller/metal/mime_responds.rb +151 -142
  46. data/lib/action_controller/metal/parameter_encoding.rb +34 -32
  47. data/lib/action_controller/metal/params_wrapper.rb +58 -58
  48. data/lib/action_controller/metal/permissions_policy.rb +14 -13
  49. data/lib/action_controller/metal/rate_limiting.rb +62 -0
  50. data/lib/action_controller/metal/redirecting.rb +110 -84
  51. data/lib/action_controller/metal/renderers.rb +50 -49
  52. data/lib/action_controller/metal/rendering.rb +103 -82
  53. data/lib/action_controller/metal/request_forgery_protection.rb +279 -161
  54. data/lib/action_controller/metal/rescue.rb +12 -8
  55. data/lib/action_controller/metal/streaming.rb +174 -132
  56. data/lib/action_controller/metal/strong_parameters.rb +598 -473
  57. data/lib/action_controller/metal/testing.rb +2 -0
  58. data/lib/action_controller/metal/url_for.rb +23 -14
  59. data/lib/action_controller/metal.rb +145 -61
  60. data/lib/action_controller/railtie.rb +25 -9
  61. data/lib/action_controller/railties/helpers.rb +2 -0
  62. data/lib/action_controller/renderer.rb +105 -66
  63. data/lib/action_controller/template_assertions.rb +4 -2
  64. data/lib/action_controller/test_case.rb +157 -128
  65. data/lib/action_controller.rb +17 -3
  66. data/lib/action_dispatch/constants.rb +34 -0
  67. data/lib/action_dispatch/deprecator.rb +9 -0
  68. data/lib/action_dispatch/http/cache.rb +28 -29
  69. data/lib/action_dispatch/http/content_disposition.rb +2 -0
  70. data/lib/action_dispatch/http/content_security_policy.rb +48 -45
  71. data/lib/action_dispatch/http/filter_parameters.rb +18 -8
  72. data/lib/action_dispatch/http/filter_redirect.rb +22 -1
  73. data/lib/action_dispatch/http/headers.rb +23 -21
  74. data/lib/action_dispatch/http/mime_negotiation.rb +37 -48
  75. data/lib/action_dispatch/http/mime_type.rb +60 -30
  76. data/lib/action_dispatch/http/mime_types.rb +5 -1
  77. data/lib/action_dispatch/http/parameters.rb +12 -10
  78. data/lib/action_dispatch/http/permissions_policy.rb +32 -27
  79. data/lib/action_dispatch/http/rack_cache.rb +4 -0
  80. data/lib/action_dispatch/http/request.rb +132 -79
  81. data/lib/action_dispatch/http/response.rb +136 -103
  82. data/lib/action_dispatch/http/upload.rb +19 -15
  83. data/lib/action_dispatch/http/url.rb +75 -73
  84. data/lib/action_dispatch/journey/formatter.rb +19 -6
  85. data/lib/action_dispatch/journey/gtg/builder.rb +4 -3
  86. data/lib/action_dispatch/journey/gtg/simulator.rb +2 -0
  87. data/lib/action_dispatch/journey/gtg/transition_table.rb +10 -8
  88. data/lib/action_dispatch/journey/nfa/dot.rb +2 -0
  89. data/lib/action_dispatch/journey/nodes/node.rb +6 -5
  90. data/lib/action_dispatch/journey/parser.rb +4 -3
  91. data/lib/action_dispatch/journey/parser_extras.rb +2 -0
  92. data/lib/action_dispatch/journey/path/pattern.rb +18 -15
  93. data/lib/action_dispatch/journey/route.rb +12 -9
  94. data/lib/action_dispatch/journey/router/utils.rb +16 -15
  95. data/lib/action_dispatch/journey/router.rb +13 -10
  96. data/lib/action_dispatch/journey/routes.rb +6 -4
  97. data/lib/action_dispatch/journey/scanner.rb +4 -2
  98. data/lib/action_dispatch/journey/visitors.rb +2 -0
  99. data/lib/action_dispatch/journey.rb +2 -0
  100. data/lib/action_dispatch/log_subscriber.rb +25 -0
  101. data/lib/action_dispatch/middleware/actionable_exceptions.rb +7 -6
  102. data/lib/action_dispatch/middleware/assume_ssl.rb +27 -0
  103. data/lib/action_dispatch/middleware/callbacks.rb +4 -0
  104. data/lib/action_dispatch/middleware/cookies.rb +192 -194
  105. data/lib/action_dispatch/middleware/debug_exceptions.rb +36 -27
  106. data/lib/action_dispatch/middleware/debug_locks.rb +18 -13
  107. data/lib/action_dispatch/middleware/debug_view.rb +9 -2
  108. data/lib/action_dispatch/middleware/exception_wrapper.rb +181 -27
  109. data/lib/action_dispatch/middleware/executor.rb +9 -1
  110. data/lib/action_dispatch/middleware/flash.rb +65 -46
  111. data/lib/action_dispatch/middleware/host_authorization.rb +22 -17
  112. data/lib/action_dispatch/middleware/public_exceptions.rb +12 -8
  113. data/lib/action_dispatch/middleware/reloader.rb +9 -5
  114. data/lib/action_dispatch/middleware/remote_ip.rb +88 -83
  115. data/lib/action_dispatch/middleware/request_id.rb +15 -8
  116. data/lib/action_dispatch/middleware/server_timing.rb +8 -6
  117. data/lib/action_dispatch/middleware/session/abstract_store.rb +7 -0
  118. data/lib/action_dispatch/middleware/session/cache_store.rb +14 -7
  119. data/lib/action_dispatch/middleware/session/cookie_store.rb +32 -25
  120. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +9 -3
  121. data/lib/action_dispatch/middleware/show_exceptions.rb +42 -28
  122. data/lib/action_dispatch/middleware/ssl.rb +60 -45
  123. data/lib/action_dispatch/middleware/stack.rb +15 -9
  124. data/lib/action_dispatch/middleware/static.rb +40 -34
  125. data/lib/action_dispatch/middleware/templates/rescues/_actions.html.erb +2 -2
  126. data/lib/action_dispatch/middleware/templates/rescues/_message_and_suggestions.html.erb +4 -4
  127. data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +8 -1
  128. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +7 -7
  129. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +2 -2
  130. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +17 -0
  131. data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.html.erb +16 -12
  132. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +1 -1
  133. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +3 -3
  134. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +4 -4
  135. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +1 -1
  136. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +1 -1
  137. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +3 -0
  138. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +47 -38
  139. data/lib/action_dispatch/railtie.rb +12 -4
  140. data/lib/action_dispatch/request/session.rb +39 -27
  141. data/lib/action_dispatch/request/utils.rb +10 -3
  142. data/lib/action_dispatch/routing/endpoint.rb +2 -0
  143. data/lib/action_dispatch/routing/inspector.rb +59 -9
  144. data/lib/action_dispatch/routing/mapper.rb +686 -639
  145. data/lib/action_dispatch/routing/polymorphic_routes.rb +70 -61
  146. data/lib/action_dispatch/routing/redirection.rb +52 -38
  147. data/lib/action_dispatch/routing/route_set.rb +106 -62
  148. data/lib/action_dispatch/routing/routes_proxy.rb +16 -19
  149. data/lib/action_dispatch/routing/url_for.rb +131 -122
  150. data/lib/action_dispatch/routing.rb +152 -150
  151. data/lib/action_dispatch/system_test_case.rb +91 -81
  152. data/lib/action_dispatch/system_testing/browser.rb +27 -19
  153. data/lib/action_dispatch/system_testing/driver.rb +16 -22
  154. data/lib/action_dispatch/system_testing/server.rb +2 -0
  155. data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +53 -31
  156. data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +2 -0
  157. data/lib/action_dispatch/testing/assertion_response.rb +9 -7
  158. data/lib/action_dispatch/testing/assertions/response.rb +36 -26
  159. data/lib/action_dispatch/testing/assertions/routing.rb +203 -95
  160. data/lib/action_dispatch/testing/assertions.rb +5 -1
  161. data/lib/action_dispatch/testing/integration.rb +240 -229
  162. data/lib/action_dispatch/testing/request_encoder.rb +6 -1
  163. data/lib/action_dispatch/testing/test_helpers/page_dump_helper.rb +35 -0
  164. data/lib/action_dispatch/testing/test_process.rb +14 -9
  165. data/lib/action_dispatch/testing/test_request.rb +4 -2
  166. data/lib/action_dispatch/testing/test_response.rb +34 -19
  167. data/lib/action_dispatch.rb +52 -21
  168. data/lib/action_pack/gem_version.rb +6 -4
  169. data/lib/action_pack/version.rb +3 -1
  170. data/lib/action_pack.rb +18 -17
  171. metadata +86 -27
@@ -1,78 +1,133 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # :markup: markdown
4
+
3
5
  module ActionController
4
- # ActionController::Renderer allows you to render arbitrary templates
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
- # You can use this shortcut in a controller, instead of the previous example:
8
+ # ActionController::Renderer allows you to render arbitrary templates without
9
+ # being inside a controller action.
17
10
  #
18
- # ApplicationController.render template: '...'
11
+ # You can get a renderer instance by calling `renderer` on a controller class:
19
12
  #
20
- # #render allows you to use the same options that you can use when rendering in a controller.
21
- # For example:
13
+ # ApplicationController.renderer
14
+ # PostsController.renderer
22
15
  #
23
- # FooController.render :action, locals: { ... }, assigns: { ... }
16
+ # and render a template by calling the #render method:
24
17
  #
25
- # The template will be rendered in a Rack environment which is accessible through
26
- # ActionController::Renderer#env. You can set it up in two ways:
18
+ # ApplicationController.renderer.render template: "posts/show", assigns: { post: Post.first }
19
+ # PostsController.renderer.render :show, assigns: { post: Post.first }
27
20
  #
28
- # * by changing renderer defaults, like
21
+ # As a shortcut, you can also call `render` directly on the controller class
22
+ # itself:
29
23
  #
30
- # ApplicationController.renderer.defaults # => hash with default Rack environment
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 :defaults, :controller
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
- # Create a new renderer instance for a specific controller class.
48
- def self.for(controller, env = {}, defaults = DEFAULTS.dup)
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
- # Create a new renderer for the same controller but with a new env.
53
- def new(env = {})
54
- self.class.new controller, env, defaults
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
- # Create a new renderer for the same controller but with new defaults.
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, self.defaults.merge(defaults)
79
+ self.class.new controller, @env, @defaults.merge(defaults)
60
80
  end
61
81
 
62
- # Accepts a custom Rack environment to render templates in.
63
- # It will be merged with the default Rack environment defined by
64
- # +ActionController::Renderer::DEFAULTS+.
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
- @env = normalize_keys defaults, env
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
- # Renders a template to a string, just like ActionController::Rendering#render_to_string.
72
- def render(*args)
73
- raise "missing controller" unless controller
122
+ def defaults
123
+ @defaults = @defaults.dup if @defaults.frozen?
124
+ @defaults
125
+ end
74
126
 
75
- request = ActionDispatch::Request.new @env
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
- def rack_key_for(key)
108
- RACK_KEY_TRANSLATION[key] || key.to_s
109
- end
149
+ DEFAULT_ENV = normalize_env(DEFAULTS).freeze # :nodoc:
110
150
 
111
- def rack_value_for(key, value)
112
- case key
113
- when :https
114
- value ? "on" : "off"
115
- when :method
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
- value
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
- "assert_template has been extracted to a gem. To continue using it,
8
- add `gem 'rails-controller-testing'` to your Gemfile."
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