actionpack 3.2.22.5 → 5.2.4

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 (271) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +279 -603
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +13 -297
  5. data/lib/abstract_controller/asset_paths.rb +4 -2
  6. data/lib/abstract_controller/base.rb +82 -52
  7. data/lib/abstract_controller/caching/fragments.rb +166 -0
  8. data/lib/abstract_controller/caching.rb +66 -0
  9. data/lib/abstract_controller/callbacks.rb +117 -103
  10. data/lib/abstract_controller/collector.rb +18 -7
  11. data/lib/abstract_controller/error.rb +6 -0
  12. data/lib/abstract_controller/helpers.rb +65 -38
  13. data/lib/abstract_controller/logger.rb +3 -2
  14. data/lib/abstract_controller/railties/routes_helpers.rb +5 -3
  15. data/lib/abstract_controller/rendering.rb +77 -129
  16. data/lib/abstract_controller/translation.rb +21 -3
  17. data/lib/abstract_controller/url_for.rb +9 -7
  18. data/lib/abstract_controller.rb +12 -13
  19. data/lib/action_controller/api/api_rendering.rb +16 -0
  20. data/lib/action_controller/api.rb +149 -0
  21. data/lib/action_controller/base.rb +81 -40
  22. data/lib/action_controller/caching.rb +22 -62
  23. data/lib/action_controller/form_builder.rb +50 -0
  24. data/lib/action_controller/log_subscriber.rb +30 -18
  25. data/lib/action_controller/metal/basic_implicit_render.rb +13 -0
  26. data/lib/action_controller/metal/conditional_get.rb +190 -47
  27. data/lib/action_controller/metal/content_security_policy.rb +52 -0
  28. data/lib/action_controller/metal/cookies.rb +3 -3
  29. data/lib/action_controller/metal/data_streaming.rb +40 -65
  30. data/lib/action_controller/metal/etag_with_flash.rb +18 -0
  31. data/lib/action_controller/metal/etag_with_template_digest.rb +57 -0
  32. data/lib/action_controller/metal/exceptions.rb +19 -12
  33. data/lib/action_controller/metal/flash.rb +42 -9
  34. data/lib/action_controller/metal/force_ssl.rb +79 -19
  35. data/lib/action_controller/metal/head.rb +35 -10
  36. data/lib/action_controller/metal/helpers.rb +31 -21
  37. data/lib/action_controller/metal/http_authentication.rb +182 -134
  38. data/lib/action_controller/metal/implicit_render.rb +62 -8
  39. data/lib/action_controller/metal/instrumentation.rb +28 -26
  40. data/lib/action_controller/metal/live.rb +312 -0
  41. data/lib/action_controller/metal/mime_responds.rb +159 -163
  42. data/lib/action_controller/metal/parameter_encoding.rb +51 -0
  43. data/lib/action_controller/metal/params_wrapper.rb +146 -93
  44. data/lib/action_controller/metal/redirecting.rb +80 -56
  45. data/lib/action_controller/metal/renderers.rb +119 -47
  46. data/lib/action_controller/metal/rendering.rb +89 -32
  47. data/lib/action_controller/metal/request_forgery_protection.rb +373 -41
  48. data/lib/action_controller/metal/rescue.rb +9 -16
  49. data/lib/action_controller/metal/streaming.rb +39 -45
  50. data/lib/action_controller/metal/strong_parameters.rb +1086 -0
  51. data/lib/action_controller/metal/testing.rb +8 -29
  52. data/lib/action_controller/metal/url_for.rb +43 -32
  53. data/lib/action_controller/metal.rb +112 -106
  54. data/lib/action_controller/railtie.rb +56 -18
  55. data/lib/action_controller/railties/helpers.rb +24 -0
  56. data/lib/action_controller/renderer.rb +117 -0
  57. data/lib/action_controller/template_assertions.rb +11 -0
  58. data/lib/action_controller/test_case.rb +402 -347
  59. data/lib/action_controller.rb +31 -30
  60. data/lib/action_dispatch/http/cache.rb +133 -34
  61. data/lib/action_dispatch/http/content_security_policy.rb +272 -0
  62. data/lib/action_dispatch/http/filter_parameters.rb +40 -24
  63. data/lib/action_dispatch/http/filter_redirect.rb +37 -0
  64. data/lib/action_dispatch/http/headers.rb +117 -16
  65. data/lib/action_dispatch/http/mime_negotiation.rb +98 -33
  66. data/lib/action_dispatch/http/mime_type.rb +198 -146
  67. data/lib/action_dispatch/http/mime_types.rb +22 -7
  68. data/lib/action_dispatch/http/parameter_filter.rb +61 -49
  69. data/lib/action_dispatch/http/parameters.rb +94 -51
  70. data/lib/action_dispatch/http/rack_cache.rb +4 -3
  71. data/lib/action_dispatch/http/request.rb +262 -117
  72. data/lib/action_dispatch/http/response.rb +400 -86
  73. data/lib/action_dispatch/http/upload.rb +66 -29
  74. data/lib/action_dispatch/http/url.rb +232 -60
  75. data/lib/action_dispatch/journey/formatter.rb +189 -0
  76. data/lib/action_dispatch/journey/gtg/builder.rb +164 -0
  77. data/lib/action_dispatch/journey/gtg/simulator.rb +41 -0
  78. data/lib/action_dispatch/journey/gtg/transition_table.rb +158 -0
  79. data/lib/action_dispatch/journey/nfa/builder.rb +78 -0
  80. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  81. data/lib/action_dispatch/journey/nfa/simulator.rb +49 -0
  82. data/lib/action_dispatch/journey/nfa/transition_table.rb +120 -0
  83. data/lib/action_dispatch/journey/nodes/node.rb +140 -0
  84. data/lib/action_dispatch/journey/parser.rb +199 -0
  85. data/lib/action_dispatch/journey/parser.y +50 -0
  86. data/lib/action_dispatch/journey/parser_extras.rb +31 -0
  87. data/lib/action_dispatch/journey/path/pattern.rb +199 -0
  88. data/lib/action_dispatch/journey/route.rb +203 -0
  89. data/lib/action_dispatch/journey/router/utils.rb +102 -0
  90. data/lib/action_dispatch/journey/router.rb +156 -0
  91. data/lib/action_dispatch/journey/routes.rb +82 -0
  92. data/lib/action_dispatch/journey/scanner.rb +64 -0
  93. data/lib/action_dispatch/journey/visitors.rb +268 -0
  94. data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
  95. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  96. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  97. data/lib/action_dispatch/journey.rb +7 -0
  98. data/lib/action_dispatch/middleware/callbacks.rb +17 -13
  99. data/lib/action_dispatch/middleware/cookies.rb +494 -162
  100. data/lib/action_dispatch/middleware/debug_exceptions.rb +176 -53
  101. data/lib/action_dispatch/middleware/debug_locks.rb +124 -0
  102. data/lib/action_dispatch/middleware/exception_wrapper.rb +103 -38
  103. data/lib/action_dispatch/middleware/executor.rb +21 -0
  104. data/lib/action_dispatch/middleware/flash.rb +128 -91
  105. data/lib/action_dispatch/middleware/public_exceptions.rb +43 -16
  106. data/lib/action_dispatch/middleware/reloader.rb +6 -83
  107. data/lib/action_dispatch/middleware/remote_ip.rb +151 -49
  108. data/lib/action_dispatch/middleware/request_id.rb +19 -15
  109. data/lib/action_dispatch/middleware/session/abstract_store.rb +38 -34
  110. data/lib/action_dispatch/middleware/session/cache_store.rb +14 -9
  111. data/lib/action_dispatch/middleware/session/cookie_store.rb +94 -44
  112. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +15 -4
  113. data/lib/action_dispatch/middleware/show_exceptions.rb +36 -61
  114. data/lib/action_dispatch/middleware/ssl.rb +150 -0
  115. data/lib/action_dispatch/middleware/stack.rb +33 -41
  116. data/lib/action_dispatch/middleware/static.rb +92 -48
  117. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +22 -0
  118. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
  119. data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +27 -0
  120. data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
  121. data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
  122. data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
  123. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +16 -0
  124. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
  125. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.html.erb +21 -0
  126. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.text.erb +13 -0
  127. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +134 -5
  128. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
  129. data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
  130. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
  131. data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
  132. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
  133. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
  134. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
  135. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
  136. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  137. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +200 -0
  138. data/lib/action_dispatch/railtie.rb +29 -8
  139. data/lib/action_dispatch/request/session.rb +234 -0
  140. data/lib/action_dispatch/request/utils.rb +78 -0
  141. data/lib/action_dispatch/routing/endpoint.rb +17 -0
  142. data/lib/action_dispatch/routing/inspector.rb +225 -0
  143. data/lib/action_dispatch/routing/mapper.rb +1329 -582
  144. data/lib/action_dispatch/routing/polymorphic_routes.rb +237 -94
  145. data/lib/action_dispatch/routing/redirection.rb +120 -50
  146. data/lib/action_dispatch/routing/route_set.rb +545 -322
  147. data/lib/action_dispatch/routing/routes_proxy.rb +37 -7
  148. data/lib/action_dispatch/routing/url_for.rb +103 -34
  149. data/lib/action_dispatch/routing.rb +66 -99
  150. data/lib/action_dispatch/system_test_case.rb +147 -0
  151. data/lib/action_dispatch/system_testing/browser.rb +49 -0
  152. data/lib/action_dispatch/system_testing/driver.rb +59 -0
  153. data/lib/action_dispatch/system_testing/server.rb +31 -0
  154. data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +96 -0
  155. data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +31 -0
  156. data/lib/action_dispatch/system_testing/test_helpers/undef_methods.rb +26 -0
  157. data/lib/action_dispatch/testing/assertion_response.rb +47 -0
  158. data/lib/action_dispatch/testing/assertions/response.rb +53 -42
  159. data/lib/action_dispatch/testing/assertions/routing.rb +79 -74
  160. data/lib/action_dispatch/testing/assertions.rb +15 -9
  161. data/lib/action_dispatch/testing/integration.rb +361 -207
  162. data/lib/action_dispatch/testing/request_encoder.rb +55 -0
  163. data/lib/action_dispatch/testing/test_process.rb +28 -19
  164. data/lib/action_dispatch/testing/test_request.rb +30 -33
  165. data/lib/action_dispatch/testing/test_response.rb +35 -11
  166. data/lib/action_dispatch.rb +42 -32
  167. data/lib/action_pack/gem_version.rb +17 -0
  168. data/lib/action_pack/version.rb +7 -7
  169. data/lib/action_pack.rb +4 -2
  170. metadata +116 -175
  171. data/lib/abstract_controller/layouts.rb +0 -423
  172. data/lib/abstract_controller/view_paths.rb +0 -96
  173. data/lib/action_controller/caching/actions.rb +0 -185
  174. data/lib/action_controller/caching/fragments.rb +0 -127
  175. data/lib/action_controller/caching/pages.rb +0 -187
  176. data/lib/action_controller/caching/sweeping.rb +0 -97
  177. data/lib/action_controller/deprecated/integration_test.rb +0 -2
  178. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  179. data/lib/action_controller/deprecated.rb +0 -3
  180. data/lib/action_controller/metal/compatibility.rb +0 -65
  181. data/lib/action_controller/metal/hide_actions.rb +0 -41
  182. data/lib/action_controller/metal/rack_delegation.rb +0 -26
  183. data/lib/action_controller/metal/responder.rb +0 -286
  184. data/lib/action_controller/metal/session_management.rb +0 -14
  185. data/lib/action_controller/middleware.rb +0 -39
  186. data/lib/action_controller/railties/paths.rb +0 -25
  187. data/lib/action_controller/record_identifier.rb +0 -85
  188. data/lib/action_controller/vendor/html-scanner/html/document.rb +0 -68
  189. data/lib/action_controller/vendor/html-scanner/html/node.rb +0 -532
  190. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +0 -177
  191. data/lib/action_controller/vendor/html-scanner/html/selector.rb +0 -830
  192. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +0 -107
  193. data/lib/action_controller/vendor/html-scanner/html/version.rb +0 -11
  194. data/lib/action_controller/vendor/html-scanner.rb +0 -20
  195. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  196. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  197. data/lib/action_dispatch/middleware/head.rb +0 -18
  198. data/lib/action_dispatch/middleware/params_parser.rb +0 -75
  199. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  200. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +0 -31
  201. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -26
  202. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +0 -10
  203. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -2
  204. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +0 -15
  205. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -17
  206. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +0 -2
  207. data/lib/action_dispatch/testing/assertions/dom.rb +0 -37
  208. data/lib/action_dispatch/testing/assertions/selector.rb +0 -435
  209. data/lib/action_dispatch/testing/assertions/tag.rb +0 -138
  210. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  211. data/lib/action_view/asset_paths.rb +0 -142
  212. data/lib/action_view/base.rb +0 -220
  213. data/lib/action_view/buffers.rb +0 -43
  214. data/lib/action_view/context.rb +0 -36
  215. data/lib/action_view/flows.rb +0 -79
  216. data/lib/action_view/helpers/active_model_helper.rb +0 -50
  217. data/lib/action_view/helpers/asset_paths.rb +0 -7
  218. data/lib/action_view/helpers/asset_tag_helper.rb +0 -457
  219. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  220. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  221. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  222. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  223. data/lib/action_view/helpers/atom_feed_helper.rb +0 -200
  224. data/lib/action_view/helpers/cache_helper.rb +0 -64
  225. data/lib/action_view/helpers/capture_helper.rb +0 -203
  226. data/lib/action_view/helpers/controller_helper.rb +0 -25
  227. data/lib/action_view/helpers/csrf_helper.rb +0 -32
  228. data/lib/action_view/helpers/date_helper.rb +0 -1062
  229. data/lib/action_view/helpers/debug_helper.rb +0 -40
  230. data/lib/action_view/helpers/form_helper.rb +0 -1486
  231. data/lib/action_view/helpers/form_options_helper.rb +0 -658
  232. data/lib/action_view/helpers/form_tag_helper.rb +0 -685
  233. data/lib/action_view/helpers/javascript_helper.rb +0 -110
  234. data/lib/action_view/helpers/number_helper.rb +0 -622
  235. data/lib/action_view/helpers/output_safety_helper.rb +0 -38
  236. data/lib/action_view/helpers/record_tag_helper.rb +0 -111
  237. data/lib/action_view/helpers/rendering_helper.rb +0 -92
  238. data/lib/action_view/helpers/sanitize_helper.rb +0 -259
  239. data/lib/action_view/helpers/tag_helper.rb +0 -167
  240. data/lib/action_view/helpers/text_helper.rb +0 -426
  241. data/lib/action_view/helpers/translation_helper.rb +0 -91
  242. data/lib/action_view/helpers/url_helper.rb +0 -693
  243. data/lib/action_view/helpers.rb +0 -60
  244. data/lib/action_view/locale/en.yml +0 -160
  245. data/lib/action_view/log_subscriber.rb +0 -28
  246. data/lib/action_view/lookup_context.rb +0 -258
  247. data/lib/action_view/path_set.rb +0 -101
  248. data/lib/action_view/railtie.rb +0 -55
  249. data/lib/action_view/renderer/abstract_renderer.rb +0 -41
  250. data/lib/action_view/renderer/partial_renderer.rb +0 -415
  251. data/lib/action_view/renderer/renderer.rb +0 -61
  252. data/lib/action_view/renderer/streaming_template_renderer.rb +0 -106
  253. data/lib/action_view/renderer/template_renderer.rb +0 -95
  254. data/lib/action_view/template/error.rb +0 -128
  255. data/lib/action_view/template/handlers/builder.rb +0 -26
  256. data/lib/action_view/template/handlers/erb.rb +0 -125
  257. data/lib/action_view/template/handlers.rb +0 -50
  258. data/lib/action_view/template/resolver.rb +0 -298
  259. data/lib/action_view/template/text.rb +0 -30
  260. data/lib/action_view/template.rb +0 -337
  261. data/lib/action_view/test_case.rb +0 -246
  262. data/lib/action_view/testing/resolvers.rb +0 -49
  263. data/lib/action_view.rb +0 -84
  264. data/lib/sprockets/assets.rake +0 -99
  265. data/lib/sprockets/bootstrap.rb +0 -37
  266. data/lib/sprockets/compressors.rb +0 -83
  267. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  268. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  269. data/lib/sprockets/helpers.rb +0 -6
  270. data/lib/sprockets/railtie.rb +0 -62
  271. data/lib/sprockets/static_compiler.rb +0 -56
@@ -1,36 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActionController
2
4
  module Testing
3
5
  extend ActiveSupport::Concern
4
6
 
5
- include RackDelegation
6
-
7
- def recycle!
8
- @_url_options = nil
9
- end
10
-
11
-
12
- # TODO: Clean this up
13
- def process_with_new_base_test(request, response)
14
- @_request = request
15
- @_response = response
16
- @_response.request = request
17
- ret = process(request.parameters[:action])
18
- if cookies = @_request.env['action_dispatch.cookies']
19
- cookies.write(@_response)
20
- end
21
- @_response.prepare!
22
- ret
23
- end
24
-
25
- # TODO : Rewrite tests using controller.headers= to use Rack env
26
- def headers=(new_headers)
27
- @_response ||= ActionDispatch::Response.new
28
- @_response.headers.replace(new_headers)
29
- end
30
-
31
- module ClassMethods
32
- def before_filters
33
- _process_action_callbacks.find_all{|x| x.kind == :before}.map{|x| x.name}
7
+ # Behavior specific to functional tests
8
+ module Functional # :nodoc:
9
+ def recycle!
10
+ @_url_options = nil
11
+ self.formats = nil
12
+ self.params = nil
34
13
  end
35
14
  end
36
15
  end
@@ -1,47 +1,58 @@
1
- # Includes +url_for+ into the host class. The class has to provide a +RouteSet+ by implementing
2
- # the <tt>_routes</tt> method. Otherwise, an exception will be raised.
3
- #
4
- # In addition to <tt>AbstractController::UrlFor</tt>, this module accesses the HTTP layer to define
5
- # url options like the +host+. In order to do so, this module requires the host class
6
- # to implement +env+ and +request+, which need to be a Rack-compatible.
7
- #
8
- # Example:
9
- #
10
- # class RootUrl
11
- # include ActionController::UrlFor
12
- # include Rails.application.routes.url_helpers
13
- #
14
- # delegate :env, :request, :to => :controller
15
- #
16
- # def initialize(controller)
17
- # @controller = controller
18
- # @url = root_path # named route from the application.
19
- # end
20
- # end
21
- #
1
+ # frozen_string_literal: true
2
+
22
3
  module ActionController
4
+ # Includes +url_for+ into the host class. The class has to provide a +RouteSet+ by implementing
5
+ # the <tt>_routes</tt> method. Otherwise, an exception will be raised.
6
+ #
7
+ # In addition to <tt>AbstractController::UrlFor</tt>, this module accesses the HTTP layer to define
8
+ # URL options like the +host+. In order to do so, this module requires the host class
9
+ # to implement +env+ which needs to be Rack-compatible and +request+
10
+ # which is either an instance of +ActionDispatch::Request+ or an object
11
+ # that responds to the +host+, +optional_port+, +protocol+ and
12
+ # +symbolized_path_parameter+ methods.
13
+ #
14
+ # class RootUrl
15
+ # include ActionController::UrlFor
16
+ # include Rails.application.routes.url_helpers
17
+ #
18
+ # delegate :env, :request, to: :controller
19
+ #
20
+ # def initialize(controller)
21
+ # @controller = controller
22
+ # @url = root_path # named route from the application.
23
+ # end
24
+ # end
23
25
  module UrlFor
24
26
  extend ActiveSupport::Concern
25
27
 
26
28
  include AbstractController::UrlFor
27
29
 
28
30
  def url_options
29
- @_url_options ||= super.reverse_merge(
30
- :host => request.host,
31
- :port => request.optional_port,
32
- :protocol => request.protocol,
33
- :_path_segments => request.symbolized_path_parameters
34
- ).freeze
31
+ @_url_options ||= {
32
+ host: request.host,
33
+ port: request.optional_port,
34
+ protocol: request.protocol,
35
+ _recall: request.path_parameters
36
+ }.merge!(super).freeze
37
+
38
+ if (same_origin = _routes.equal?(request.routes)) ||
39
+ (script_name = request.engine_script_name(_routes)) ||
40
+ (original_script_name = request.original_script_name)
35
41
 
36
- if _routes.equal?(env["action_dispatch.routes"])
37
- @_url_options.dup.tap do |options|
38
- options[:script_name] = request.script_name.dup
39
- options.freeze
42
+ options = @_url_options.dup
43
+ if original_script_name
44
+ options[:original_script_name] = original_script_name
45
+ else
46
+ if same_origin
47
+ options[:script_name] = request.script_name.empty? ? "".freeze : request.script_name.dup
48
+ else
49
+ options[:script_name] = script_name
50
+ end
40
51
  end
52
+ options.freeze
41
53
  else
42
54
  @_url_options
43
55
  end
44
56
  end
45
-
46
57
  end
47
58
  end
@@ -1,46 +1,64 @@
1
- require 'active_support/core_ext/class/attribute'
2
- require 'active_support/core_ext/object/blank'
3
- require 'action_dispatch/middleware/stack'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/array/extract_options"
4
+ require "action_dispatch/middleware/stack"
5
+ require "action_dispatch/http/request"
6
+ require "action_dispatch/http/response"
4
7
 
5
8
  module ActionController
6
9
  # Extend ActionDispatch middleware stack to make it aware of options
7
10
  # allowing the following syntax in controllers:
8
11
  #
9
12
  # class PostsController < ApplicationController
10
- # use AuthenticationMiddleware, :except => [:index, :show]
13
+ # use AuthenticationMiddleware, except: [:index, :show]
11
14
  # end
12
15
  #
13
16
  class MiddlewareStack < ActionDispatch::MiddlewareStack #:nodoc:
14
17
  class Middleware < ActionDispatch::MiddlewareStack::Middleware #:nodoc:
15
- def initialize(klass, *args, &block)
16
- options = args.extract_options!
17
- @only = Array(options.delete(:only)).map(&:to_s)
18
- @except = Array(options.delete(:except)).map(&:to_s)
19
- args << options unless options.empty?
20
- super
18
+ def initialize(klass, args, actions, strategy, block)
19
+ @actions = actions
20
+ @strategy = strategy
21
+ super(klass, args, block)
21
22
  end
22
23
 
23
24
  def valid?(action)
24
- if @only.present?
25
- @only.include?(action)
26
- elsif @except.present?
27
- !@except.include?(action)
28
- else
29
- true
30
- end
25
+ @strategy.call @actions, action
31
26
  end
32
27
  end
33
28
 
34
- def build(action, app=nil, &block)
35
- app ||= block
29
+ def build(action, app = nil, &block)
36
30
  action = action.to_s
37
- raise "MiddlewareStack#build requires an app" unless app
38
31
 
39
- middlewares.reverse.inject(app) do |a, middleware|
40
- middleware.valid?(action) ?
41
- middleware.build(a) : a
32
+ middlewares.reverse.inject(app || block) do |a, middleware|
33
+ middleware.valid?(action) ? middleware.build(a) : a
42
34
  end
43
35
  end
36
+
37
+ private
38
+
39
+ INCLUDE = ->(list, action) { list.include? action }
40
+ EXCLUDE = ->(list, action) { !list.include? action }
41
+ NULL = ->(list, action) { true }
42
+
43
+ def build_middleware(klass, args, block)
44
+ options = args.extract_options!
45
+ only = Array(options.delete(:only)).map(&:to_s)
46
+ except = Array(options.delete(:except)).map(&:to_s)
47
+ args << options unless options.empty?
48
+
49
+ strategy = NULL
50
+ list = nil
51
+
52
+ if only.any?
53
+ strategy = INCLUDE
54
+ list = only
55
+ elsif except.any?
56
+ strategy = EXCLUDE
57
+ list = except
58
+ end
59
+
60
+ Middleware.new(klass, args, list, strategy, block)
61
+ end
44
62
  end
45
63
 
46
64
  # <tt>ActionController::Metal</tt> is the simplest possible controller, providing a
@@ -58,7 +76,7 @@ module ActionController
58
76
  # And then to route requests to your metal controller, you would add
59
77
  # something like this to <tt>config/routes.rb</tt>:
60
78
  #
61
- # match 'hello', :to => HelloController.action(:index)
79
+ # get 'hello', to: HelloController.action(:index)
62
80
  #
63
81
  # The +action+ method returns a valid Rack application for the \Rails
64
82
  # router to dispatch to.
@@ -72,7 +90,8 @@ module ActionController
72
90
  # can do the following:
73
91
  #
74
92
  # class HelloController < ActionController::Metal
75
- # include ActionController::Rendering
93
+ # include AbstractController::Rendering
94
+ # include ActionView::Layouts
76
95
  # append_view_path "#{Rails.root}/app/views"
77
96
  #
78
97
  # def index
@@ -101,12 +120,6 @@ module ActionController
101
120
  class Metal < AbstractController::Base
102
121
  abstract!
103
122
 
104
- attr_internal_writer :env
105
-
106
- def env
107
- @_env ||= {}
108
- end
109
-
110
123
  # Returns the last part of the controller's name, underscored, without the ending
111
124
  # <tt>Controller</tt>. For instance, PostsController returns <tt>posts</tt>.
112
125
  # Namespaces are left out, so Admin::PostsController returns <tt>posts</tt> as well.
@@ -114,26 +127,30 @@ module ActionController
114
127
  # ==== Returns
115
128
  # * <tt>string</tt>
116
129
  def self.controller_name
117
- @controller_name ||= self.name.demodulize.sub(/Controller$/, '').underscore
130
+ @controller_name ||= name.demodulize.sub(/Controller$/, "").underscore
131
+ end
132
+
133
+ def self.make_response!(request)
134
+ ActionDispatch::Response.new.tap do |res|
135
+ res.request = request
136
+ end
137
+ end
138
+
139
+ def self.binary_params_for?(action) # :nodoc:
140
+ false
118
141
  end
119
142
 
120
- # Delegates to the class' <tt>controller_name</tt>
143
+ # Delegates to the class' <tt>controller_name</tt>.
121
144
  def controller_name
122
145
  self.class.controller_name
123
146
  end
124
147
 
125
- # The details below can be overridden to support a specific
126
- # Request and Response object. The default ActionController::Base
127
- # implementation includes RackDelegation, which makes a request
128
- # and response object available. You might wish to control the
129
- # environment and response manually for performance reasons.
130
-
131
- attr_internal :headers, :response, :request
132
- delegate :session, :to => "@_request"
148
+ attr_internal :response, :request
149
+ delegate :session, to: "@_request"
150
+ delegate :headers, :status=, :location=, :content_type=,
151
+ :status, :location, :content_type, to: "@_response"
133
152
 
134
153
  def initialize
135
- @_headers = {"Content-Type" => "text/html"}
136
- @_status = 200
137
154
  @_request = nil
138
155
  @_response = nil
139
156
  @_routes = nil
@@ -148,102 +165,91 @@ module ActionController
148
165
  @_params = val
149
166
  end
150
167
 
151
- # Basic implementations for content_type=, location=, and headers are
152
- # provided to reduce the dependency on the RackDelegation module
153
- # in Renderer and Redirector.
154
-
155
- def content_type=(type)
156
- headers["Content-Type"] = type.to_s
157
- end
168
+ alias :response_code :status # :nodoc:
158
169
 
159
- def content_type
160
- headers["Content-Type"]
161
- end
162
-
163
- def location
164
- headers["Location"]
165
- end
166
-
167
- def location=(url)
168
- headers["Location"] = url
169
- end
170
-
171
- # basic url_for that can be overridden for more robust functionality
170
+ # Basic url_for that can be overridden for more robust functionality.
172
171
  def url_for(string)
173
172
  string
174
173
  end
175
174
 
176
- def status
177
- @_status
175
+ def response_body=(body)
176
+ body = [body] unless body.nil? || body.respond_to?(:each)
177
+ response.reset_body!
178
+ return unless body
179
+ response.body = body
180
+ super
178
181
  end
179
182
 
180
- def status=(status)
181
- @_status = Rack::Utils.status_code(status)
183
+ # Tests if render or redirect has already happened.
184
+ def performed?
185
+ response_body || response.committed?
182
186
  end
183
187
 
184
- def response_body=(val)
185
- body = if val.is_a?(String)
186
- [val]
187
- elsif val.nil? || val.respond_to?(:each)
188
- val
189
- else
190
- [val]
191
- end
192
- super body
188
+ def dispatch(name, request, response) #:nodoc:
189
+ set_request!(request)
190
+ set_response!(response)
191
+ process(name)
192
+ request.commit_flash
193
+ to_a
193
194
  end
194
195
 
195
- def performed?
196
- response_body
196
+ def set_response!(response) # :nodoc:
197
+ @_response = response
197
198
  end
198
199
 
199
- def dispatch(name, request) #:nodoc:
200
+ def set_request!(request) #:nodoc:
200
201
  @_request = request
201
- @_env = request.env
202
- @_env['action_controller.instance'] = self
203
- process(name)
204
- to_a
202
+ @_request.controller_instance = self
205
203
  end
206
204
 
207
205
  def to_a #:nodoc:
208
- response ? response.to_a : [status, headers, response_body]
206
+ response.to_a
209
207
  end
210
208
 
211
- class_attribute :middleware_stack
212
- self.middleware_stack = ActionController::MiddlewareStack.new
209
+ def reset_session
210
+ @_request.reset_session
211
+ end
212
+
213
+ class_attribute :middleware_stack, default: ActionController::MiddlewareStack.new
213
214
 
214
- def self.inherited(base) #nodoc:
215
- base.middleware_stack = self.middleware_stack.dup
215
+ def self.inherited(base) # :nodoc:
216
+ base.middleware_stack = middleware_stack.dup
216
217
  super
217
218
  end
218
219
 
219
- # Adds given middleware class and its args to bottom of middleware_stack
220
+ # Pushes the given Rack middleware and its arguments to the bottom of the
221
+ # middleware stack.
220
222
  def self.use(*args, &block)
221
223
  middleware_stack.use(*args, &block)
222
224
  end
223
225
 
224
- # Alias for middleware_stack
226
+ # Alias for +middleware_stack+.
225
227
  def self.middleware
226
228
  middleware_stack
227
229
  end
228
230
 
229
- # Makes the controller a rack endpoint that points to the action in
230
- # the given env's action_dispatch.request.path_parameters key.
231
- def self.call(env)
232
- action(env['action_dispatch.request.path_parameters'][:action]).call(env)
231
+ # Returns a Rack endpoint for the given action name.
232
+ def self.action(name)
233
+ app = lambda { |env|
234
+ req = ActionDispatch::Request.new(env)
235
+ res = make_response! req
236
+ new.dispatch(name, req, res)
237
+ }
238
+
239
+ if middleware_stack.any?
240
+ middleware_stack.build(name, app)
241
+ else
242
+ app
243
+ end
233
244
  end
234
245
 
235
- # Return a rack endpoint for the given action. Memoize the endpoint, so
236
- # multiple calls into MyController.action will return the same object
237
- # for the same action.
238
- #
239
- # ==== Parameters
240
- # * <tt>action</tt> - An action name
241
- #
242
- # ==== Returns
243
- # * <tt>proc</tt> - A rack application
244
- def self.action(name, klass = ActionDispatch::Request)
245
- middleware_stack.build(name.to_s) do |env|
246
- new.dispatch(name, klass.new(env))
246
+ # Direct dispatch to the controller. Instantiates the controller, then
247
+ # executes the action named +name+.
248
+ def self.dispatch(name, req, res)
249
+ if middleware_stack.any?
250
+ middleware_stack.build(name) { |env| new.dispatch(name, req, res) }.call req.env
251
+ else
252
+ new.dispatch(name, req, res)
247
253
  end
248
254
  end
249
255
  end
@@ -1,44 +1,68 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "rails"
2
4
  require "action_controller"
3
5
  require "action_dispatch/railtie"
4
- require "action_view/railtie"
5
6
  require "abstract_controller/railties/routes_helpers"
6
- require "action_controller/railties/paths"
7
+ require "action_controller/railties/helpers"
8
+ require "action_view/railtie"
7
9
 
8
10
  module ActionController
9
- class Railtie < Rails::Railtie
11
+ class Railtie < Rails::Railtie #:nodoc:
10
12
  config.action_controller = ActiveSupport::OrderedOptions.new
11
13
 
12
- initializer "action_controller.logger" do
13
- ActiveSupport.on_load(:action_controller) { self.logger ||= Rails.logger }
14
+ config.eager_load_namespaces << ActionController
15
+
16
+ initializer "action_controller.assets_config", group: :all do |app|
17
+ app.config.action_controller.assets_dir ||= app.config.paths["public"].first
14
18
  end
15
19
 
16
- initializer "action_controller.initialize_framework_caches" do
17
- ActiveSupport.on_load(:action_controller) { self.cache_store ||= RAILS_CACHE }
20
+ initializer "action_controller.set_helpers_path" do |app|
21
+ ActionController::Helpers.helpers_path = app.helpers_paths
18
22
  end
19
23
 
20
- initializer "action_controller.assets_config", :group => :all do |app|
21
- app.config.action_controller.assets_dir ||= app.config.paths["public"].first
24
+ initializer "action_controller.parameters_config" do |app|
25
+ options = app.config.action_controller
26
+
27
+ ActiveSupport.on_load(:action_controller, run_once: true) do
28
+ ActionController::Parameters.permit_all_parameters = options.delete(:permit_all_parameters) { false }
29
+ if app.config.action_controller[:always_permitted_parameters]
30
+ ActionController::Parameters.always_permitted_parameters =
31
+ app.config.action_controller.delete(:always_permitted_parameters)
32
+ end
33
+ ActionController::Parameters.action_on_unpermitted_parameters = options.delete(:action_on_unpermitted_parameters) do
34
+ (Rails.env.test? || Rails.env.development?) ? :log : false
35
+ end
36
+ end
22
37
  end
23
38
 
24
39
  initializer "action_controller.set_configs" do |app|
25
40
  paths = app.config.paths
26
41
  options = app.config.action_controller
27
42
 
28
- options.javascripts_dir ||= paths["public/javascripts"].first
29
- options.stylesheets_dir ||= paths["public/stylesheets"].first
30
- options.page_cache_directory ||= paths["public"].first
43
+ options.logger ||= Rails.logger
44
+ options.cache_store ||= Rails.cache
31
45
 
32
- # make sure readers methods get compiled
33
- options.asset_path ||= app.config.asset_path
34
- options.asset_host ||= app.config.asset_host
35
- options.relative_url_root ||= app.config.relative_url_root
46
+ options.javascripts_dir ||= paths["public/javascripts"].first
47
+ options.stylesheets_dir ||= paths["public/stylesheets"].first
48
+
49
+ # Ensure readers methods get compiled.
50
+ options.asset_host ||= app.config.asset_host
51
+ options.relative_url_root ||= app.config.relative_url_root
36
52
 
37
53
  ActiveSupport.on_load(:action_controller) do
38
54
  include app.routes.mounted_helpers
39
55
  extend ::AbstractController::Railties::RoutesHelpers.with(app.routes)
40
- extend ::ActionController::Railties::Paths.with(app)
41
- options.each { |k,v| send("#{k}=", v) }
56
+ extend ::ActionController::Railties::Helpers
57
+
58
+ options.each do |k, v|
59
+ k = "#{k}="
60
+ if respond_to?(k)
61
+ send(k, v)
62
+ elsif !Base.respond_to?(k)
63
+ raise "Invalid option key: #{k}"
64
+ end
65
+ end
42
66
  end
43
67
  end
44
68
 
@@ -47,5 +71,19 @@ module ActionController
47
71
  config.compile_methods! if config.respond_to?(:compile_methods!)
48
72
  end
49
73
  end
74
+
75
+ initializer "action_controller.request_forgery_protection" do |app|
76
+ ActiveSupport.on_load(:action_controller_base) do
77
+ if app.config.action_controller.default_protect_from_forgery
78
+ protect_from_forgery with: :exception
79
+ end
80
+ end
81
+ end
82
+
83
+ initializer "action_controller.eager_load_actions" do
84
+ ActiveSupport.on_load(:after_initialize) do
85
+ ActionController::Metal.descendants.each(&:action_methods) if config.eager_load
86
+ end
87
+ end
50
88
  end
51
89
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActionController
4
+ module Railties
5
+ module Helpers
6
+ def inherited(klass)
7
+ super
8
+ return unless klass.respond_to?(:helpers_path=)
9
+
10
+ if namespace = klass.parents.detect { |m| m.respond_to?(:railtie_helpers_paths) }
11
+ paths = namespace.railtie_helpers_paths
12
+ else
13
+ paths = ActionController::Helpers.helpers_path
14
+ end
15
+
16
+ klass.helpers_path = paths
17
+
18
+ if klass.superclass == ActionController::Base && ActionController::Base.include_all_helpers
19
+ klass.helper :all
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end