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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +279 -603
- data/MIT-LICENSE +1 -1
- data/README.rdoc +13 -297
- data/lib/abstract_controller/asset_paths.rb +4 -2
- data/lib/abstract_controller/base.rb +82 -52
- data/lib/abstract_controller/caching/fragments.rb +166 -0
- data/lib/abstract_controller/caching.rb +66 -0
- data/lib/abstract_controller/callbacks.rb +117 -103
- data/lib/abstract_controller/collector.rb +18 -7
- data/lib/abstract_controller/error.rb +6 -0
- data/lib/abstract_controller/helpers.rb +65 -38
- data/lib/abstract_controller/logger.rb +3 -2
- data/lib/abstract_controller/railties/routes_helpers.rb +5 -3
- data/lib/abstract_controller/rendering.rb +77 -129
- data/lib/abstract_controller/translation.rb +21 -3
- data/lib/abstract_controller/url_for.rb +9 -7
- data/lib/abstract_controller.rb +12 -13
- data/lib/action_controller/api/api_rendering.rb +16 -0
- data/lib/action_controller/api.rb +149 -0
- data/lib/action_controller/base.rb +81 -40
- data/lib/action_controller/caching.rb +22 -62
- data/lib/action_controller/form_builder.rb +50 -0
- data/lib/action_controller/log_subscriber.rb +30 -18
- data/lib/action_controller/metal/basic_implicit_render.rb +13 -0
- data/lib/action_controller/metal/conditional_get.rb +190 -47
- data/lib/action_controller/metal/content_security_policy.rb +52 -0
- data/lib/action_controller/metal/cookies.rb +3 -3
- data/lib/action_controller/metal/data_streaming.rb +40 -65
- data/lib/action_controller/metal/etag_with_flash.rb +18 -0
- data/lib/action_controller/metal/etag_with_template_digest.rb +57 -0
- data/lib/action_controller/metal/exceptions.rb +19 -12
- data/lib/action_controller/metal/flash.rb +42 -9
- data/lib/action_controller/metal/force_ssl.rb +79 -19
- data/lib/action_controller/metal/head.rb +35 -10
- data/lib/action_controller/metal/helpers.rb +31 -21
- data/lib/action_controller/metal/http_authentication.rb +182 -134
- data/lib/action_controller/metal/implicit_render.rb +62 -8
- data/lib/action_controller/metal/instrumentation.rb +28 -26
- data/lib/action_controller/metal/live.rb +312 -0
- data/lib/action_controller/metal/mime_responds.rb +159 -163
- data/lib/action_controller/metal/parameter_encoding.rb +51 -0
- data/lib/action_controller/metal/params_wrapper.rb +146 -93
- data/lib/action_controller/metal/redirecting.rb +80 -56
- data/lib/action_controller/metal/renderers.rb +119 -47
- data/lib/action_controller/metal/rendering.rb +89 -32
- data/lib/action_controller/metal/request_forgery_protection.rb +373 -41
- data/lib/action_controller/metal/rescue.rb +9 -16
- data/lib/action_controller/metal/streaming.rb +39 -45
- data/lib/action_controller/metal/strong_parameters.rb +1086 -0
- data/lib/action_controller/metal/testing.rb +8 -29
- data/lib/action_controller/metal/url_for.rb +43 -32
- data/lib/action_controller/metal.rb +112 -106
- data/lib/action_controller/railtie.rb +56 -18
- data/lib/action_controller/railties/helpers.rb +24 -0
- data/lib/action_controller/renderer.rb +117 -0
- data/lib/action_controller/template_assertions.rb +11 -0
- data/lib/action_controller/test_case.rb +402 -347
- data/lib/action_controller.rb +31 -30
- data/lib/action_dispatch/http/cache.rb +133 -34
- data/lib/action_dispatch/http/content_security_policy.rb +272 -0
- data/lib/action_dispatch/http/filter_parameters.rb +40 -24
- data/lib/action_dispatch/http/filter_redirect.rb +37 -0
- data/lib/action_dispatch/http/headers.rb +117 -16
- data/lib/action_dispatch/http/mime_negotiation.rb +98 -33
- data/lib/action_dispatch/http/mime_type.rb +198 -146
- data/lib/action_dispatch/http/mime_types.rb +22 -7
- data/lib/action_dispatch/http/parameter_filter.rb +61 -49
- data/lib/action_dispatch/http/parameters.rb +94 -51
- data/lib/action_dispatch/http/rack_cache.rb +4 -3
- data/lib/action_dispatch/http/request.rb +262 -117
- data/lib/action_dispatch/http/response.rb +400 -86
- data/lib/action_dispatch/http/upload.rb +66 -29
- data/lib/action_dispatch/http/url.rb +232 -60
- data/lib/action_dispatch/journey/formatter.rb +189 -0
- data/lib/action_dispatch/journey/gtg/builder.rb +164 -0
- data/lib/action_dispatch/journey/gtg/simulator.rb +41 -0
- data/lib/action_dispatch/journey/gtg/transition_table.rb +158 -0
- data/lib/action_dispatch/journey/nfa/builder.rb +78 -0
- data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
- data/lib/action_dispatch/journey/nfa/simulator.rb +49 -0
- data/lib/action_dispatch/journey/nfa/transition_table.rb +120 -0
- data/lib/action_dispatch/journey/nodes/node.rb +140 -0
- data/lib/action_dispatch/journey/parser.rb +199 -0
- data/lib/action_dispatch/journey/parser.y +50 -0
- data/lib/action_dispatch/journey/parser_extras.rb +31 -0
- data/lib/action_dispatch/journey/path/pattern.rb +199 -0
- data/lib/action_dispatch/journey/route.rb +203 -0
- data/lib/action_dispatch/journey/router/utils.rb +102 -0
- data/lib/action_dispatch/journey/router.rb +156 -0
- data/lib/action_dispatch/journey/routes.rb +82 -0
- data/lib/action_dispatch/journey/scanner.rb +64 -0
- data/lib/action_dispatch/journey/visitors.rb +268 -0
- data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
- data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
- data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
- data/lib/action_dispatch/journey.rb +7 -0
- data/lib/action_dispatch/middleware/callbacks.rb +17 -13
- data/lib/action_dispatch/middleware/cookies.rb +494 -162
- data/lib/action_dispatch/middleware/debug_exceptions.rb +176 -53
- data/lib/action_dispatch/middleware/debug_locks.rb +124 -0
- data/lib/action_dispatch/middleware/exception_wrapper.rb +103 -38
- data/lib/action_dispatch/middleware/executor.rb +21 -0
- data/lib/action_dispatch/middleware/flash.rb +128 -91
- data/lib/action_dispatch/middleware/public_exceptions.rb +43 -16
- data/lib/action_dispatch/middleware/reloader.rb +6 -83
- data/lib/action_dispatch/middleware/remote_ip.rb +151 -49
- data/lib/action_dispatch/middleware/request_id.rb +19 -15
- data/lib/action_dispatch/middleware/session/abstract_store.rb +38 -34
- data/lib/action_dispatch/middleware/session/cache_store.rb +14 -9
- data/lib/action_dispatch/middleware/session/cookie_store.rb +94 -44
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +15 -4
- data/lib/action_dispatch/middleware/show_exceptions.rb +36 -61
- data/lib/action_dispatch/middleware/ssl.rb +150 -0
- data/lib/action_dispatch/middleware/stack.rb +33 -41
- data/lib/action_dispatch/middleware/static.rb +92 -48
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +22 -0
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
- data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +27 -0
- data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +16 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.html.erb +21 -0
- data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.text.erb +13 -0
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +134 -5
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +200 -0
- data/lib/action_dispatch/railtie.rb +29 -8
- data/lib/action_dispatch/request/session.rb +234 -0
- data/lib/action_dispatch/request/utils.rb +78 -0
- data/lib/action_dispatch/routing/endpoint.rb +17 -0
- data/lib/action_dispatch/routing/inspector.rb +225 -0
- data/lib/action_dispatch/routing/mapper.rb +1329 -582
- data/lib/action_dispatch/routing/polymorphic_routes.rb +237 -94
- data/lib/action_dispatch/routing/redirection.rb +120 -50
- data/lib/action_dispatch/routing/route_set.rb +545 -322
- data/lib/action_dispatch/routing/routes_proxy.rb +37 -7
- data/lib/action_dispatch/routing/url_for.rb +103 -34
- data/lib/action_dispatch/routing.rb +66 -99
- data/lib/action_dispatch/system_test_case.rb +147 -0
- data/lib/action_dispatch/system_testing/browser.rb +49 -0
- data/lib/action_dispatch/system_testing/driver.rb +59 -0
- data/lib/action_dispatch/system_testing/server.rb +31 -0
- data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +96 -0
- data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +31 -0
- data/lib/action_dispatch/system_testing/test_helpers/undef_methods.rb +26 -0
- data/lib/action_dispatch/testing/assertion_response.rb +47 -0
- data/lib/action_dispatch/testing/assertions/response.rb +53 -42
- data/lib/action_dispatch/testing/assertions/routing.rb +79 -74
- data/lib/action_dispatch/testing/assertions.rb +15 -9
- data/lib/action_dispatch/testing/integration.rb +361 -207
- data/lib/action_dispatch/testing/request_encoder.rb +55 -0
- data/lib/action_dispatch/testing/test_process.rb +28 -19
- data/lib/action_dispatch/testing/test_request.rb +30 -33
- data/lib/action_dispatch/testing/test_response.rb +35 -11
- data/lib/action_dispatch.rb +42 -32
- data/lib/action_pack/gem_version.rb +17 -0
- data/lib/action_pack/version.rb +7 -7
- data/lib/action_pack.rb +4 -2
- metadata +116 -175
- data/lib/abstract_controller/layouts.rb +0 -423
- data/lib/abstract_controller/view_paths.rb +0 -96
- data/lib/action_controller/caching/actions.rb +0 -185
- data/lib/action_controller/caching/fragments.rb +0 -127
- data/lib/action_controller/caching/pages.rb +0 -187
- data/lib/action_controller/caching/sweeping.rb +0 -97
- data/lib/action_controller/deprecated/integration_test.rb +0 -2
- data/lib/action_controller/deprecated/performance_test.rb +0 -1
- data/lib/action_controller/deprecated.rb +0 -3
- data/lib/action_controller/metal/compatibility.rb +0 -65
- data/lib/action_controller/metal/hide_actions.rb +0 -41
- data/lib/action_controller/metal/rack_delegation.rb +0 -26
- data/lib/action_controller/metal/responder.rb +0 -286
- data/lib/action_controller/metal/session_management.rb +0 -14
- data/lib/action_controller/middleware.rb +0 -39
- data/lib/action_controller/railties/paths.rb +0 -25
- data/lib/action_controller/record_identifier.rb +0 -85
- data/lib/action_controller/vendor/html-scanner/html/document.rb +0 -68
- data/lib/action_controller/vendor/html-scanner/html/node.rb +0 -532
- data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +0 -177
- data/lib/action_controller/vendor/html-scanner/html/selector.rb +0 -830
- data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +0 -107
- data/lib/action_controller/vendor/html-scanner/html/version.rb +0 -11
- data/lib/action_controller/vendor/html-scanner.rb +0 -20
- data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
- data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
- data/lib/action_dispatch/middleware/head.rb +0 -18
- data/lib/action_dispatch/middleware/params_parser.rb +0 -75
- data/lib/action_dispatch/middleware/rescue.rb +0 -26
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +0 -31
- data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -26
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +0 -10
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -2
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +0 -15
- data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -17
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +0 -2
- data/lib/action_dispatch/testing/assertions/dom.rb +0 -37
- data/lib/action_dispatch/testing/assertions/selector.rb +0 -435
- data/lib/action_dispatch/testing/assertions/tag.rb +0 -138
- data/lib/action_dispatch/testing/performance_test.rb +0 -10
- data/lib/action_view/asset_paths.rb +0 -142
- data/lib/action_view/base.rb +0 -220
- data/lib/action_view/buffers.rb +0 -43
- data/lib/action_view/context.rb +0 -36
- data/lib/action_view/flows.rb +0 -79
- data/lib/action_view/helpers/active_model_helper.rb +0 -50
- data/lib/action_view/helpers/asset_paths.rb +0 -7
- data/lib/action_view/helpers/asset_tag_helper.rb +0 -457
- data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
- data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
- data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
- data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
- data/lib/action_view/helpers/atom_feed_helper.rb +0 -200
- data/lib/action_view/helpers/cache_helper.rb +0 -64
- data/lib/action_view/helpers/capture_helper.rb +0 -203
- data/lib/action_view/helpers/controller_helper.rb +0 -25
- data/lib/action_view/helpers/csrf_helper.rb +0 -32
- data/lib/action_view/helpers/date_helper.rb +0 -1062
- data/lib/action_view/helpers/debug_helper.rb +0 -40
- data/lib/action_view/helpers/form_helper.rb +0 -1486
- data/lib/action_view/helpers/form_options_helper.rb +0 -658
- data/lib/action_view/helpers/form_tag_helper.rb +0 -685
- data/lib/action_view/helpers/javascript_helper.rb +0 -110
- data/lib/action_view/helpers/number_helper.rb +0 -622
- data/lib/action_view/helpers/output_safety_helper.rb +0 -38
- data/lib/action_view/helpers/record_tag_helper.rb +0 -111
- data/lib/action_view/helpers/rendering_helper.rb +0 -92
- data/lib/action_view/helpers/sanitize_helper.rb +0 -259
- data/lib/action_view/helpers/tag_helper.rb +0 -167
- data/lib/action_view/helpers/text_helper.rb +0 -426
- data/lib/action_view/helpers/translation_helper.rb +0 -91
- data/lib/action_view/helpers/url_helper.rb +0 -693
- data/lib/action_view/helpers.rb +0 -60
- data/lib/action_view/locale/en.yml +0 -160
- data/lib/action_view/log_subscriber.rb +0 -28
- data/lib/action_view/lookup_context.rb +0 -258
- data/lib/action_view/path_set.rb +0 -101
- data/lib/action_view/railtie.rb +0 -55
- data/lib/action_view/renderer/abstract_renderer.rb +0 -41
- data/lib/action_view/renderer/partial_renderer.rb +0 -415
- data/lib/action_view/renderer/renderer.rb +0 -61
- data/lib/action_view/renderer/streaming_template_renderer.rb +0 -106
- data/lib/action_view/renderer/template_renderer.rb +0 -95
- data/lib/action_view/template/error.rb +0 -128
- data/lib/action_view/template/handlers/builder.rb +0 -26
- data/lib/action_view/template/handlers/erb.rb +0 -125
- data/lib/action_view/template/handlers.rb +0 -50
- data/lib/action_view/template/resolver.rb +0 -298
- data/lib/action_view/template/text.rb +0 -30
- data/lib/action_view/template.rb +0 -337
- data/lib/action_view/test_case.rb +0 -246
- data/lib/action_view/testing/resolvers.rb +0 -49
- data/lib/action_view.rb +0 -84
- data/lib/sprockets/assets.rake +0 -99
- data/lib/sprockets/bootstrap.rb +0 -37
- data/lib/sprockets/compressors.rb +0 -83
- data/lib/sprockets/helpers/isolated_helper.rb +0 -13
- data/lib/sprockets/helpers/rails_helper.rb +0 -182
- data/lib/sprockets/helpers.rb +0 -6
- data/lib/sprockets/railtie.rb +0 -62
- 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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
#
|
|
2
|
-
|
|
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 ||=
|
|
30
|
-
:
|
|
31
|
-
:
|
|
32
|
-
:
|
|
33
|
-
:
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
options[:
|
|
39
|
-
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
require
|
|
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, :
|
|
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,
|
|
16
|
-
|
|
17
|
-
@
|
|
18
|
-
|
|
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
|
-
|
|
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
|
-
#
|
|
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
|
|
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 ||=
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
177
|
-
|
|
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
|
-
|
|
181
|
-
|
|
183
|
+
# Tests if render or redirect has already happened.
|
|
184
|
+
def performed?
|
|
185
|
+
response_body || response.committed?
|
|
182
186
|
end
|
|
183
187
|
|
|
184
|
-
def
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
|
196
|
-
|
|
196
|
+
def set_response!(response) # :nodoc:
|
|
197
|
+
@_response = response
|
|
197
198
|
end
|
|
198
199
|
|
|
199
|
-
def
|
|
200
|
+
def set_request!(request) #:nodoc:
|
|
200
201
|
@_request = request
|
|
201
|
-
@
|
|
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
|
|
206
|
+
response.to_a
|
|
209
207
|
end
|
|
210
208
|
|
|
211
|
-
|
|
212
|
-
|
|
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 =
|
|
215
|
+
def self.inherited(base) # :nodoc:
|
|
216
|
+
base.middleware_stack = middleware_stack.dup
|
|
216
217
|
super
|
|
217
218
|
end
|
|
218
219
|
|
|
219
|
-
#
|
|
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
|
-
#
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
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
|
-
#
|
|
236
|
-
#
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
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/
|
|
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
|
-
|
|
13
|
-
|
|
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.
|
|
17
|
-
|
|
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.
|
|
21
|
-
|
|
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.
|
|
29
|
-
options.
|
|
30
|
-
options.page_cache_directory ||= paths["public"].first
|
|
43
|
+
options.logger ||= Rails.logger
|
|
44
|
+
options.cache_store ||= Rails.cache
|
|
31
45
|
|
|
32
|
-
|
|
33
|
-
options.
|
|
34
|
-
|
|
35
|
-
|
|
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::
|
|
41
|
-
|
|
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
|