omg-actionpack 8.0.0.alpha1
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 +7 -0
- data/CHANGELOG.md +129 -0
- data/MIT-LICENSE +21 -0
- data/README.rdoc +57 -0
- data/lib/abstract_controller/asset_paths.rb +14 -0
- data/lib/abstract_controller/base.rb +299 -0
- data/lib/abstract_controller/caching/fragments.rb +149 -0
- data/lib/abstract_controller/caching.rb +68 -0
- data/lib/abstract_controller/callbacks.rb +265 -0
- data/lib/abstract_controller/collector.rb +44 -0
- data/lib/abstract_controller/deprecator.rb +9 -0
- data/lib/abstract_controller/error.rb +8 -0
- data/lib/abstract_controller/helpers.rb +243 -0
- data/lib/abstract_controller/logger.rb +16 -0
- data/lib/abstract_controller/railties/routes_helpers.rb +25 -0
- data/lib/abstract_controller/rendering.rb +126 -0
- data/lib/abstract_controller/translation.rb +42 -0
- data/lib/abstract_controller/url_for.rb +37 -0
- data/lib/abstract_controller.rb +36 -0
- data/lib/action_controller/api/api_rendering.rb +18 -0
- data/lib/action_controller/api.rb +155 -0
- data/lib/action_controller/base.rb +332 -0
- data/lib/action_controller/caching.rb +49 -0
- data/lib/action_controller/deprecator.rb +9 -0
- data/lib/action_controller/form_builder.rb +55 -0
- data/lib/action_controller/log_subscriber.rb +96 -0
- data/lib/action_controller/metal/allow_browser.rb +123 -0
- data/lib/action_controller/metal/basic_implicit_render.rb +17 -0
- data/lib/action_controller/metal/conditional_get.rb +341 -0
- data/lib/action_controller/metal/content_security_policy.rb +86 -0
- data/lib/action_controller/metal/cookies.rb +20 -0
- data/lib/action_controller/metal/data_streaming.rb +154 -0
- data/lib/action_controller/metal/default_headers.rb +21 -0
- data/lib/action_controller/metal/etag_with_flash.rb +22 -0
- data/lib/action_controller/metal/etag_with_template_digest.rb +59 -0
- data/lib/action_controller/metal/exceptions.rb +106 -0
- data/lib/action_controller/metal/flash.rb +67 -0
- data/lib/action_controller/metal/head.rb +67 -0
- data/lib/action_controller/metal/helpers.rb +129 -0
- data/lib/action_controller/metal/http_authentication.rb +565 -0
- data/lib/action_controller/metal/implicit_render.rb +67 -0
- data/lib/action_controller/metal/instrumentation.rb +120 -0
- data/lib/action_controller/metal/live.rb +398 -0
- data/lib/action_controller/metal/logging.rb +22 -0
- data/lib/action_controller/metal/mime_responds.rb +337 -0
- data/lib/action_controller/metal/parameter_encoding.rb +84 -0
- data/lib/action_controller/metal/params_wrapper.rb +312 -0
- data/lib/action_controller/metal/permissions_policy.rb +38 -0
- data/lib/action_controller/metal/rate_limiting.rb +62 -0
- data/lib/action_controller/metal/redirecting.rb +251 -0
- data/lib/action_controller/metal/renderers.rb +181 -0
- data/lib/action_controller/metal/rendering.rb +260 -0
- data/lib/action_controller/metal/request_forgery_protection.rb +667 -0
- data/lib/action_controller/metal/rescue.rb +33 -0
- data/lib/action_controller/metal/streaming.rb +183 -0
- data/lib/action_controller/metal/strong_parameters.rb +1546 -0
- data/lib/action_controller/metal/testing.rb +25 -0
- data/lib/action_controller/metal/url_for.rb +65 -0
- data/lib/action_controller/metal.rb +339 -0
- data/lib/action_controller/railtie.rb +149 -0
- data/lib/action_controller/railties/helpers.rb +26 -0
- data/lib/action_controller/renderer.rb +161 -0
- data/lib/action_controller/template_assertions.rb +13 -0
- data/lib/action_controller/test_case.rb +691 -0
- data/lib/action_controller.rb +80 -0
- data/lib/action_dispatch/constants.rb +34 -0
- data/lib/action_dispatch/deprecator.rb +9 -0
- data/lib/action_dispatch/http/cache.rb +249 -0
- data/lib/action_dispatch/http/content_disposition.rb +47 -0
- data/lib/action_dispatch/http/content_security_policy.rb +365 -0
- data/lib/action_dispatch/http/filter_parameters.rb +80 -0
- data/lib/action_dispatch/http/filter_redirect.rb +50 -0
- data/lib/action_dispatch/http/headers.rb +134 -0
- data/lib/action_dispatch/http/mime_negotiation.rb +187 -0
- data/lib/action_dispatch/http/mime_type.rb +389 -0
- data/lib/action_dispatch/http/mime_types.rb +54 -0
- data/lib/action_dispatch/http/parameters.rb +119 -0
- data/lib/action_dispatch/http/permissions_policy.rb +189 -0
- data/lib/action_dispatch/http/rack_cache.rb +67 -0
- data/lib/action_dispatch/http/request.rb +498 -0
- data/lib/action_dispatch/http/response.rb +556 -0
- data/lib/action_dispatch/http/upload.rb +107 -0
- data/lib/action_dispatch/http/url.rb +344 -0
- data/lib/action_dispatch/journey/formatter.rb +226 -0
- data/lib/action_dispatch/journey/gtg/builder.rb +149 -0
- data/lib/action_dispatch/journey/gtg/simulator.rb +50 -0
- data/lib/action_dispatch/journey/gtg/transition_table.rb +217 -0
- data/lib/action_dispatch/journey/nfa/dot.rb +27 -0
- data/lib/action_dispatch/journey/nodes/node.rb +208 -0
- data/lib/action_dispatch/journey/parser.rb +103 -0
- data/lib/action_dispatch/journey/path/pattern.rb +209 -0
- data/lib/action_dispatch/journey/route.rb +189 -0
- data/lib/action_dispatch/journey/router/utils.rb +105 -0
- data/lib/action_dispatch/journey/router.rb +151 -0
- data/lib/action_dispatch/journey/routes.rb +82 -0
- data/lib/action_dispatch/journey/scanner.rb +70 -0
- data/lib/action_dispatch/journey/visitors.rb +267 -0
- data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
- data/lib/action_dispatch/journey/visualizer/fsm.js +159 -0
- data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
- data/lib/action_dispatch/journey.rb +7 -0
- data/lib/action_dispatch/log_subscriber.rb +25 -0
- data/lib/action_dispatch/middleware/actionable_exceptions.rb +46 -0
- data/lib/action_dispatch/middleware/assume_ssl.rb +27 -0
- data/lib/action_dispatch/middleware/callbacks.rb +38 -0
- data/lib/action_dispatch/middleware/cookies.rb +719 -0
- data/lib/action_dispatch/middleware/debug_exceptions.rb +206 -0
- data/lib/action_dispatch/middleware/debug_locks.rb +129 -0
- data/lib/action_dispatch/middleware/debug_view.rb +73 -0
- data/lib/action_dispatch/middleware/exception_wrapper.rb +350 -0
- data/lib/action_dispatch/middleware/executor.rb +32 -0
- data/lib/action_dispatch/middleware/flash.rb +318 -0
- data/lib/action_dispatch/middleware/host_authorization.rb +171 -0
- data/lib/action_dispatch/middleware/public_exceptions.rb +64 -0
- data/lib/action_dispatch/middleware/reloader.rb +16 -0
- data/lib/action_dispatch/middleware/remote_ip.rb +199 -0
- data/lib/action_dispatch/middleware/request_id.rb +50 -0
- data/lib/action_dispatch/middleware/server_timing.rb +78 -0
- data/lib/action_dispatch/middleware/session/abstract_store.rb +112 -0
- data/lib/action_dispatch/middleware/session/cache_store.rb +66 -0
- data/lib/action_dispatch/middleware/session/cookie_store.rb +129 -0
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +34 -0
- data/lib/action_dispatch/middleware/show_exceptions.rb +88 -0
- data/lib/action_dispatch/middleware/ssl.rb +180 -0
- data/lib/action_dispatch/middleware/stack.rb +194 -0
- data/lib/action_dispatch/middleware/static.rb +192 -0
- data/lib/action_dispatch/middleware/templates/rescues/_actions.html.erb +13 -0
- data/lib/action_dispatch/middleware/templates/rescues/_actions.text.erb +0 -0
- data/lib/action_dispatch/middleware/templates/rescues/_message_and_suggestions.html.erb +22 -0
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +17 -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 +36 -0
- data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +62 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/blocked_host.html.erb +12 -0
- data/lib/action_dispatch/middleware/templates/rescues/blocked_host.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +35 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.html.erb +24 -0
- data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.text.erb +16 -0
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +284 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.html.erb +23 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.text.erb +3 -0
- 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 +19 -0
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +232 -0
- data/lib/action_dispatch/railtie.rb +77 -0
- data/lib/action_dispatch/request/session.rb +283 -0
- data/lib/action_dispatch/request/utils.rb +109 -0
- data/lib/action_dispatch/routing/endpoint.rb +19 -0
- data/lib/action_dispatch/routing/inspector.rb +323 -0
- data/lib/action_dispatch/routing/mapper.rb +2372 -0
- data/lib/action_dispatch/routing/polymorphic_routes.rb +363 -0
- data/lib/action_dispatch/routing/redirection.rb +218 -0
- data/lib/action_dispatch/routing/route_set.rb +958 -0
- data/lib/action_dispatch/routing/routes_proxy.rb +66 -0
- data/lib/action_dispatch/routing/url_for.rb +244 -0
- data/lib/action_dispatch/routing.rb +262 -0
- data/lib/action_dispatch/system_test_case.rb +206 -0
- data/lib/action_dispatch/system_testing/browser.rb +75 -0
- data/lib/action_dispatch/system_testing/driver.rb +85 -0
- data/lib/action_dispatch/system_testing/server.rb +33 -0
- data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +164 -0
- data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +23 -0
- data/lib/action_dispatch/testing/assertion_response.rb +48 -0
- data/lib/action_dispatch/testing/assertions/response.rb +114 -0
- data/lib/action_dispatch/testing/assertions/routing.rb +343 -0
- data/lib/action_dispatch/testing/assertions.rb +25 -0
- data/lib/action_dispatch/testing/integration.rb +694 -0
- data/lib/action_dispatch/testing/request_encoder.rb +60 -0
- data/lib/action_dispatch/testing/test_helpers/page_dump_helper.rb +35 -0
- data/lib/action_dispatch/testing/test_process.rb +57 -0
- data/lib/action_dispatch/testing/test_request.rb +73 -0
- data/lib/action_dispatch/testing/test_response.rb +58 -0
- data/lib/action_dispatch.rb +147 -0
- data/lib/action_pack/gem_version.rb +19 -0
- data/lib/action_pack/version.rb +12 -0
- data/lib/action_pack.rb +27 -0
- metadata +375 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# :markup: markdown
|
|
4
|
+
|
|
5
|
+
module ActionController
|
|
6
|
+
module Testing
|
|
7
|
+
# Behavior specific to functional tests
|
|
8
|
+
module Functional # :nodoc:
|
|
9
|
+
def clear_instance_variables_between_requests
|
|
10
|
+
if defined?(@_ivars)
|
|
11
|
+
new_ivars = instance_variables - @_ivars
|
|
12
|
+
new_ivars.each { |ivar| remove_instance_variable(ivar) }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
@_ivars = instance_variables
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def recycle!
|
|
19
|
+
@_url_options = nil
|
|
20
|
+
self.formats = nil
|
|
21
|
+
self.params = nil
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# :markup: markdown
|
|
4
|
+
|
|
5
|
+
module ActionController
|
|
6
|
+
# # Action Controller UrlFor
|
|
7
|
+
#
|
|
8
|
+
# Includes `url_for` into the host class. The class has to provide a `RouteSet`
|
|
9
|
+
# by implementing the `_routes` method. Otherwise, an exception will be raised.
|
|
10
|
+
#
|
|
11
|
+
# In addition to AbstractController::UrlFor, this module accesses the HTTP layer
|
|
12
|
+
# to define URL options like the `host`. In order to do so, this module requires
|
|
13
|
+
# the host class to implement `env` which needs to be Rack-compatible, and
|
|
14
|
+
# `request` which returns an ActionDispatch::Request instance.
|
|
15
|
+
#
|
|
16
|
+
# class RootUrl
|
|
17
|
+
# include ActionController::UrlFor
|
|
18
|
+
# include Rails.application.routes.url_helpers
|
|
19
|
+
#
|
|
20
|
+
# delegate :env, :request, to: :controller
|
|
21
|
+
#
|
|
22
|
+
# def initialize(controller)
|
|
23
|
+
# @controller = controller
|
|
24
|
+
# @url = root_path # named route from the application.
|
|
25
|
+
# end
|
|
26
|
+
# end
|
|
27
|
+
module UrlFor
|
|
28
|
+
extend ActiveSupport::Concern
|
|
29
|
+
|
|
30
|
+
include AbstractController::UrlFor
|
|
31
|
+
|
|
32
|
+
def initialize(...)
|
|
33
|
+
super
|
|
34
|
+
@_url_options = nil
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def url_options
|
|
38
|
+
@_url_options ||= {
|
|
39
|
+
host: request.host,
|
|
40
|
+
port: request.optional_port,
|
|
41
|
+
protocol: request.protocol,
|
|
42
|
+
_recall: request.path_parameters
|
|
43
|
+
}.merge!(super).freeze
|
|
44
|
+
|
|
45
|
+
if (same_origin = _routes.equal?(request.routes)) ||
|
|
46
|
+
(script_name = request.engine_script_name(_routes)) ||
|
|
47
|
+
(original_script_name = request.original_script_name)
|
|
48
|
+
|
|
49
|
+
options = @_url_options.dup
|
|
50
|
+
if original_script_name
|
|
51
|
+
options[:original_script_name] = original_script_name
|
|
52
|
+
else
|
|
53
|
+
if same_origin
|
|
54
|
+
options[:script_name] = request.script_name.empty? ? "" : request.script_name.dup
|
|
55
|
+
else
|
|
56
|
+
options[:script_name] = script_name
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
options.freeze
|
|
60
|
+
else
|
|
61
|
+
@_url_options
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# :markup: markdown
|
|
4
|
+
|
|
5
|
+
require "active_support/core_ext/array/extract_options"
|
|
6
|
+
require "action_dispatch/middleware/stack"
|
|
7
|
+
|
|
8
|
+
module ActionController
|
|
9
|
+
# # Action Controller MiddlewareStack
|
|
10
|
+
#
|
|
11
|
+
# Extend ActionDispatch middleware stack to make it aware of options allowing
|
|
12
|
+
# the following syntax in controllers:
|
|
13
|
+
#
|
|
14
|
+
# class PostsController < ApplicationController
|
|
15
|
+
# use AuthenticationMiddleware, except: [:index, :show]
|
|
16
|
+
# end
|
|
17
|
+
#
|
|
18
|
+
class MiddlewareStack < ActionDispatch::MiddlewareStack # :nodoc:
|
|
19
|
+
class Middleware < ActionDispatch::MiddlewareStack::Middleware # :nodoc:
|
|
20
|
+
def initialize(klass, args, actions, strategy, block)
|
|
21
|
+
@actions = actions
|
|
22
|
+
@strategy = strategy
|
|
23
|
+
super(klass, args, block)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def valid?(action)
|
|
27
|
+
@strategy.call @actions, action
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def build(action, app = nil, &block)
|
|
32
|
+
action = action.to_s
|
|
33
|
+
|
|
34
|
+
middlewares.reverse.inject(app || block) do |a, middleware|
|
|
35
|
+
middleware.valid?(action) ? middleware.build(a) : a
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
INCLUDE = ->(list, action) { list.include? action }
|
|
41
|
+
EXCLUDE = ->(list, action) { !list.include? action }
|
|
42
|
+
NULL = ->(list, action) { true }
|
|
43
|
+
|
|
44
|
+
def build_middleware(klass, args, block)
|
|
45
|
+
options = args.extract_options!
|
|
46
|
+
only = Array(options.delete(:only)).map(&:to_s)
|
|
47
|
+
except = Array(options.delete(:except)).map(&:to_s)
|
|
48
|
+
args << options unless options.empty?
|
|
49
|
+
|
|
50
|
+
strategy = NULL
|
|
51
|
+
list = nil
|
|
52
|
+
|
|
53
|
+
if only.any?
|
|
54
|
+
strategy = INCLUDE
|
|
55
|
+
list = only
|
|
56
|
+
elsif except.any?
|
|
57
|
+
strategy = EXCLUDE
|
|
58
|
+
list = except
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
Middleware.new(klass, args, list, strategy, block)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# # Action Controller Metal
|
|
66
|
+
#
|
|
67
|
+
# `ActionController::Metal` is the simplest possible controller, providing a
|
|
68
|
+
# valid Rack interface without the additional niceties provided by
|
|
69
|
+
# ActionController::Base.
|
|
70
|
+
#
|
|
71
|
+
# A sample metal controller might look like this:
|
|
72
|
+
#
|
|
73
|
+
# class HelloController < ActionController::Metal
|
|
74
|
+
# def index
|
|
75
|
+
# self.response_body = "Hello World!"
|
|
76
|
+
# end
|
|
77
|
+
# end
|
|
78
|
+
#
|
|
79
|
+
# And then to route requests to your metal controller, you would add something
|
|
80
|
+
# like this to `config/routes.rb`:
|
|
81
|
+
#
|
|
82
|
+
# get 'hello', to: HelloController.action(:index)
|
|
83
|
+
#
|
|
84
|
+
# The ::action method returns a valid Rack application for the Rails router to
|
|
85
|
+
# dispatch to.
|
|
86
|
+
#
|
|
87
|
+
# ## Rendering Helpers
|
|
88
|
+
#
|
|
89
|
+
# By default, `ActionController::Metal` provides no utilities for rendering
|
|
90
|
+
# views, partials, or other responses aside from some low-level setters such
|
|
91
|
+
# as #response_body=, #content_type=, and #status=. To add the render helpers
|
|
92
|
+
# you're used to having in a normal controller, you can do the following:
|
|
93
|
+
#
|
|
94
|
+
# class HelloController < ActionController::Metal
|
|
95
|
+
# include AbstractController::Rendering
|
|
96
|
+
# include ActionView::Layouts
|
|
97
|
+
# append_view_path "#{Rails.root}/app/views"
|
|
98
|
+
#
|
|
99
|
+
# def index
|
|
100
|
+
# render "hello/index"
|
|
101
|
+
# end
|
|
102
|
+
# end
|
|
103
|
+
#
|
|
104
|
+
# ## Redirection Helpers
|
|
105
|
+
#
|
|
106
|
+
# To add redirection helpers to your metal controller, do the following:
|
|
107
|
+
#
|
|
108
|
+
# class HelloController < ActionController::Metal
|
|
109
|
+
# include ActionController::Redirecting
|
|
110
|
+
# include Rails.application.routes.url_helpers
|
|
111
|
+
#
|
|
112
|
+
# def index
|
|
113
|
+
# redirect_to root_url
|
|
114
|
+
# end
|
|
115
|
+
# end
|
|
116
|
+
#
|
|
117
|
+
# ## Other Helpers
|
|
118
|
+
#
|
|
119
|
+
# You can refer to the modules included in ActionController::Base to see other
|
|
120
|
+
# features you can bring into your metal controller.
|
|
121
|
+
class Metal < AbstractController::Base
|
|
122
|
+
abstract!
|
|
123
|
+
|
|
124
|
+
# Returns the last part of the controller's name, underscored, without the
|
|
125
|
+
# ending `Controller`. For instance, `PostsController` returns `posts`.
|
|
126
|
+
# Namespaces are left out, so `Admin::PostsController` returns `posts` as well.
|
|
127
|
+
#
|
|
128
|
+
# #### Returns
|
|
129
|
+
# * `string`
|
|
130
|
+
def self.controller_name
|
|
131
|
+
@controller_name ||= (name.demodulize.delete_suffix("Controller").underscore unless anonymous?)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def self.make_response!(request)
|
|
135
|
+
ActionDispatch::Response.new.tap do |res|
|
|
136
|
+
res.request = request
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def self.action_encoding_template(action) # :nodoc:
|
|
141
|
+
false
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
class << self
|
|
145
|
+
private
|
|
146
|
+
def inherited(subclass)
|
|
147
|
+
super
|
|
148
|
+
subclass.middleware_stack = middleware_stack.dup
|
|
149
|
+
subclass.class_eval do
|
|
150
|
+
@controller_name = nil
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Delegates to the class's ::controller_name.
|
|
156
|
+
def controller_name
|
|
157
|
+
self.class.controller_name
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
##
|
|
161
|
+
# :attr_reader: request
|
|
162
|
+
#
|
|
163
|
+
# The ActionDispatch::Request instance for the current request.
|
|
164
|
+
attr_internal :request
|
|
165
|
+
|
|
166
|
+
##
|
|
167
|
+
# :attr_reader: response
|
|
168
|
+
#
|
|
169
|
+
# The ActionDispatch::Response instance for the current response.
|
|
170
|
+
attr_internal_reader :response
|
|
171
|
+
|
|
172
|
+
##
|
|
173
|
+
# The ActionDispatch::Request::Session instance for the current request.
|
|
174
|
+
# See further details in the
|
|
175
|
+
# [Active Controller Session guide](https://guides.rubyonrails.org/action_controller_overview.html#session).
|
|
176
|
+
delegate :session, to: "@_request"
|
|
177
|
+
|
|
178
|
+
##
|
|
179
|
+
# Delegates to ActionDispatch::Response#headers.
|
|
180
|
+
delegate :headers, to: "@_response"
|
|
181
|
+
|
|
182
|
+
##
|
|
183
|
+
# Delegates to ActionDispatch::Response#status=
|
|
184
|
+
delegate :status=, to: "@_response"
|
|
185
|
+
|
|
186
|
+
##
|
|
187
|
+
# Delegates to ActionDispatch::Response#location=
|
|
188
|
+
delegate :location=, to: "@_response"
|
|
189
|
+
|
|
190
|
+
##
|
|
191
|
+
# Delegates to ActionDispatch::Response#content_type=
|
|
192
|
+
delegate :content_type=, to: "@_response"
|
|
193
|
+
|
|
194
|
+
##
|
|
195
|
+
# Delegates to ActionDispatch::Response#status
|
|
196
|
+
delegate :status, to: "@_response"
|
|
197
|
+
|
|
198
|
+
##
|
|
199
|
+
# Delegates to ActionDispatch::Response#location
|
|
200
|
+
delegate :location, to: "@_response"
|
|
201
|
+
|
|
202
|
+
##
|
|
203
|
+
# Delegates to ActionDispatch::Response#content_type
|
|
204
|
+
delegate :content_type, to: "@_response"
|
|
205
|
+
|
|
206
|
+
##
|
|
207
|
+
# Delegates to ActionDispatch::Response#media_type
|
|
208
|
+
delegate :media_type, to: "@_response"
|
|
209
|
+
|
|
210
|
+
def initialize
|
|
211
|
+
@_request = nil
|
|
212
|
+
@_response = nil
|
|
213
|
+
@_response_body = nil
|
|
214
|
+
@_routes = nil
|
|
215
|
+
@_params = nil
|
|
216
|
+
super
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def params
|
|
220
|
+
@_params ||= request.parameters
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def params=(val)
|
|
224
|
+
@_params = val
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
alias :response_code :status # :nodoc:
|
|
228
|
+
|
|
229
|
+
# Basic `url_for` that can be overridden for more robust functionality.
|
|
230
|
+
def url_for(string)
|
|
231
|
+
string
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def response_body=(body)
|
|
235
|
+
if body
|
|
236
|
+
body = [body] if body.is_a?(String)
|
|
237
|
+
response.body = body
|
|
238
|
+
super
|
|
239
|
+
else
|
|
240
|
+
response.reset_body!
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
# Tests if render or redirect has already happened.
|
|
245
|
+
def performed?
|
|
246
|
+
response_body || response.committed?
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def dispatch(name, request, response) # :nodoc:
|
|
250
|
+
set_request!(request)
|
|
251
|
+
set_response!(response)
|
|
252
|
+
process(name)
|
|
253
|
+
request.commit_flash
|
|
254
|
+
to_a
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
def set_response!(response) # :nodoc:
|
|
258
|
+
if @_response
|
|
259
|
+
_, _, body = @_response
|
|
260
|
+
body.close if body.respond_to?(:close)
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
@_response = response
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
# Assign the response and mark it as committed. No further processing will
|
|
267
|
+
# occur.
|
|
268
|
+
def response=(response)
|
|
269
|
+
set_response!(response)
|
|
270
|
+
|
|
271
|
+
# Force `performed?` to return true:
|
|
272
|
+
@_response_body = true
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def set_request!(request) # :nodoc:
|
|
276
|
+
@_request = request
|
|
277
|
+
@_request.controller_instance = self
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
def to_a # :nodoc:
|
|
281
|
+
response.to_a
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
def reset_session
|
|
285
|
+
@_request.reset_session
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
class_attribute :middleware_stack, default: ActionController::MiddlewareStack.new
|
|
289
|
+
|
|
290
|
+
class << self
|
|
291
|
+
# Pushes the given Rack middleware and its arguments to the bottom of the
|
|
292
|
+
# middleware stack.
|
|
293
|
+
def use(...)
|
|
294
|
+
middleware_stack.use(...)
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
# The middleware stack used by this controller.
|
|
299
|
+
#
|
|
300
|
+
# By default uses a variation of ActionDispatch::MiddlewareStack which allows
|
|
301
|
+
# for the following syntax:
|
|
302
|
+
#
|
|
303
|
+
# class PostsController < ApplicationController
|
|
304
|
+
# use AuthenticationMiddleware, except: [:index, :show]
|
|
305
|
+
# end
|
|
306
|
+
#
|
|
307
|
+
# Read more about [Rails middleware stack]
|
|
308
|
+
# (https://guides.rubyonrails.org/rails_on_rack.html#action-dispatcher-middleware-stack)
|
|
309
|
+
# in the guides.
|
|
310
|
+
def self.middleware
|
|
311
|
+
middleware_stack
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
# Returns a Rack endpoint for the given action name.
|
|
315
|
+
def self.action(name)
|
|
316
|
+
app = lambda { |env|
|
|
317
|
+
req = ActionDispatch::Request.new(env)
|
|
318
|
+
res = make_response! req
|
|
319
|
+
new.dispatch(name, req, res)
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
if middleware_stack.any?
|
|
323
|
+
middleware_stack.build(name, app)
|
|
324
|
+
else
|
|
325
|
+
app
|
|
326
|
+
end
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
# Direct dispatch to the controller. Instantiates the controller, then executes
|
|
330
|
+
# the action named `name`.
|
|
331
|
+
def self.dispatch(name, req, res)
|
|
332
|
+
if middleware_stack.any?
|
|
333
|
+
middleware_stack.build(name) { |env| new.dispatch(name, req, res) }.call req.env
|
|
334
|
+
else
|
|
335
|
+
new.dispatch(name, req, res)
|
|
336
|
+
end
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
end
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# :markup: markdown
|
|
4
|
+
|
|
5
|
+
require "rails"
|
|
6
|
+
require "action_controller"
|
|
7
|
+
require "action_dispatch/railtie"
|
|
8
|
+
require "abstract_controller/railties/routes_helpers"
|
|
9
|
+
require "action_controller/railties/helpers"
|
|
10
|
+
require "action_view/railtie"
|
|
11
|
+
|
|
12
|
+
module ActionController
|
|
13
|
+
class Railtie < Rails::Railtie # :nodoc:
|
|
14
|
+
config.action_controller = ActiveSupport::OrderedOptions.new
|
|
15
|
+
config.action_controller.raise_on_open_redirects = false
|
|
16
|
+
config.action_controller.log_query_tags_around_actions = true
|
|
17
|
+
config.action_controller.wrap_parameters_by_default = false
|
|
18
|
+
|
|
19
|
+
config.eager_load_namespaces << AbstractController
|
|
20
|
+
config.eager_load_namespaces << ActionController
|
|
21
|
+
|
|
22
|
+
initializer "action_controller.deprecator", before: :load_environment_config do |app|
|
|
23
|
+
app.deprecators[:action_controller] = ActionController.deprecator
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
initializer "action_controller.assets_config", group: :all do |app|
|
|
27
|
+
app.config.action_controller.assets_dir ||= app.config.paths["public"].first
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
initializer "action_controller.set_helpers_path" do |app|
|
|
31
|
+
ActionController::Helpers.helpers_path = app.helpers_paths
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
initializer "action_controller.parameters_config" do |app|
|
|
35
|
+
options = app.config.action_controller
|
|
36
|
+
|
|
37
|
+
ActiveSupport.on_load(:action_controller, run_once: true) do
|
|
38
|
+
ActionController::Parameters.permit_all_parameters = options.permit_all_parameters || false
|
|
39
|
+
if app.config.action_controller[:always_permitted_parameters]
|
|
40
|
+
ActionController::Parameters.always_permitted_parameters =
|
|
41
|
+
app.config.action_controller.always_permitted_parameters
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
action_on_unpermitted_parameters = options.action_on_unpermitted_parameters
|
|
45
|
+
|
|
46
|
+
if action_on_unpermitted_parameters.nil?
|
|
47
|
+
action_on_unpermitted_parameters = Rails.env.local? ? :log : false
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
ActionController::Parameters.action_on_unpermitted_parameters = action_on_unpermitted_parameters
|
|
51
|
+
|
|
52
|
+
unless options.allow_deprecated_parameters_hash_equality.nil?
|
|
53
|
+
ActionController::Parameters.allow_deprecated_parameters_hash_equality =
|
|
54
|
+
options.allow_deprecated_parameters_hash_equality
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
initializer "action_controller.set_configs" do |app|
|
|
60
|
+
paths = app.config.paths
|
|
61
|
+
options = app.config.action_controller
|
|
62
|
+
|
|
63
|
+
options.logger ||= Rails.logger
|
|
64
|
+
options.cache_store ||= Rails.cache
|
|
65
|
+
|
|
66
|
+
options.javascripts_dir ||= paths["public/javascripts"].first
|
|
67
|
+
options.stylesheets_dir ||= paths["public/stylesheets"].first
|
|
68
|
+
|
|
69
|
+
# Ensure readers methods get compiled.
|
|
70
|
+
options.asset_host ||= app.config.asset_host
|
|
71
|
+
options.relative_url_root ||= app.config.relative_url_root
|
|
72
|
+
|
|
73
|
+
ActiveSupport.on_load(:action_controller) do
|
|
74
|
+
include app.routes.mounted_helpers
|
|
75
|
+
extend ::AbstractController::Railties::RoutesHelpers.with(app.routes)
|
|
76
|
+
extend ::ActionController::Railties::Helpers
|
|
77
|
+
|
|
78
|
+
wrap_parameters format: [:json] if options.wrap_parameters_by_default && respond_to?(:wrap_parameters)
|
|
79
|
+
|
|
80
|
+
# Configs used in other initializers
|
|
81
|
+
filtered_options = options.except(
|
|
82
|
+
:default_protect_from_forgery,
|
|
83
|
+
:log_query_tags_around_actions,
|
|
84
|
+
:permit_all_parameters,
|
|
85
|
+
:action_on_unpermitted_parameters,
|
|
86
|
+
:always_permitted_parameters,
|
|
87
|
+
:wrap_parameters_by_default,
|
|
88
|
+
:allow_deprecated_parameters_hash_equality
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
filtered_options.each do |k, v|
|
|
92
|
+
k = "#{k}="
|
|
93
|
+
if respond_to?(k)
|
|
94
|
+
send(k, v)
|
|
95
|
+
elsif !Base.respond_to?(k)
|
|
96
|
+
raise "Invalid option key: #{k}"
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
initializer "action_controller.compile_config_methods" do
|
|
103
|
+
ActiveSupport.on_load(:action_controller) do
|
|
104
|
+
config.compile_methods! if config.respond_to?(:compile_methods!)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
initializer "action_controller.request_forgery_protection" do |app|
|
|
109
|
+
ActiveSupport.on_load(:action_controller_base) do
|
|
110
|
+
if app.config.action_controller.default_protect_from_forgery
|
|
111
|
+
protect_from_forgery with: :exception
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
initializer "action_controller.query_log_tags" do |app|
|
|
117
|
+
query_logs_tags_enabled = app.config.respond_to?(:active_record) &&
|
|
118
|
+
app.config.active_record.query_log_tags_enabled &&
|
|
119
|
+
app.config.action_controller.log_query_tags_around_actions
|
|
120
|
+
|
|
121
|
+
if query_logs_tags_enabled
|
|
122
|
+
app.config.active_record.query_log_tags |= [:controller] unless app.config.active_record.query_log_tags.include?(:namespaced_controller)
|
|
123
|
+
app.config.active_record.query_log_tags |= [:action]
|
|
124
|
+
|
|
125
|
+
ActiveSupport.on_load(:active_record) do
|
|
126
|
+
ActiveRecord::QueryLogs.taggings = ActiveRecord::QueryLogs.taggings.merge(
|
|
127
|
+
controller: ->(context) { context[:controller]&.controller_name },
|
|
128
|
+
action: ->(context) { context[:controller]&.action_name },
|
|
129
|
+
namespaced_controller: ->(context) {
|
|
130
|
+
if context[:controller]
|
|
131
|
+
controller_class = context[:controller].class
|
|
132
|
+
# based on ActionController::Metal#controller_name, but does not demodulize
|
|
133
|
+
unless controller_class.anonymous?
|
|
134
|
+
controller_class.name.delete_suffix("Controller").underscore
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
}
|
|
138
|
+
)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
initializer "action_controller.test_case" do |app|
|
|
144
|
+
ActiveSupport.on_load(:action_controller_test_case) do
|
|
145
|
+
ActionController::TestCase.executor_around_each_request = app.config.active_support.executor_around_test_case
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# :markup: markdown
|
|
4
|
+
|
|
5
|
+
module ActionController
|
|
6
|
+
module Railties
|
|
7
|
+
module Helpers
|
|
8
|
+
def inherited(klass)
|
|
9
|
+
super
|
|
10
|
+
return unless klass.respond_to?(:helpers_path=)
|
|
11
|
+
|
|
12
|
+
if namespace = klass.module_parents.detect { |m| m.respond_to?(:railtie_helpers_paths) }
|
|
13
|
+
paths = namespace.railtie_helpers_paths
|
|
14
|
+
else
|
|
15
|
+
paths = ActionController::Helpers.helpers_path
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
klass.helpers_path = paths
|
|
19
|
+
|
|
20
|
+
if klass.superclass == ActionController::Base && ActionController::Base.include_all_helpers
|
|
21
|
+
klass.helper :all
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|