actionpack 7.0.4 → 7.1.3.4

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


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

Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +397 -269
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +4 -4
  5. data/lib/abstract_controller/base.rb +20 -11
  6. data/lib/abstract_controller/caching/fragments.rb +2 -0
  7. data/lib/abstract_controller/callbacks.rb +31 -6
  8. data/lib/abstract_controller/deprecator.rb +7 -0
  9. data/lib/abstract_controller/helpers.rb +75 -28
  10. data/lib/abstract_controller/railties/routes_helpers.rb +1 -16
  11. data/lib/abstract_controller/rendering.rb +12 -14
  12. data/lib/abstract_controller/translation.rb +9 -6
  13. data/lib/abstract_controller/url_for.rb +2 -0
  14. data/lib/abstract_controller.rb +6 -0
  15. data/lib/action_controller/api.rb +6 -4
  16. data/lib/action_controller/base.rb +3 -17
  17. data/lib/action_controller/caching.rb +2 -0
  18. data/lib/action_controller/deprecator.rb +7 -0
  19. data/lib/action_controller/form_builder.rb +2 -0
  20. data/lib/action_controller/log_subscriber.rb +16 -4
  21. data/lib/action_controller/metal/basic_implicit_render.rb +3 -1
  22. data/lib/action_controller/metal/conditional_get.rb +121 -123
  23. data/lib/action_controller/metal/content_security_policy.rb +5 -5
  24. data/lib/action_controller/metal/data_streaming.rb +20 -18
  25. data/lib/action_controller/metal/default_headers.rb +2 -0
  26. data/lib/action_controller/metal/etag_with_flash.rb +3 -1
  27. data/lib/action_controller/metal/etag_with_template_digest.rb +2 -0
  28. data/lib/action_controller/metal/exceptions.rb +8 -0
  29. data/lib/action_controller/metal/head.rb +9 -7
  30. data/lib/action_controller/metal/helpers.rb +3 -14
  31. data/lib/action_controller/metal/http_authentication.rb +17 -8
  32. data/lib/action_controller/metal/implicit_render.rb +5 -3
  33. data/lib/action_controller/metal/instrumentation.rb +8 -1
  34. data/lib/action_controller/metal/live.rb +25 -1
  35. data/lib/action_controller/metal/mime_responds.rb +2 -2
  36. data/lib/action_controller/metal/params_wrapper.rb +4 -2
  37. data/lib/action_controller/metal/permissions_policy.rb +2 -2
  38. data/lib/action_controller/metal/redirecting.rb +29 -8
  39. data/lib/action_controller/metal/renderers.rb +4 -4
  40. data/lib/action_controller/metal/rendering.rb +114 -9
  41. data/lib/action_controller/metal/request_forgery_protection.rb +144 -53
  42. data/lib/action_controller/metal/rescue.rb +6 -3
  43. data/lib/action_controller/metal/streaming.rb +71 -31
  44. data/lib/action_controller/metal/strong_parameters.rb +158 -101
  45. data/lib/action_controller/metal/url_for.rb +9 -4
  46. data/lib/action_controller/metal.rb +79 -21
  47. data/lib/action_controller/railtie.rb +24 -10
  48. data/lib/action_controller/renderer.rb +99 -85
  49. data/lib/action_controller/test_case.rb +15 -5
  50. data/lib/action_controller.rb +8 -1
  51. data/lib/action_dispatch/constants.rb +32 -0
  52. data/lib/action_dispatch/deprecator.rb +7 -0
  53. data/lib/action_dispatch/http/cache.rb +9 -11
  54. data/lib/action_dispatch/http/content_security_policy.rb +14 -9
  55. data/lib/action_dispatch/http/filter_parameters.rb +14 -28
  56. data/lib/action_dispatch/http/headers.rb +3 -1
  57. data/lib/action_dispatch/http/mime_negotiation.rb +22 -22
  58. data/lib/action_dispatch/http/mime_type.rb +35 -12
  59. data/lib/action_dispatch/http/mime_types.rb +3 -1
  60. data/lib/action_dispatch/http/parameters.rb +1 -1
  61. data/lib/action_dispatch/http/permissions_policy.rb +38 -23
  62. data/lib/action_dispatch/http/rack_cache.rb +2 -0
  63. data/lib/action_dispatch/http/request.rb +63 -30
  64. data/lib/action_dispatch/http/response.rb +80 -63
  65. data/lib/action_dispatch/http/upload.rb +15 -2
  66. data/lib/action_dispatch/journey/formatter.rb +8 -2
  67. data/lib/action_dispatch/journey/path/pattern.rb +14 -14
  68. data/lib/action_dispatch/journey/route.rb +3 -2
  69. data/lib/action_dispatch/journey/router.rb +9 -8
  70. data/lib/action_dispatch/journey/routes.rb +2 -2
  71. data/lib/action_dispatch/log_subscriber.rb +23 -0
  72. data/lib/action_dispatch/middleware/actionable_exceptions.rb +5 -6
  73. data/lib/action_dispatch/middleware/assume_ssl.rb +24 -0
  74. data/lib/action_dispatch/middleware/callbacks.rb +2 -0
  75. data/lib/action_dispatch/middleware/cookies.rb +108 -117
  76. data/lib/action_dispatch/middleware/debug_exceptions.rb +26 -25
  77. data/lib/action_dispatch/middleware/debug_locks.rb +4 -1
  78. data/lib/action_dispatch/middleware/debug_view.rb +7 -2
  79. data/lib/action_dispatch/middleware/exception_wrapper.rb +186 -27
  80. data/lib/action_dispatch/middleware/executor.rb +1 -1
  81. data/lib/action_dispatch/middleware/flash.rb +7 -0
  82. data/lib/action_dispatch/middleware/host_authorization.rb +18 -8
  83. data/lib/action_dispatch/middleware/public_exceptions.rb +5 -3
  84. data/lib/action_dispatch/middleware/reloader.rb +7 -5
  85. data/lib/action_dispatch/middleware/remote_ip.rb +21 -20
  86. data/lib/action_dispatch/middleware/request_id.rb +4 -2
  87. data/lib/action_dispatch/middleware/server_timing.rb +4 -4
  88. data/lib/action_dispatch/middleware/session/abstract_store.rb +5 -0
  89. data/lib/action_dispatch/middleware/session/cache_store.rb +2 -0
  90. data/lib/action_dispatch/middleware/session/cookie_store.rb +11 -5
  91. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +3 -1
  92. data/lib/action_dispatch/middleware/show_exceptions.rb +25 -18
  93. data/lib/action_dispatch/middleware/ssl.rb +18 -6
  94. data/lib/action_dispatch/middleware/stack.rb +7 -2
  95. data/lib/action_dispatch/middleware/static.rb +14 -10
  96. data/lib/action_dispatch/middleware/templates/rescues/_actions.html.erb +2 -2
  97. data/lib/action_dispatch/middleware/templates/rescues/_message_and_suggestions.html.erb +4 -4
  98. data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +8 -1
  99. data/lib/action_dispatch/middleware/templates/rescues/blocked_host.html.erb +7 -3
  100. data/lib/action_dispatch/middleware/templates/rescues/blocked_host.text.erb +5 -3
  101. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +7 -7
  102. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +2 -2
  103. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +17 -0
  104. data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.html.erb +16 -12
  105. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +1 -1
  106. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +3 -3
  107. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +4 -4
  108. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +1 -1
  109. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +1 -1
  110. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +3 -0
  111. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +59 -41
  112. data/lib/action_dispatch/railtie.rb +14 -4
  113. data/lib/action_dispatch/request/session.rb +16 -6
  114. data/lib/action_dispatch/request/utils.rb +8 -3
  115. data/lib/action_dispatch/routing/inspector.rb +54 -6
  116. data/lib/action_dispatch/routing/mapper.rb +58 -24
  117. data/lib/action_dispatch/routing/polymorphic_routes.rb +2 -0
  118. data/lib/action_dispatch/routing/redirection.rb +15 -6
  119. data/lib/action_dispatch/routing/route_set.rb +52 -22
  120. data/lib/action_dispatch/routing/routes_proxy.rb +10 -15
  121. data/lib/action_dispatch/routing/url_for.rb +26 -22
  122. data/lib/action_dispatch/routing.rb +7 -7
  123. data/lib/action_dispatch/system_test_case.rb +3 -3
  124. data/lib/action_dispatch/system_testing/browser.rb +20 -19
  125. data/lib/action_dispatch/system_testing/driver.rb +14 -22
  126. data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +27 -16
  127. data/lib/action_dispatch/testing/assertion_response.rb +1 -1
  128. data/lib/action_dispatch/testing/assertions/response.rb +14 -7
  129. data/lib/action_dispatch/testing/assertions/routing.rb +67 -28
  130. data/lib/action_dispatch/testing/assertions.rb +3 -1
  131. data/lib/action_dispatch/testing/integration.rb +27 -17
  132. data/lib/action_dispatch/testing/request_encoder.rb +4 -1
  133. data/lib/action_dispatch/testing/test_process.rb +4 -3
  134. data/lib/action_dispatch/testing/test_request.rb +1 -1
  135. data/lib/action_dispatch/testing/test_response.rb +23 -9
  136. data/lib/action_dispatch.rb +37 -4
  137. data/lib/action_pack/gem_version.rb +4 -4
  138. data/lib/action_pack/version.rb +1 -1
  139. data/lib/action_pack.rb +1 -1
  140. metadata +65 -29
data/CHANGELOG.md CHANGED
@@ -1,481 +1,609 @@
1
- ## Rails 7.0.4 (September 09, 2022) ##
1
+ ## Rails 7.1.3.4 (June 04, 2024) ##
2
2
 
3
- * Prevent `ActionDispatch::ServerTiming` from overwriting existing values in `Server-Timing`.
4
-
5
- Previously, if another middleware down the chain set `Server-Timing` header,
6
- it would overwritten by `ActionDispatch::ServerTiming`.
7
-
8
- *Jakub Malinowski*
3
+ * Include the HTTP Permissions-Policy on non-HTML Content-Types
4
+ [CVE-2024-28103]
9
5
 
10
6
 
11
- ## Rails 7.0.3.1 (July 12, 2022) ##
7
+ ## Rails 7.1.3.3 (May 16, 2024) ##
12
8
 
13
9
  * No changes.
14
10
 
15
11
 
16
- ## Rails 7.0.3 (May 09, 2022) ##
12
+ ## Rails 7.1.3.2 (February 21, 2024) ##
17
13
 
18
- * Allow relative redirects when `raise_on_open_redirects` is enabled.
14
+ * Fix `raise_on_missing_translations` not working correctly with the
15
+ `translate` method in controllers after the patch for CVE-2024-26143.
19
16
 
20
- *Tom Hughes*
17
+ ## Rails 7.1.3.1 (February 21, 2024) ##
21
18
 
22
- * Fix `authenticate_with_http_basic` to allow for missing password.
19
+ * Fix possible XSS vulnerability with the `translate` method in controllers
23
20
 
24
- Before Rails 7.0 it was possible to handle basic authentication with only a username.
21
+ CVE-2024-26143
25
22
 
26
- ```ruby
27
- authenticate_with_http_basic do |token, _|
28
- ApiClient.authenticate(token)
29
- end
30
- ```
23
+ * Fix ReDoS in Accept header parsing
31
24
 
32
- This ability is restored.
25
+ CVE-2024-26142
33
26
 
34
- *Jean Boussier*
27
+ ## Rails 7.1.3 (January 16, 2024) ##
35
28
 
36
- * Fix `content_security_policy` returning invalid directives.
29
+ * Fix including `Rails.application.routes.url_helpers` directly in an
30
+ `ActiveSupport::Concern.`
37
31
 
38
- Directives such as `self`, `unsafe-eval` and few others were not
39
- single quoted when the directive was the result of calling a lambda
40
- returning an array.
32
+ *Jonathan Hefner*
41
33
 
42
- ```ruby
43
- content_security_policy do |policy|
44
- policy.frame_ancestors lambda { [:self, "https://example.com"] }
45
- end
46
- ```
34
+ * Fix system tests when using a Chrome binary that has been downloaded by
35
+ Selenium.
47
36
 
48
- With this fix the policy generated from above will now be valid.
37
+ *Jonathan Hefner*
49
38
 
50
- *Edouard Chin*
51
39
 
52
- * Fix `skip_forgery_protection` to run without raising an error if forgery
53
- protection has not been enabled / `verify_authenticity_token` is not a
54
- defined callback.
40
+ ## Rails 7.1.2 (November 10, 2023) ##
55
41
 
56
- This fix prevents the Rails 7.0 Welcome Page (`/`) from raising an
57
- `ArgumentError` if `default_protect_from_forgery` is false.
42
+ * Fix a race condition that could cause a `Text file busy - chromedriver`
43
+ error with parallel system tests
58
44
 
59
- *Brad Trick*
45
+ *Matt Brictson*
60
46
 
61
- * Fix `ActionController::Live` to copy the IsolatedExecutionState in the ephemeral thread.
47
+ * Fix `StrongParameters#extract_value` to include blank values
62
48
 
63
- Since its inception `ActionController::Live` has been copying thread local variables
64
- to keep things such as `CurrentAttributes` set from middlewares working in the controller action.
49
+ Otherwise composite parameters may not be parsed correctly when one of the
50
+ component is blank.
65
51
 
66
- With the introduction of `IsolatedExecutionState` in 7.0, some of that global state was lost in
67
- `ActionController::Live` controllers.
52
+ *fatkodima*, *Yasha Krasnou*, *Matthias Eiglsperger*
68
53
 
69
- *Jean Boussier*
54
+ * Add `racc` as a dependency since it will become a bundled gem in Ruby 3.4.0
70
55
 
71
- * Fix setting `trailing_slash: true` in route definition.
56
+ *Hartley McGuire*
72
57
 
73
- ```ruby
74
- get '/test' => "test#index", as: :test, trailing_slash: true
58
+ * Support handling Enumerator for non-buffered responses.
75
59
 
76
- test_path() # => "/test/"
77
- ```
60
+ *Zachary Scott*
78
61
 
79
- *Jean Boussier*
80
62
 
81
- ## Rails 7.0.2.4 (April 26, 2022) ##
63
+ ## Rails 7.1.1 (October 11, 2023) ##
82
64
 
83
- * Allow Content Security Policy DSL to generate for API responses.
65
+ * No changes.
84
66
 
85
- *Tim Wade*
86
67
 
87
- ## Rails 7.0.2.3 (March 08, 2022) ##
68
+ ## Rails 7.1.0 (October 05, 2023) ##
88
69
 
89
70
  * No changes.
90
71
 
91
72
 
92
- ## Rails 7.0.2.2 (February 11, 2022) ##
73
+ ## Rails 7.1.0.rc2 (October 01, 2023) ##
93
74
 
94
75
  * No changes.
95
76
 
96
77
 
97
- ## Rails 7.0.2.1 (February 11, 2022) ##
78
+ ## Rails 7.1.0.rc1 (September 27, 2023) ##
98
79
 
99
- * Under certain circumstances, the middleware isn't informed that the
100
- response body has been fully closed which result in request state not
101
- being fully reset before the next request
80
+ * Add support for `#deep_merge` and `#deep_merge!` to
81
+ `ActionController::Parameters`.
102
82
 
103
- [CVE-2022-23633]
83
+ *Sean Doyle*
104
84
 
105
85
 
106
- ## Rails 7.0.2 (February 08, 2022) ##
86
+ ## Rails 7.1.0.beta1 (September 13, 2023) ##
107
87
 
108
- * No changes.
88
+ * `AbstractController::Translation.raise_on_missing_translations` removed
109
89
 
90
+ This was a private API, and has been removed in favour of a more broadly applicable
91
+ `config.i18n.raise_on_missing_translations`. See the upgrading guide for more information.
110
92
 
111
- ## Rails 7.0.1 (January 06, 2022) ##
93
+ *Alex Ghiculescu*
112
94
 
113
- * Fix `ActionController::Parameters` methods to keep the original logger context when creating a new copy
114
- of the original object.
95
+ * Add `ActionController::Parameters#extract_value` method to allow extracting serialized values from params
115
96
 
116
- *Yutaka Kamei*
97
+ ```ruby
98
+ params = ActionController::Parameters.new(id: "1_123", tags: "ruby,rails")
99
+ params.extract_value(:id) # => ["1", "123"]
100
+ params.extract_value(:tags, delimiter: ",") # => ["ruby", "rails"]
101
+ ```
117
102
 
103
+ *Nikita Vasilevsky*
118
104
 
119
- ## Rails 7.0.0 (December 15, 2021) ##
105
+ * Parse JSON `response.parsed_body` with `ActiveSupport::HashWithIndifferentAccess`
120
106
 
121
- * Deprecate `Rails.application.config.action_controller.urlsafe_csrf_tokens`. This config is now always enabled.
107
+ Integrate with Minitest's new `assert_pattern` by parsing the JSON contents
108
+ of `response.parsed_body` with `ActiveSupport::HashWithIndifferentAccess`, so
109
+ that it's pattern-matching compatible.
122
110
 
123
- *Étienne Barrié*
111
+ *Sean Doyle*
124
112
 
125
- * Instance variables set in requests in a `ActionController::TestCase` are now cleared before the next request
113
+ * Add support for Playwright as a driver for system tests.
126
114
 
127
- This means if you make multiple requests in the same test, instance variables set in the first request will
128
- not persist into the second one. (It's not recommended to make multiple requests in the same test.)
115
+ *Yuki Nishijima*
129
116
 
130
- *Alex Ghiculescu*
117
+ * Fix `HostAuthorization` potentially displaying the value of the
118
+ X_FORWARDED_HOST header when the HTTP_HOST header is being blocked.
131
119
 
120
+ *Hartley McGuire*, *Daniel Schlosser*
132
121
 
133
- ## Rails 7.0.0.rc3 (December 14, 2021) ##
122
+ * Rename `fixture_file_upload` method to `file_fixture_upload`
134
123
 
135
- * No changes.
124
+ Declare an alias to preserve the backwards compatibility of `fixture_file_upload`
136
125
 
126
+ *Sean Doyle*
137
127
 
138
- ## Rails 7.0.0.rc2 (December 14, 2021) ##
128
+ * `ActionDispatch::SystemTesting::TestHelpers::ScreenshotHelper` saves the screenshot path in test metadata on failure.
139
129
 
140
- * Fix X_FORWARDED_HOST protection. [CVE-2021-44528]
130
+ *Matija Čupić*
141
131
 
132
+ * `config.dom_testing_default_html_version` controls the HTML parser used by
133
+ `ActionDispatch::Assertions#html_document`.
142
134
 
143
- ## Rails 7.0.0.rc1 (December 06, 2021) ##
135
+ The Rails 7.1 default configuration opts into the HTML5 parser when it is supported, to better
136
+ represent what the DOM would be in a browser user agent. Previously this test helper always used
137
+ Nokogiri's HTML4 parser.
144
138
 
145
- * `Rails.application.executor` hooks can now be called around every request in a `ActionController::TestCase`
139
+ *Mike Dalessio*
146
140
 
147
- This helps to better simulate request or job local state being reset between requests and prevent state
148
- leaking from one request to another.
141
+ * The `with_routing` helper can now be called at the class level. When called at the class level, the routes will
142
+ be setup before each test, and reset after every test. For example:
149
143
 
150
- To enable this, set `config.active_support.executor_around_test_case = true` (this is the default in Rails 7).
144
+ ```ruby
145
+ class RoutingTest < ActionController::TestCase
146
+ with_routing do |routes|
147
+ routes.draw do
148
+ resources :articles
149
+ resources :authors
150
+ end
151
+ end
151
152
 
152
- *Alex Ghiculescu*
153
+ def test_articles_route
154
+ assert_routing("/articles", controller: "articles", action: "index")
155
+ end
153
156
 
154
- * Consider onion services secure for cookies.
157
+ def test_authors_route
158
+ assert_routing("/authors", controller: "authors", action: "index")
159
+ end
160
+ end
161
+ ```
155
162
 
156
- *Justin Tracey*
163
+ *Andrew Novoselac*
157
164
 
158
- * Remove deprecated `Rails.config.action_view.raise_on_missing_translations`.
165
+ * The `Mime::Type` now supports handling types with parameters and correctly handles quotes.
166
+ When parsing the accept header, the parameters before the q-parameter are kept and if a matching mime-type exists it is used.
167
+ To keep the current functionality, a fallback is created to look for the media-type without the parameters.
159
168
 
160
- *Rafael Mendonça França*
169
+ This change allows for custom MIME-types that are more complex like `application/vnd.api+json; profile="https://jsonapi.org/profiles/ethanresnick/cursor-pagination/" ext="https://jsonapi.org/ext/atomic"` for the [JSON API](https://jsonapi.org/).
161
170
 
162
- * Remove deprecated support to passing a path to `fixture_file_upload` relative to `fixture_path`.
171
+ *Nicolas Erni*
163
172
 
164
- *Rafael Mendonça França*
173
+ * The url_for helpers now support a new option called `path_params`.
174
+ This is very useful in situations where you only want to add a required param that is part of the route's URL but for other route not append an extraneous query param.
165
175
 
166
- * Remove deprecated `ActionDispatch::SystemTestCase#host!`.
176
+ Given the following router...
167
177
 
168
- *Rafael Mendonça França*
178
+ ```ruby
179
+ Rails.application.routes.draw do
180
+ scope ":account_id" do
181
+ get "dashboard" => "pages#dashboard", as: :dashboard
182
+ get "search/:term" => "search#search", as: :search
183
+ end
184
+ delete "signout" => "sessions#destroy", as: :signout
185
+ end
186
+ ```
169
187
 
170
- * Remove deprecated `Rails.config.action_dispatch.hosts_response_app`.
188
+ And given the following `ApplicationController`
171
189
 
172
- *Rafael Mendonça França*
190
+ ```ruby
191
+ class ApplicationController < ActionController::Base
192
+ def default_url_options
193
+ { path_params: { account_id: "foo" } }
194
+ end
195
+ end
196
+ ```
173
197
 
174
- * Remove deprecated `ActionDispatch::Response.return_only_media_type_on_content_type`.
198
+ The standard url_for helper and friends will now behave as follows:
175
199
 
176
- *Rafael Mendonça França*
200
+ ```ruby
201
+ dashboard_path # => /foo/dashboard
202
+ dashboard_path(account_id: "bar") # => /bar/dashboard
177
203
 
178
- * Raise `ActionController::Redirecting::UnsafeRedirectError` for unsafe `redirect_to` redirects.
204
+ signout_path # => /signout
205
+ signout_path(account_id: "bar") # => /signout?account_id=bar
206
+ signout_path(account_id: "bar", path_params: { account_id: "baz" }) # => /signout?account_id=bar
207
+ search_path("quin") # => /foo/search/quin
208
+ ```
179
209
 
180
- This allows `rescue_from` to be used to add a default fallback route:
210
+ *Jason Meller, Jeremy Beker*
181
211
 
182
- ```ruby
183
- rescue_from ActionController::Redirecting::UnsafeRedirectError do
184
- redirect_to root_url
185
- end
186
- ```
212
+ * Change `action_dispatch.show_exceptions` to one of `:all`, `:rescuable`, or
213
+ `:none`. `:all` and `:none` behave the same as the previous `true` and
214
+ `false` respectively. The new `:rescuable` option will only show exceptions
215
+ that can be rescued (e.g. `ActiveRecord::RecordNotFound`). `:rescuable` is
216
+ now the default for the test environment.
187
217
 
188
- *Kasper Timm Hansen*, *Chris Oliver*
218
+ *Jon Dufresne*
189
219
 
190
- * Add `url_from` to verify a redirect location is internal.
220
+ * `config.action_dispatch.cookies_serializer` now accepts `:message_pack` and
221
+ `:message_pack_allow_marshal` as serializers. These serializers require the
222
+ [`msgpack` gem](https://rubygems.org/gems/msgpack) (>= 1.7.0).
191
223
 
192
- Takes the open redirect protection from `redirect_to` so users can wrap a
193
- param, and fall back to an alternate redirect URL when the param provided
194
- one is unsafe.
224
+ The Message Pack format can provide improved performance and smaller payload
225
+ sizes. It also supports roundtripping some Ruby types that are not supported
226
+ by JSON. For example:
195
227
 
196
- ```ruby
197
- def create
198
- redirect_to url_from(params[:redirect_url]) || root_url
199
- end
200
- ```
228
+ ```ruby
229
+ cookies.encrypted[:foo] = [{ a: 1 }, { b: 2 }.with_indifferent_access, 1.to_d, Time.at(0, 123)]
201
230
 
202
- *dmcge*, *Kasper Timm Hansen*
231
+ # BEFORE with config.action_dispatch.cookies_serializer = :json
232
+ cookies.encrypted[:foo]
233
+ # => [{"a"=>1}, {"b"=>2}, "1.0", "1969-12-31T18:00:00.000-06:00"]
234
+ cookies.encrypted[:foo].map(&:class)
235
+ # => [Hash, Hash, String, String]
203
236
 
204
- * Allow Capybara driver name overrides in `SystemTestCase::driven_by`
237
+ # AFTER with config.action_dispatch.cookies_serializer = :message_pack
238
+ cookies.encrypted[:foo]
239
+ # => [{:a=>1}, {"b"=>2}, 0.1e1, 1969-12-31 18:00:00.000123 -0600]
240
+ cookies.encrypted[:foo].map(&:class)
241
+ # => [Hash, ActiveSupport::HashWithIndifferentAccess, BigDecimal, Time]
242
+ ```
205
243
 
206
- Allow users to prevent conflicts among drivers that use the same driver
207
- type (selenium, poltergeist, webkit, rack test).
244
+ The `:message_pack` serializer can fall back to deserializing with
245
+ `ActiveSupport::JSON` when necessary, and the `:message_pack_allow_marshal`
246
+ serializer can fall back to deserializing with `Marshal` as well as
247
+ `ActiveSupport::JSON`. Additionally, the `:marshal`, `:json`, and
248
+ `:json_allow_marshal` (AKA `:hybrid`) serializers can now fall back to
249
+ deserializing with `ActiveSupport::MessagePack` when necessary. These
250
+ behaviors ensure old cookies can still be read so that migration is easier.
208
251
 
209
- Fixes #42502
252
+ *Jonathan Hefner*
210
253
 
211
- *Chris LaRose*
254
+ * Remove leading dot from domains on cookies set with `domain: :all`, to meet RFC6265 requirements
212
255
 
213
- * Allow multiline to be passed in routes when using wildcard segments.
256
+ *Gareth Adams*
214
257
 
215
- Previously routes with newlines weren't detected when using wildcard segments, returning
216
- a `No route matches` error.
217
- After this change, routes with newlines are detected on wildcard segments. Example
258
+ * Include source location in routes extended view.
218
259
 
219
- ```ruby
220
- draw do
221
- get "/wildcard/*wildcard_segment", to: SimpleApp.new("foo#index"), as: :wildcard
222
- end
260
+ ```bash
261
+ $ bin/rails routes --expanded
223
262
 
224
- # After the change, the path matches.
225
- assert_equal "/wildcard/a%0Anewline", url_helpers.wildcard_path(wildcard_segment: "a\nnewline")
263
+ ...
264
+ --[ Route 14 ]----------
265
+ Prefix | new_gist
266
+ Verb | GET
267
+ URI | /gist(.:format)
268
+ Controller#Action | gists/gists#new
269
+ Source Location | config/routes/gist.rb:3
226
270
  ```
227
271
 
228
- Fixes #39103
272
+ *Luan Vieira, John Hawthorn and Daniel Colson*
229
273
 
230
- *Ignacio Chiazzo*
274
+ * Add `without` as an alias of `except` on `ActiveController::Parameters`.
231
275
 
232
- * Treat html suffix in controller translation.
276
+ *Hidde-Jan Jongsma*
233
277
 
234
- *Rui Onodera*, *Gavin Miller*
278
+ * Expand search field on `rails/info/routes` to also search **route name**, **http verb** and **controller#action**.
235
279
 
236
- * Allow permitting numeric params.
280
+ *Jason Kotchoff*
281
+
282
+ * Remove deprecated `poltergeist` and `webkit` (capybara-webkit) driver registration for system testing.
283
+
284
+ *Rafael Mendonça França*
285
+
286
+ * Remove deprecated ability to assign a single value to `config.action_dispatch.trusted_proxies`.
287
+
288
+ *Rafael Mendonça França*
289
+
290
+ * Deprecate `config.action_dispatch.return_only_request_media_type_on_content_type`.
291
+
292
+ *Rafael Mendonça França*
293
+
294
+ * Remove deprecated behavior on `Request#content_type`.
295
+
296
+ *Rafael Mendonça França*
297
+
298
+ * Change `ActionController::Instrumentation` to pass `filtered_path` instead of `fullpath` in the event payload to filter sensitive query params
237
299
 
238
- Previously it was impossible to permit different fields on numeric parameters.
239
- After this change you can specify different fields for each numbered parameter.
240
- For example params like,
241
300
  ```ruby
242
- book: {
243
- authors_attributes: {
244
- '0': { name: "William Shakespeare", age_of_death: "52" },
245
- '1': { name: "Unattributed Assistant" },
246
- '2': "Not a hash",
247
- 'new_record': { name: "Some name" }
248
- }
249
- }
301
+ get "/posts?password=test"
302
+ request.fullpath # => "/posts?password=test"
303
+ request.filtered_path # => "/posts?password=[FILTERED]"
250
304
  ```
251
305
 
252
- Before you could permit name on each author with,
253
- `permit book: { authors_attributes: [ :name ] }`
306
+ *Ritikesh G*
254
307
 
255
- After this change you can permit different keys on each numbered element,
256
- `permit book: { authors_attributes: { '1': [ :name ], '0': [ :name, :age_of_death ] } }`
308
+ * Deprecate `AbstractController::Helpers::MissingHelperError`
257
309
 
258
- Fixes #41625
310
+ *Hartley McGuire*
259
311
 
260
- *Adam Hess*
312
+ * Change `ActionDispatch::Testing::TestResponse#parsed_body` to parse HTML as
313
+ a Nokogiri document
261
314
 
262
- * Update `HostAuthorization` middleware to render debug info only
263
- when `config.consider_all_requests_local` is set to true.
315
+ ```ruby
316
+ get "/posts"
317
+ response.content_type # => "text/html; charset=utf-8"
318
+ response.parsed_body.class # => Nokogiri::HTML5::Document
319
+ response.parsed_body.to_html # => "<!DOCTYPE html>\n<html>\n..."
320
+ ```
264
321
 
265
- Also, blocked host info is always logged with level `error`.
322
+ *Sean Doyle*
266
323
 
267
- Fixes #42813
324
+ * Deprecate `ActionDispatch::IllegalStateError`.
268
325
 
269
- *Nikita Vyrko*
326
+ *Samuel Williams*
270
327
 
271
- * Add Server-Timing middleware
328
+ * Add HTTP::Request#route_uri_pattern that returns URI pattern of matched route.
272
329
 
273
- Server-Timing specification defines how the server can communicate to browsers performance metrics
274
- about the request it is responding to.
330
+ *Joel Hawksley*, *Kate Higa*
275
331
 
276
- The ServerTiming middleware is enabled by default on `development` environment by default using the
277
- `config.server_timing` setting and set the relevant duration metrics in the `Server-Timing` header
332
+ * Add `ActionDispatch::AssumeSSL` middleware that can be turned on via `config.assume_ssl`.
333
+ It makes the application believe that all requests are arriving over SSL. This is useful
334
+ when proxying through a load balancer that terminates SSL, the forwarded request will appear
335
+ as though its HTTP instead of HTTPS to the application. This makes redirects and cookie
336
+ security target HTTP instead of HTTPS. This middleware makes the server assume that the
337
+ proxy already terminated SSL, and that the request really is HTTPS.
278
338
 
279
- The full specification for Server-Timing header can be found in: https://www.w3.org/TR/server-timing/#dfn-server-timing-header-field
339
+ *DHH*
280
340
 
281
- *Sebastian Sogamoso*, *Guillermo Iguaran*
341
+ * Only use HostAuthorization middleware if `config.hosts` is not empty
282
342
 
343
+ *Hartley McGuire*
283
344
 
284
- ## Rails 7.0.0.alpha2 (September 15, 2021) ##
345
+ * Allow raising an error when a callback's only/unless symbols aren't existing methods.
285
346
 
286
- * No changes.
347
+ When `before_action :callback, only: :action_name` is declared on a controller that doesn't respond to `action_name`, raise an exception at request time. This is a safety measure to ensure that typos or forgetfulness don't prevent a crucial callback from being run when it should.
287
348
 
349
+ For new applications, raising an error for undefined actions is turned on by default. If you do not want to opt-in to this behavior set `config.action_controller.raise_on_missing_callback_actions` to `false` in your application configuration. See #43487 for more details.
288
350
 
289
- ## Rails 7.0.0.alpha1 (September 15, 2021) ##
351
+ *Jess Bees*
290
352
 
291
- * Use a static error message when raising `ActionDispatch::Http::Parameters::ParseError`
292
- to avoid inadvertently logging the HTTP request body at the `fatal` level when it contains
293
- malformed JSON.
353
+ * Allow cookie options[:domain] to accept a proc to set the cookie domain on a more flexible per-request basis
294
354
 
295
- Fixes #41145
355
+ *RobL*
296
356
 
297
- *Aaron Lahey*
357
+ * When a host is not specified for an `ActionController::Renderer`'s env,
358
+ the host and related options will now be derived from the routes'
359
+ `default_url_options` and `ActionDispatch::Http::URL.secure_protocol`.
298
360
 
299
- * Add `Middleware#delete!` to delete middleware or raise if not found.
361
+ This means that for an application with a configuration like:
300
362
 
301
- `Middleware#delete!` works just like `Middleware#delete` but will
302
- raise an error if the middleware isn't found.
363
+ ```ruby
364
+ Rails.application.default_url_options = { host: "rubyonrails.org" }
365
+ Rails.application.config.force_ssl = true
366
+ ```
303
367
 
304
- *Alex Ghiculescu*, *Petrik de Heus*, *Junichi Sato*
368
+ rendering a URL like:
305
369
 
306
- * Raise error on unpermitted open redirects.
370
+ ```ruby
371
+ ApplicationController.renderer.render inline: "<%= blog_url %>"
372
+ ```
307
373
 
308
- Add `allow_other_host` options to `redirect_to`.
309
- Opt in to this behaviour with `ActionController::Base.raise_on_open_redirects = true`.
374
+ will now return `"https://rubyonrails.org/blog"` instead of
375
+ `"http://example.org/blog"`.
310
376
 
311
- *Gannon McGibbon*
377
+ *Jonathan Hefner*
312
378
 
313
- * Deprecate `poltergeist` and `webkit` (capybara-webkit) driver registration for system testing (they will be removed in Rails 7.1). Add `cuprite` instead.
379
+ * Add details of cookie name and size to `CookieOverflow` exception.
314
380
 
315
- [Poltergeist](https://github.com/teampoltergeist/poltergeist) and [capybara-webkit](https://github.com/thoughtbot/capybara-webkit) are already not maintained. These usage in Rails are removed for avoiding confusing users.
381
+ *Andy Waite*
316
382
 
317
- [Cuprite](https://github.com/rubycdp/cuprite) is a good alternative to Poltergeist. Some guide descriptions are replaced from Poltergeist to Cuprite.
383
+ * Don't double log the `controller`, `action`, or `namespaced_controller` when using `ActiveRecord::QueryLog`
318
384
 
319
- *Yusuke Iwaki*
385
+ Previously if you set `config.active_record.query_log_tags` to an array that included
386
+ `:controller`, `:namespaced_controller`, or `:action`, that item would get logged twice.
387
+ This bug has been fixed.
320
388
 
321
- * Exclude additional flash types from `ActionController::Base.action_methods`.
389
+ *Alex Ghiculescu*
322
390
 
323
- Ensures that additional flash types defined on ActionController::Base subclasses
324
- are not listed as actions on that controller.
391
+ * Add the following permissions policy directives: `hid`, `idle-detection`, `screen-wake-lock`,
392
+ `serial`, `sync-xhr`, `web-share`.
325
393
 
326
- class MyController < ApplicationController
327
- add_flash_types :hype
328
- end
394
+ *Guillaume Cabanel*
329
395
 
330
- MyController.action_methods.include?('hype') # => false
396
+ * The `speaker`, `vibrate`, and `vr` permissions policy directives are now
397
+ deprecated.
331
398
 
332
- *Gavin Morrice*
399
+ There is no browser support for these directives, and no plan for browser
400
+ support in the future. You can just remove these directives from your
401
+ application.
333
402
 
334
- * OpenSSL constants are now used for Digest computations.
403
+ *Jonathan Hefner*
335
404
 
336
- *Dirkjan Bussink*
405
+ * Added the `:status` option to `assert_redirected_to` to specify the precise
406
+ HTTP status of the redirect. Defaults to `:redirect` for backwards
407
+ compatibility.
337
408
 
338
- * Remove IE6-7-8 file download related hack/fix from ActionController::DataStreaming module.
409
+ *Jon Dufresne*
339
410
 
340
- Due to the age of those versions of IE this fix is no longer relevant, more importantly it creates an edge-case for unexpected Cache-Control headers.
411
+ * Rescue `JSON::ParserError` in Cookies JSON deserializer to discards marshal dumps:
341
412
 
342
- *Tadas Sasnauskas*
413
+ Without this change, if `action_dispatch.cookies_serializer` is set to `:json` and
414
+ the app tries to read a `:marshal` serialized cookie, it would error out which wouldn't
415
+ clear the cookie and force app users to manually clear it in their browser.
343
416
 
344
- * Configuration setting to skip logging an uncaught exception backtrace when the exception is
345
- present in `rescued_responses`.
417
+ (See #45127 for original bug discussion)
346
418
 
347
- It may be too noisy to get all backtraces logged for applications that manage uncaught
348
- exceptions via `rescued_responses` and `exceptions_app`.
349
- `config.action_dispatch.log_rescued_responses` (defaults to `true`) can be set to `false` in
350
- this case, so that only exceptions not found in `rescued_responses` will be logged.
419
+ *Nathan Bardoux*
351
420
 
352
- *Alexander Azarov*, *Mike Dalessio*
421
+ * Add `HTTP_REFERER` when following redirects on integration tests
353
422
 
354
- * Ignore file fixtures on `db:fixtures:load`.
423
+ This makes `follow_redirect!` a closer simulation of what happens in a real browser
355
424
 
356
- *Kevin Sjöberg*
425
+ *Felipe Sateler*
357
426
 
358
- * Fix ActionController::Live controller test deadlocks by removing the body buffer size limit for tests.
427
+ * Added `exclude?` method to `ActionController::Parameters`.
359
428
 
360
- *Dylan Thacker-Smith*
429
+ *Ian Neubert*
361
430
 
362
- * New `ActionController::ConditionalGet#no_store` method to set HTTP cache control `no-store` directive.
431
+ * Rescue `EOFError` exception from `rack` on a multipart request.
363
432
 
364
- *Tadas Sasnauskas*
433
+ *Nikita Vasilevsky*
365
434
 
366
- * Drop support for the `SERVER_ADDR` header.
435
+ * Log redirects from routes the same way as redirects from controllers.
367
436
 
368
- Following up https://github.com/rack/rack/pull/1573 and https://github.com/rails/rails/pull/42349.
437
+ *Dennis Paagman*
369
438
 
370
- *Ricardo Díaz*
439
+ * Prevent `ActionDispatch::ServerTiming` from overwriting existing values in `Server-Timing`.
440
+ Previously, if another middleware down the chain set `Server-Timing` header,
441
+ it would overwritten by `ActionDispatch::ServerTiming`.
371
442
 
372
- * Set session options when initializing a basic session.
443
+ *Jakub Malinowski*
373
444
 
374
- *Gannon McGibbon*
445
+ * Allow opting out of the `SameSite` cookie attribute when setting a cookie.
375
446
 
376
- * Add `cache_control: {}` option to `fresh_when` and `stale?`.
447
+ You can opt out of `SameSite` by passing `same_site: nil`.
377
448
 
378
- Works as a shortcut to set `response.cache_control` with the above methods.
449
+ `cookies[:foo] = { value: "bar", same_site: nil }`
379
450
 
380
- *Jacopo Beschi*
451
+ Previously, this incorrectly set the `SameSite` attribute to the value of the `cookies_same_site_protection` setting.
381
452
 
382
- * Writing into a disabled session will now raise an error.
453
+ *Alex Ghiculescu*
383
454
 
384
- Previously when no session store was set, writing into the session would silently fail.
455
+ * Allow using `helper_method`s in `content_security_policy` and `permissions_policy`
385
456
 
386
- *Jean Boussier*
457
+ Previously you could access basic helpers (defined in helper modules), but not
458
+ helper methods defined using `helper_method`. Now you can use either.
459
+
460
+ ```ruby
461
+ content_security_policy do |p|
462
+ p.default_src "https://example.com"
463
+ p.script_src "https://example.com" if helpers.script_csp?
464
+ end
465
+ ```
387
466
 
388
- * Add support for 'require-trusted-types-for' and 'trusted-types' headers.
467
+ *Alex Ghiculescu*
389
468
 
390
- Fixes #42034.
469
+ * Reimplement `ActionController::Parameters#has_value?` and `#value?` to avoid parameters and hashes comparison.
391
470
 
392
- *lfalcao*
471
+ Deprecated equality between parameters and hashes is going to be removed in Rails 7.2.
472
+ The new implementation takes care of conversions.
393
473
 
394
- * Remove inline styles and address basic accessibility issues on rescue templates.
474
+ *Seva Stefkin*
395
475
 
396
- *Jacob Herrington*
476
+ * Allow only String and Symbol keys in `ActionController::Parameters`.
477
+ Raise `ActionController::InvalidParameterKey` when initializing Parameters
478
+ with keys that aren't strings or symbols.
397
479
 
398
- * Add support for 'private, no-store' Cache-Control headers.
480
+ *Seva Stefkin*
399
481
 
400
- Previously, 'no-store' was exclusive; no other directives could be specified.
482
+ * Add the ability to use custom logic for storing and retrieving CSRF tokens.
401
483
 
402
- *Alex Smith*
484
+ By default, the token will be stored in the session. Custom classes can be
485
+ defined to specify arbitrary behavior, but the ability to store them in
486
+ encrypted cookies is built in.
403
487
 
404
- * Expand payload of `unpermitted_parameters.action_controller` instrumentation to allow subscribers to
405
- know which controller action received unpermitted parameters.
488
+ *Andrew Kowpak*
406
489
 
407
- *bbuchalter*
490
+ * Make ActionController::Parameters#values cast nested hashes into parameters.
408
491
 
409
- * Add `ActionController::Live#send_stream` that makes it more convenient to send generated streams:
492
+ *Gannon McGibbon*
410
493
 
411
- ```ruby
412
- send_stream(filename: "subscribers.csv") do |stream|
413
- stream.writeln "email_address,updated_at"
494
+ * Introduce `html:` and `screenshot:` kwargs for system test screenshot helper
414
495
 
415
- @subscribers.find_each do |subscriber|
416
- stream.writeln [ subscriber.email_address, subscriber.updated_at ].join(",")
417
- end
418
- end
496
+ Use these as an alternative to the already-available environment variables.
497
+
498
+ For example, this will display a screenshot in iTerm, save the HTML, and output
499
+ its path.
500
+
501
+ ```ruby
502
+ take_screenshot(html: true, screenshot: "inline")
419
503
  ```
420
504
 
421
- *DHH*
505
+ *Alex Ghiculescu*
422
506
 
423
- * Add `ActionController::Live::Buffer#writeln` to write a line to the stream with a newline included.
507
+ * Allow `ActionController::Parameters#to_h` to receive a block.
424
508
 
425
- *DHH*
509
+ *Bob Farrell*
426
510
 
427
- * `ActionDispatch::Request#content_type` now returned Content-Type header as it is.
511
+ * Allow relative redirects when `raise_on_open_redirects` is enabled
428
512
 
429
- Previously, `ActionDispatch::Request#content_type` returned value does NOT contain charset part.
430
- This behavior changed to returned Content-Type header containing charset part as it is.
513
+ *Tom Hughes*
431
514
 
432
- If you want just MIME type, please use `ActionDispatch::Request#media_type` instead.
515
+ * Allow Content Security Policy DSL to generate for API responses.
516
+
517
+ *Tim Wade*
433
518
 
434
- Before:
519
+ * Fix `authenticate_with_http_basic` to allow for missing password.
520
+
521
+ Before Rails 7.0 it was possible to handle basic authentication with only a username.
435
522
 
436
523
  ```ruby
437
- request = ActionDispatch::Request.new("CONTENT_TYPE" => "text/csv; header=present; charset=utf-16", "REQUEST_METHOD" => "GET")
438
- request.content_type #=> "text/csv"
524
+ authenticate_with_http_basic do |token, _|
525
+ ApiClient.authenticate(token)
526
+ end
439
527
  ```
440
528
 
441
- After:
529
+ This ability is restored.
530
+
531
+ *Jean Boussier*
532
+
533
+ * Fix `content_security_policy` returning invalid directives.
534
+
535
+ Directives such as `self`, `unsafe-eval` and few others were not
536
+ single quoted when the directive was the result of calling a lambda
537
+ returning an array.
442
538
 
443
539
  ```ruby
444
- request = ActionDispatch::Request.new("Content-Type" => "text/csv; header=present; charset=utf-16", "REQUEST_METHOD" => "GET")
445
- request.content_type #=> "text/csv; header=present; charset=utf-16"
446
- request.media_type #=> "text/csv"
540
+ content_security_policy do |policy|
541
+ policy.frame_ancestors lambda { [:self, "https://example.com"] }
542
+ end
447
543
  ```
448
544
 
449
- *Rafael Mendonça França*
545
+ With this fix the policy generated from above will now be valid.
450
546
 
451
- * Change `ActionDispatch::Request#media_type` to return `nil` when the request don't have a `Content-Type` header.
547
+ *Edouard Chin*
452
548
 
453
- *Rafael Mendonça França*
549
+ * Fix `skip_forgery_protection` to run without raising an error if forgery
550
+ protection has not been enabled / `verify_authenticity_token` is not a
551
+ defined callback.
552
+
553
+ This fix prevents the Rails 7.0 Welcome Page (`/`) from raising an
554
+ `ArgumentError` if `default_protect_from_forgery` is false.
555
+
556
+ *Brad Trick*
557
+
558
+ * Make `redirect_to` return an empty response body.
454
559
 
455
- * Fix error in `ActionController::LogSubscriber` that would happen when throwing inside a controller action.
560
+ Application controllers that wish to add a response body after calling
561
+ `redirect_to` can continue to do so.
456
562
 
457
- *Janko Marohnić*
563
+ *Jon Dufresne*
458
564
 
459
- * Allow anything with `#to_str` (like `Addressable::URI`) as a `redirect_to` location.
565
+ * Use non-capturing group for subdomain matching in `ActionDispatch::HostAuthorization`
460
566
 
461
- *ojab*
567
+ Since we do nothing with the captured subdomain group, we can use a non-capturing group instead.
462
568
 
463
- * Change the request method to a `GET` when passing failed requests down to `config.exceptions_app`.
569
+ *Sam Bostock*
464
570
 
465
- *Alex Robbin*
571
+ * Fix `ActionController::Live` to copy the IsolatedExecutionState in the ephemeral thread.
572
+
573
+ Since its inception `ActionController::Live` has been copying thread local variables
574
+ to keep things such as `CurrentAttributes` set from middlewares working in the controller action.
466
575
 
467
- * Deprecate the ability to assign a single value to `config.action_dispatch.trusted_proxies`
468
- as `RemoteIp` middleware behaves inconsistently depending on whether this is configured
469
- with a single value or an enumerable.
576
+ With the introduction of `IsolatedExecutionState` in 7.0, some of that global state was lost in
577
+ `ActionController::Live` controllers.
470
578
 
471
- Fixes #40772.
579
+ *Jean Boussier*
472
580
 
473
- *Christian Sutter*
581
+ * Fix setting `trailing_slash: true` in route definition.
474
582
 
475
- * Add `redirect_back_or_to(fallback_location, **)` as a more aesthetically pleasing version of `redirect_back fallback_location:, **`.
476
- The old method name is retained without explicit deprecation.
583
+ ```ruby
584
+ get '/test' => "test#index", as: :test, trailing_slash: true
477
585
 
478
- *DHH*
586
+ test_path() # => "/test/"
587
+ ```
588
+
589
+ *Jean Boussier*
590
+
591
+ * Make `Session#merge!` stringify keys.
592
+
593
+ Previously `Session#update` would, but `merge!` wouldn't.
594
+
595
+ *Drew Bragg*
596
+
597
+ * Add `:unsafe_hashes` mapping for `content_security_policy`
598
+
599
+ ```ruby
600
+ # Before
601
+ policy.script_src :strict_dynamic, "'unsafe-hashes'", "'sha256-rRMdkshZyJlCmDX27XnL7g3zXaxv7ei6Sg+yt4R3svU='"
602
+
603
+ # After
604
+ policy.script_src :strict_dynamic, :unsafe_hashes, "'sha256-rRMdkshZyJlCmDX27XnL7g3zXaxv7ei6Sg+yt4R3svU='"
605
+ ```
479
606
 
607
+ *Igor Morozov*
480
608
 
481
- Please check [6-1-stable](https://github.com/rails/rails/blob/6-1-stable/actionpack/CHANGELOG.md) for previous changes.
609
+ Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/actionpack/CHANGELOG.md) for previous changes.