actionpack 4.2.10 → 7.2.0.rc1

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 (202) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +86 -600
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +13 -14
  5. data/lib/abstract_controller/asset_paths.rb +5 -1
  6. data/lib/abstract_controller/base.rb +166 -136
  7. data/lib/abstract_controller/caching/fragments.rb +149 -0
  8. data/lib/abstract_controller/caching.rb +68 -0
  9. data/lib/abstract_controller/callbacks.rb +126 -57
  10. data/lib/abstract_controller/collector.rb +13 -15
  11. data/lib/abstract_controller/deprecator.rb +9 -0
  12. data/lib/abstract_controller/error.rb +8 -0
  13. data/lib/abstract_controller/helpers.rb +181 -132
  14. data/lib/abstract_controller/logger.rb +5 -1
  15. data/lib/abstract_controller/railties/routes_helpers.rb +10 -3
  16. data/lib/abstract_controller/rendering.rb +56 -56
  17. data/lib/abstract_controller/translation.rb +29 -15
  18. data/lib/abstract_controller/url_for.rb +15 -11
  19. data/lib/abstract_controller.rb +21 -5
  20. data/lib/action_controller/api/api_rendering.rb +18 -0
  21. data/lib/action_controller/api.rb +154 -0
  22. data/lib/action_controller/base.rb +219 -155
  23. data/lib/action_controller/caching.rb +28 -68
  24. data/lib/action_controller/deprecator.rb +9 -0
  25. data/lib/action_controller/form_builder.rb +55 -0
  26. data/lib/action_controller/log_subscriber.rb +35 -22
  27. data/lib/action_controller/metal/allow_browser.rb +119 -0
  28. data/lib/action_controller/metal/basic_implicit_render.rb +17 -0
  29. data/lib/action_controller/metal/conditional_get.rb +259 -122
  30. data/lib/action_controller/metal/content_security_policy.rb +86 -0
  31. data/lib/action_controller/metal/cookies.rb +9 -5
  32. data/lib/action_controller/metal/data_streaming.rb +87 -104
  33. data/lib/action_controller/metal/default_headers.rb +21 -0
  34. data/lib/action_controller/metal/etag_with_flash.rb +22 -0
  35. data/lib/action_controller/metal/etag_with_template_digest.rb +35 -26
  36. data/lib/action_controller/metal/exceptions.rb +71 -24
  37. data/lib/action_controller/metal/flash.rb +26 -19
  38. data/lib/action_controller/metal/head.rb +45 -36
  39. data/lib/action_controller/metal/helpers.rb +80 -64
  40. data/lib/action_controller/metal/http_authentication.rb +297 -244
  41. data/lib/action_controller/metal/implicit_render.rb +57 -9
  42. data/lib/action_controller/metal/instrumentation.rb +76 -64
  43. data/lib/action_controller/metal/live.rb +238 -176
  44. data/lib/action_controller/metal/logging.rb +22 -0
  45. data/lib/action_controller/metal/mime_responds.rb +177 -166
  46. data/lib/action_controller/metal/parameter_encoding.rb +84 -0
  47. data/lib/action_controller/metal/params_wrapper.rb +145 -118
  48. data/lib/action_controller/metal/permissions_policy.rb +38 -0
  49. data/lib/action_controller/metal/rate_limiting.rb +62 -0
  50. data/lib/action_controller/metal/redirecting.rb +203 -64
  51. data/lib/action_controller/metal/renderers.rb +108 -65
  52. data/lib/action_controller/metal/rendering.rb +216 -56
  53. data/lib/action_controller/metal/request_forgery_protection.rb +496 -163
  54. data/lib/action_controller/metal/rescue.rb +19 -21
  55. data/lib/action_controller/metal/streaming.rb +179 -138
  56. data/lib/action_controller/metal/strong_parameters.rb +1058 -382
  57. data/lib/action_controller/metal/testing.rb +11 -17
  58. data/lib/action_controller/metal/url_for.rb +37 -21
  59. data/lib/action_controller/metal.rb +236 -138
  60. data/lib/action_controller/railtie.rb +89 -11
  61. data/lib/action_controller/railties/helpers.rb +5 -1
  62. data/lib/action_controller/renderer.rb +161 -0
  63. data/lib/action_controller/template_assertions.rb +13 -0
  64. data/lib/action_controller/test_case.rb +425 -497
  65. data/lib/action_controller.rb +44 -22
  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 +119 -63
  69. data/lib/action_dispatch/http/content_disposition.rb +47 -0
  70. data/lib/action_dispatch/http/content_security_policy.rb +364 -0
  71. data/lib/action_dispatch/http/filter_parameters.rb +36 -34
  72. data/lib/action_dispatch/http/filter_redirect.rb +24 -12
  73. data/lib/action_dispatch/http/headers.rb +66 -31
  74. data/lib/action_dispatch/http/mime_negotiation.rb +106 -75
  75. data/lib/action_dispatch/http/mime_type.rb +196 -136
  76. data/lib/action_dispatch/http/mime_types.rb +25 -7
  77. data/lib/action_dispatch/http/parameters.rb +97 -45
  78. data/lib/action_dispatch/http/permissions_policy.rb +187 -0
  79. data/lib/action_dispatch/http/rack_cache.rb +6 -0
  80. data/lib/action_dispatch/http/request.rb +299 -170
  81. data/lib/action_dispatch/http/response.rb +311 -160
  82. data/lib/action_dispatch/http/upload.rb +52 -23
  83. data/lib/action_dispatch/http/url.rb +201 -125
  84. data/lib/action_dispatch/journey/formatter.rb +110 -50
  85. data/lib/action_dispatch/journey/gtg/builder.rb +37 -50
  86. data/lib/action_dispatch/journey/gtg/simulator.rb +20 -17
  87. data/lib/action_dispatch/journey/gtg/transition_table.rb +96 -36
  88. data/lib/action_dispatch/journey/nfa/dot.rb +5 -14
  89. data/lib/action_dispatch/journey/nodes/node.rb +100 -20
  90. data/lib/action_dispatch/journey/parser.rb +19 -17
  91. data/lib/action_dispatch/journey/parser.y +4 -3
  92. data/lib/action_dispatch/journey/parser_extras.rb +14 -4
  93. data/lib/action_dispatch/journey/path/pattern.rb +79 -63
  94. data/lib/action_dispatch/journey/route.rb +108 -44
  95. data/lib/action_dispatch/journey/router/utils.rb +41 -29
  96. data/lib/action_dispatch/journey/router.rb +64 -57
  97. data/lib/action_dispatch/journey/routes.rb +23 -21
  98. data/lib/action_dispatch/journey/scanner.rb +28 -17
  99. data/lib/action_dispatch/journey/visitors.rb +100 -54
  100. data/lib/action_dispatch/journey/visualizer/fsm.js +49 -24
  101. data/lib/action_dispatch/journey/visualizer/index.html.erb +1 -1
  102. data/lib/action_dispatch/journey.rb +7 -5
  103. data/lib/action_dispatch/log_subscriber.rb +25 -0
  104. data/lib/action_dispatch/middleware/actionable_exceptions.rb +46 -0
  105. data/lib/action_dispatch/middleware/assume_ssl.rb +27 -0
  106. data/lib/action_dispatch/middleware/callbacks.rb +7 -6
  107. data/lib/action_dispatch/middleware/cookies.rb +471 -328
  108. data/lib/action_dispatch/middleware/debug_exceptions.rb +149 -66
  109. data/lib/action_dispatch/middleware/debug_locks.rb +129 -0
  110. data/lib/action_dispatch/middleware/debug_view.rb +73 -0
  111. data/lib/action_dispatch/middleware/exception_wrapper.rb +275 -73
  112. data/lib/action_dispatch/middleware/executor.rb +32 -0
  113. data/lib/action_dispatch/middleware/flash.rb +143 -101
  114. data/lib/action_dispatch/middleware/host_authorization.rb +171 -0
  115. data/lib/action_dispatch/middleware/public_exceptions.rb +36 -27
  116. data/lib/action_dispatch/middleware/reloader.rb +10 -92
  117. data/lib/action_dispatch/middleware/remote_ip.rb +133 -107
  118. data/lib/action_dispatch/middleware/request_id.rb +29 -15
  119. data/lib/action_dispatch/middleware/server_timing.rb +78 -0
  120. data/lib/action_dispatch/middleware/session/abstract_store.rb +49 -27
  121. data/lib/action_dispatch/middleware/session/cache_store.rb +33 -16
  122. data/lib/action_dispatch/middleware/session/cookie_store.rb +86 -80
  123. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +15 -3
  124. data/lib/action_dispatch/middleware/show_exceptions.rb +66 -36
  125. data/lib/action_dispatch/middleware/ssl.rb +134 -36
  126. data/lib/action_dispatch/middleware/stack.rb +109 -44
  127. data/lib/action_dispatch/middleware/static.rb +159 -90
  128. data/lib/action_dispatch/middleware/templates/rescues/_actions.html.erb +13 -0
  129. data/lib/action_dispatch/middleware/templates/rescues/_actions.text.erb +0 -0
  130. data/lib/action_dispatch/middleware/templates/rescues/_message_and_suggestions.html.erb +22 -0
  131. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +7 -24
  132. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +1 -1
  133. data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +36 -0
  134. data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
  135. data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +46 -36
  136. data/lib/action_dispatch/middleware/templates/rescues/blocked_host.html.erb +12 -0
  137. data/lib/action_dispatch/middleware/templates/rescues/blocked_host.text.erb +9 -0
  138. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +26 -7
  139. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +3 -3
  140. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.html.erb +24 -0
  141. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.text.erb +16 -0
  142. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +139 -15
  143. data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.html.erb +23 -0
  144. data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.text.erb +3 -0
  145. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +6 -6
  146. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +7 -7
  147. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +9 -9
  148. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +1 -1
  149. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +4 -4
  150. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +1 -1
  151. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +7 -4
  152. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +125 -93
  153. data/lib/action_dispatch/railtie.rb +44 -16
  154. data/lib/action_dispatch/request/session.rb +159 -69
  155. data/lib/action_dispatch/request/utils.rb +97 -23
  156. data/lib/action_dispatch/routing/endpoint.rb +11 -2
  157. data/lib/action_dispatch/routing/inspector.rb +195 -106
  158. data/lib/action_dispatch/routing/mapper.rb +1338 -955
  159. data/lib/action_dispatch/routing/polymorphic_routes.rb +234 -201
  160. data/lib/action_dispatch/routing/redirection.rb +78 -51
  161. data/lib/action_dispatch/routing/route_set.rb +460 -374
  162. data/lib/action_dispatch/routing/routes_proxy.rb +36 -12
  163. data/lib/action_dispatch/routing/url_for.rb +172 -124
  164. data/lib/action_dispatch/routing.rb +159 -158
  165. data/lib/action_dispatch/system_test_case.rb +206 -0
  166. data/lib/action_dispatch/system_testing/browser.rb +84 -0
  167. data/lib/action_dispatch/system_testing/driver.rb +85 -0
  168. data/lib/action_dispatch/system_testing/server.rb +33 -0
  169. data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +164 -0
  170. data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +23 -0
  171. data/lib/action_dispatch/testing/assertion_response.rb +48 -0
  172. data/lib/action_dispatch/testing/assertions/response.rb +71 -39
  173. data/lib/action_dispatch/testing/assertions/routing.rb +228 -103
  174. data/lib/action_dispatch/testing/assertions.rb +9 -6
  175. data/lib/action_dispatch/testing/integration.rb +486 -306
  176. data/lib/action_dispatch/testing/request_encoder.rb +60 -0
  177. data/lib/action_dispatch/testing/test_helpers/page_dump_helper.rb +35 -0
  178. data/lib/action_dispatch/testing/test_process.rb +35 -22
  179. data/lib/action_dispatch/testing/test_request.rb +29 -34
  180. data/lib/action_dispatch/testing/test_response.rb +48 -15
  181. data/lib/action_dispatch.rb +82 -40
  182. data/lib/action_pack/gem_version.rb +8 -4
  183. data/lib/action_pack/version.rb +6 -2
  184. data/lib/action_pack.rb +21 -18
  185. metadata +146 -56
  186. data/lib/action_controller/caching/fragments.rb +0 -103
  187. data/lib/action_controller/metal/force_ssl.rb +0 -97
  188. data/lib/action_controller/metal/hide_actions.rb +0 -40
  189. data/lib/action_controller/metal/rack_delegation.rb +0 -32
  190. data/lib/action_controller/middleware.rb +0 -39
  191. data/lib/action_controller/model_naming.rb +0 -12
  192. data/lib/action_dispatch/http/parameter_filter.rb +0 -72
  193. data/lib/action_dispatch/journey/backwards.rb +0 -5
  194. data/lib/action_dispatch/journey/nfa/builder.rb +0 -76
  195. data/lib/action_dispatch/journey/nfa/simulator.rb +0 -47
  196. data/lib/action_dispatch/journey/nfa/transition_table.rb +0 -163
  197. data/lib/action_dispatch/journey/router/strexp.rb +0 -27
  198. data/lib/action_dispatch/middleware/params_parser.rb +0 -60
  199. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +0 -27
  200. data/lib/action_dispatch/testing/assertions/dom.rb +0 -3
  201. data/lib/action_dispatch/testing/assertions/selector.rb +0 -3
  202. data/lib/action_dispatch/testing/assertions/tag.rb +0 -3
@@ -1,26 +1,180 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :markup: markdown
4
+
1
5
  module ActionController
2
6
  module Rendering
3
7
  extend ActiveSupport::Concern
4
8
 
5
- RENDER_FORMATS_IN_PRIORITY = [:body, :text, :plain, :html]
9
+ RENDER_FORMATS_IN_PRIORITY = [:body, :plain, :html]
6
10
 
7
- # Before processing, set the request formats in current controller formats.
8
- def process_action(*) #:nodoc:
9
- self.formats = request.formats.map(&:ref).compact
10
- super
11
+ module ClassMethods
12
+ # Documentation at ActionController::Renderer#render
13
+ delegate :render, to: :renderer
14
+
15
+ # Returns a renderer instance (inherited from ActionController::Renderer) for
16
+ # the controller.
17
+ attr_reader :renderer
18
+
19
+ def setup_renderer! # :nodoc:
20
+ @renderer = Renderer.for(self)
21
+ end
22
+
23
+ def inherited(klass)
24
+ klass.setup_renderer!
25
+ super
26
+ end
11
27
  end
12
28
 
29
+ # Renders a template and assigns the result to `self.response_body`.
30
+ #
31
+ # If no rendering mode option is specified, the template will be derived from
32
+ # the first argument.
33
+ #
34
+ # render "posts/show"
35
+ # # => renders app/views/posts/show.html.erb
36
+ #
37
+ # # In a PostsController action...
38
+ # render :show
39
+ # # => renders app/views/posts/show.html.erb
40
+ #
41
+ # If the first argument responds to `render_in`, the template will be rendered
42
+ # by calling `render_in` with the current view context.
43
+ #
44
+ # class Greeting
45
+ # def render_in(view_context)
46
+ # view_context.render html: "<h1>Hello, World</h1>"
47
+ # end
48
+ #
49
+ # def format
50
+ # :html
51
+ # end
52
+ # end
53
+ #
54
+ # render(Greeting.new)
55
+ # # => "<h1>Hello, World</h1>"
56
+ #
57
+ # render(renderable: Greeting.new)
58
+ # # => "<h1>Hello, World</h1>"
59
+ #
60
+ # #### Rendering Mode
61
+ #
62
+ # `:partial`
63
+ # : See ActionView::PartialRenderer for details.
64
+ #
65
+ # render partial: "posts/form", locals: { post: Post.new }
66
+ # # => renders app/views/posts/_form.html.erb
67
+ #
68
+ # `:file`
69
+ # : Renders the contents of a file. This option should **not** be used with
70
+ # unsanitized user input.
71
+ #
72
+ # render file: "/path/to/some/file"
73
+ # # => renders /path/to/some/file
74
+ #
75
+ # `:inline`
76
+ # : Renders an ERB template string.
77
+ #
78
+ # @name = "World"
79
+ # render inline: "<h1>Hello, <%= @name %>!</h1>"
80
+ # # => renders "<h1>Hello, World!</h1>"
81
+ #
82
+ # `:body`
83
+ # : Renders the provided text, and sets the content type as `text/plain`.
84
+ #
85
+ # render body: "Hello, World!"
86
+ # # => renders "Hello, World!"
87
+ #
88
+ # `:plain`
89
+ # : Renders the provided text, and sets the content type as `text/plain`.
90
+ #
91
+ # render plain: "Hello, World!"
92
+ # # => renders "Hello, World!"
93
+ #
94
+ # `:html`
95
+ # : Renders the provided HTML string, and sets the content type as
96
+ # `text/html`. If the string is not `html_safe?`, performs HTML escaping on
97
+ # the string before rendering.
98
+ #
99
+ # render html: "<h1>Hello, World!</h1>".html_safe
100
+ # # => renders "<h1>Hello, World!</h1>"
101
+ #
102
+ # render html: "<h1>Hello, World!</h1>"
103
+ # # => renders "&lt;h1&gt;Hello, World!&lt;/h1&gt;"
104
+ #
105
+ # `:json`
106
+ # : Renders the provided object as JSON, and sets the content type as
107
+ # `application/json`. If the object is not a string, it will be converted to
108
+ # JSON by calling `to_json`.
109
+ #
110
+ # render json: { hello: "world" }
111
+ # # => renders "{\"hello\":\"world\"}"
112
+ #
113
+ # `:renderable`
114
+ # : Renders the provided object by calling `render_in` with the current view
115
+ # context. The response format is determined by calling `format` on the
116
+ # renderable if it responds to `format`, falling back to `text/html` by
117
+ # default.
118
+ #
119
+ # render renderable: Greeting.new
120
+ # # => renders "<h1>Hello, World</h1>"
121
+ #
122
+ #
123
+ # By default, when a rendering mode is specified, no layout template is
124
+ # rendered.
125
+ #
126
+ # #### Options
127
+ #
128
+ # `:assigns`
129
+ # : Hash of instance variable assignments for the template.
130
+ #
131
+ # render inline: "<h1>Hello, <%= @name %>!</h1>", assigns: { name: "World" }
132
+ # # => renders "<h1>Hello, World!</h1>"
133
+ #
134
+ # `:locals`
135
+ # : Hash of local variable assignments for the template.
136
+ #
137
+ # render inline: "<h1>Hello, <%= name %>!</h1>", locals: { name: "World" }
138
+ # # => renders "<h1>Hello, World!</h1>"
139
+ #
140
+ # `:layout`
141
+ # : The layout template to render. Can also be `false` or `true` to disable or
142
+ # (re)enable the default layout template.
143
+ #
144
+ # render "posts/show", layout: "holiday"
145
+ # # => renders app/views/posts/show.html.erb with the app/views/layouts/holiday.html.erb layout
146
+ #
147
+ # render "posts/show", layout: false
148
+ # # => renders app/views/posts/show.html.erb with no layout
149
+ #
150
+ # render inline: "<h1>Hello, World!</h1>", layout: true
151
+ # # => renders "<h1>Hello, World!</h1>" with the default layout
152
+ #
153
+ # `:status`
154
+ # : The HTTP status code to send with the response. Can be specified as a
155
+ # number or as the status name in Symbol form. Defaults to 200.
156
+ #
157
+ # render "posts/new", status: 422
158
+ # # => renders app/views/posts/new.html.erb with HTTP status code 422
159
+ #
160
+ # render "posts/new", status: :unprocessable_entity
161
+ # # => renders app/views/posts/new.html.erb with HTTP status code 422
162
+ #
163
+ #--
13
164
  # Check for double render errors and set the content_type after rendering.
14
- def render(*args) #:nodoc:
15
- raise ::AbstractController::DoubleRenderError if self.response_body
165
+ def render(*args)
166
+ raise ::AbstractController::DoubleRenderError if response_body
16
167
  super
17
168
  end
18
169
 
19
- # Overwrite render_to_string because body can now be set to a rack body.
170
+ # Similar to #render, but only returns the rendered template as a string,
171
+ # instead of setting `self.response_body`.
172
+ #--
173
+ # Override render_to_string because body can now be set to a Rack body.
20
174
  def render_to_string(*)
21
175
  result = super
22
176
  if result.respond_to?(:each)
23
- string = ""
177
+ string = +""
24
178
  result.each { |r| string << r }
25
179
  string
26
180
  else
@@ -28,73 +182,79 @@ module ActionController
28
182
  end
29
183
  end
30
184
 
31
- def render_to_body(options = {})
32
- super || _render_in_priorities(options) || ' '
185
+ def render_to_body(options = {}) # :nodoc:
186
+ super || _render_in_priorities(options) || " "
33
187
  end
34
188
 
35
189
  private
36
-
37
- def _render_in_priorities(options)
38
- RENDER_FORMATS_IN_PRIORITY.each do |format|
39
- return options[format] if options.key?(format)
190
+ # Before processing, set the request formats in current controller formats.
191
+ def process_action(*) # :nodoc:
192
+ self.formats = request.formats.filter_map(&:ref)
193
+ super
40
194
  end
41
195
 
42
- nil
43
- end
44
-
45
- def _process_format(format, options = {})
46
- super
47
-
48
- if options[:plain]
49
- self.content_type = Mime::TEXT
50
- else
51
- self.content_type ||= format.to_s
196
+ def _process_variant(options)
197
+ if defined?(request) && !request.nil? && request.variant.present?
198
+ options[:variant] = request.variant
199
+ end
52
200
  end
53
- end
54
201
 
55
- # Normalize arguments by catching blocks and setting them on :update.
56
- def _normalize_args(action=nil, options={}, &blk) #:nodoc:
57
- options = super
58
- options[:update] = blk if block_given?
59
- options
60
- end
202
+ def _render_in_priorities(options)
203
+ RENDER_FORMATS_IN_PRIORITY.each do |format|
204
+ return options[format] if options.key?(format)
205
+ end
61
206
 
62
- # Normalize both text and status options.
63
- def _normalize_options(options) #:nodoc:
64
- _normalize_text(options)
207
+ nil
208
+ end
65
209
 
66
- if options[:html]
67
- options[:html] = ERB::Util.html_escape(options[:html])
210
+ def _set_html_content_type
211
+ self.content_type = Mime[:html].to_s
68
212
  end
69
213
 
70
- if options.delete(:nothing)
71
- options[:body] = nil
214
+ def _set_rendered_content_type(format)
215
+ if format && !response.media_type
216
+ self.content_type = format.to_s
217
+ end
72
218
  end
73
219
 
74
- if options[:status]
75
- options[:status] = Rack::Utils.status_code(options[:status])
220
+ def _set_vary_header
221
+ if response.headers["Vary"].blank? && request.should_apply_vary_header?
222
+ response.headers["Vary"] = "Accept"
223
+ end
76
224
  end
77
225
 
78
- super
79
- end
226
+ # Normalize both text and status options.
227
+ def _normalize_options(options)
228
+ _normalize_text(options)
229
+
230
+ if options[:html]
231
+ options[:html] = ERB::Util.html_escape(options[:html])
232
+ end
80
233
 
81
- def _normalize_text(options)
82
- RENDER_FORMATS_IN_PRIORITY.each do |format|
83
- if options.key?(format) && options[format].respond_to?(:to_text)
84
- options[format] = options[format].to_text
234
+ if options[:status]
235
+ options[:status] = Rack::Utils.status_code(options[:status])
236
+ end
237
+
238
+ super
239
+ end
240
+
241
+ def _normalize_text(options)
242
+ RENDER_FORMATS_IN_PRIORITY.each do |format|
243
+ if options.key?(format) && options[format].respond_to?(:to_text)
244
+ options[format] = options[format].to_text
245
+ end
85
246
  end
86
247
  end
87
- end
88
248
 
89
- # Process controller specific options, as status, content-type and location.
90
- def _process_options(options) #:nodoc:
91
- status, content_type, location = options.values_at(:status, :content_type, :location)
249
+ # Process controller specific options, as status, content-type and location.
250
+ def _process_options(options)
251
+ status, content_type, location = options.values_at(:status, :content_type, :location)
92
252
 
93
- self.status = status if status
94
- self.content_type = content_type if content_type
95
- self.headers["Location"] = url_for(location) if location
253
+ self.status = status if status
254
+ self.content_type = content_type if content_type
255
+ headers["Location"] = url_for(location) if location
96
256
 
97
- super
98
- end
257
+ super
258
+ end
99
259
  end
100
260
  end