class ActionDispatch::Request
def self.empty
def self.empty new({}) end
def GET
def GET fetch_header("action_dispatch.request.query_parameters") do |k| rack_query_params = super || {} # Check for non UTF-8 parameter values, which would cause errors later Request::Utils.check_param_encoding(rack_query_params) set_header k, Request::Utils.normalize_encode_params(rack_query_params) end rescue Rack::Utils::ParameterTypeError, Rack::Utils::InvalidParameterError => e raise ActionController::BadRequest.new("Invalid query parameters: #{e.message}") end
def POST
def POST fetch_header("action_dispatch.request.request_parameters") do pr = parse_formatted_parameters(params_parsers) do |params| super || {} end self.request_parameters = Request::Utils.normalize_encode_params(pr) end rescue Rack::Utils::ParameterTypeError, Rack::Utils::InvalidParameterError => e raise ActionController::BadRequest.new("Invalid request parameters: #{e.message}") end
def authenticated_encrypted_cookie_salt
def authenticated_encrypted_cookie_salt get_header Cookies::AUTHENTICATED_ENCRYPTED_COOKIE_SALT end
def authorization
Returns the authorization header regardless of whether it was specified directly or through one of the
def authorization get_header("HTTP_AUTHORIZATION") || get_header("X-HTTP_AUTHORIZATION") || get_header("X_HTTP_AUTHORIZATION") || get_header("REDIRECT_X_HTTP_AUTHORIZATION") end
def body
The request body is an IO input stream. If the RAW_POST_DATA environment
def body if raw_post = get_header("RAW_POST_DATA") raw_post = raw_post.dup.force_encoding(Encoding::BINARY) StringIO.new(raw_post) else body_stream end end
def body_stream #:nodoc:
def body_stream #:nodoc: get_header("rack.input") end
def check_method(name)
def check_method(name) HTTP_METHOD_LOOKUP[name] || raise(ActionController::UnknownHttpMethod, "#{name}, accepted HTTP methods are #{HTTP_METHODS[0...-1].join(', ')}, and #{HTTP_METHODS[-1]}") name end
def commit_cookie_jar! # :nodoc:
def commit_cookie_jar! # :nodoc: end
def commit_cookie_jar!
def commit_cookie_jar! cookie_jar.commit! end
def commit_flash
def commit_flash end
def content_length
def content_length super.to_i end
def controller_class
def controller_class params = path_parameters params[:action] ||= "index" controller_class_for(params[:controller]) end
def controller_class_for(name)
def controller_class_for(name) if name controller_param = name.underscore const_name = "#{controller_param.camelize}Controller" begin ActiveSupport::Dependencies.constantize(const_name) rescue NameError => error if error.missing_name == const_name || const_name.start_with?("#{error.missing_name}::") raise MissingController.new(error.message, error.name) else raise end end else PASS_NOT_FOUND end end
def controller_instance # :nodoc:
def controller_instance # :nodoc: get_header("action_controller.instance") end
def controller_instance=(controller) # :nodoc:
def controller_instance=(controller) # :nodoc: set_header("action_controller.instance", controller) end
def cookie_jar
def cookie_jar fetch_header("action_dispatch.cookies") do self.cookie_jar = Cookies::CookieJar.build(self, cookies) end end
def cookie_jar=(jar)
def cookie_jar=(jar) set_header "action_dispatch.cookies", jar end
def cookies_digest
def cookies_digest get_header Cookies::COOKIES_DIGEST end
def cookies_rotations
def cookies_rotations get_header Cookies::COOKIES_ROTATIONS end
def cookies_serializer
def cookies_serializer get_header Cookies::COOKIES_SERIALIZER end
def encrypted_cookie_cipher
def encrypted_cookie_cipher get_header Cookies::ENCRYPTED_COOKIE_CIPHER end
def encrypted_cookie_salt
def encrypted_cookie_salt get_header Cookies::ENCRYPTED_COOKIE_SALT end
def encrypted_signed_cookie_salt
def encrypted_signed_cookie_salt get_header Cookies::ENCRYPTED_SIGNED_COOKIE_SALT end
def engine_script_name(_routes) # :nodoc:
def engine_script_name(_routes) # :nodoc: get_header(_routes.env_key) end
def engine_script_name=(name) # :nodoc:
def engine_script_name=(name) # :nodoc: set_header(routes.env_key, name.dup) end
def form_data?
A request body is not assumed to contain form-data when no
+FORM_DATA_MEDIA_TYPES+ array.
list of form-data media types can be modified through the
"application/x-www-form-urlencoded" or "multipart/form-data". The
the request Content-Type for one of the media-types:
Determine whether the request body contains form-data by checking
def form_data? FORM_DATA_MEDIA_TYPES.include?(media_type) end
def fullpath
# get "/articles?page=2"
request.fullpath # => "/articles"
# get "/articles"
Returns the +String+ full path including params of the last URL requested.
def fullpath @fullpath ||= super end
def have_cookie_jar?
def have_cookie_jar? has_header? "action_dispatch.cookies" end
def headers
Provides access to the request's HTTP headers, for example:
def headers @headers ||= Http::Headers.new(self) end
def http_auth_salt
def http_auth_salt get_header "action_dispatch.http_auth_salt" end
def initialize(env)
def initialize(env) super @method = nil @request_method = nil @remote_ip = nil @original_fullpath = nil @fullpath = nil @ip = nil end
def ip
def ip @ip ||= super end
def key?(key)
Returns true if the request has a header matching the given key parameter.
def key?(key) has_header? key end
def key_generator
def key_generator get_header Cookies::GENERATOR_KEY end
def local?
def local? LOCALHOST =~ remote_addr && LOCALHOST =~ remote_ip end
def logger
def logger get_header("action_dispatch.logger") end
def media_type
# get "/articles"
The +String+ MIME type of the request.
def media_type content_mime_type.to_s end
def method
even if it was overridden by middleware. See #request_method for
Returns the original value of the environment's REQUEST_METHOD,
def method @method ||= check_method(get_header("rack.methodoverride.original_method") || get_header("REQUEST_METHOD")) end
def method_symbol
def method_symbol HTTP_METHOD_LOOKUP[method] end
def original_fullpath
# get '/foo?bar'
request.original_fullpath # => '/foo'
# get '/foo'
Returns a +String+ with the last requested path including their params.
def original_fullpath @original_fullpath ||= (get_header("ORIGINAL_FULLPATH") || fullpath) end
def original_url
# get "/articles?page=2"
Returns the original request URL as a +String+.
def original_url base_url + original_fullpath end
def raw_post
Read the request \body. This is useful for web services that need to
def raw_post unless has_header? "RAW_POST_DATA" raw_post_body = body set_header("RAW_POST_DATA", raw_post_body.read(content_length)) raw_post_body.rewind if raw_post_body.respond_to?(:rewind) end get_header "RAW_POST_DATA" end
def remote_ip
Returns the IP address of client as a +String+,
def remote_ip @remote_ip ||= (get_header("action_dispatch.remote_ip") || ip).to_s end
def remote_ip=(remote_ip)
def remote_ip=(remote_ip) set_header "action_dispatch.remote_ip", remote_ip end
def request_id
This unique ID is useful for tracing a request from end-to-end as part of logging or debugging.
(which sets the action_dispatch.request_id environment variable).
be generated by a firewall, load balancer, or web server or by the RequestId middleware
Returns the unique request id, which is based on either the X-Request-Id header that can
def request_id get_header ACTION_DISPATCH_REQUEST_ID end
def request_id=(id) # :nodoc:
def request_id=(id) # :nodoc: set_header ACTION_DISPATCH_REQUEST_ID, id end
def request_method
the application should use), this \method returns the overridden
or if a _method parameter was used to determine the \method
(for instance, if a HEAD request was converted to a GET,
In the case where the \method was overridden by a middleware
Returns the HTTP \method that the application should see.
def request_method @request_method ||= check_method(super) end
def request_method=(request_method) #:nodoc:
def request_method=(request_method) #:nodoc: if check_method(request_method) @request_method = set_header("REQUEST_METHOD", request_method) end end
def request_method_symbol
def request_method_symbol HTTP_METHOD_LOOKUP[request_method] end
def request_parameters=(params)
def request_parameters=(params) raise if params.nil? set_header("action_dispatch.request.request_parameters", params) end
def reset_session
TODO This should be broken apart into AD::Request::Session and probably
def reset_session if session && session.respond_to?(:destroy) session.destroy else self.session = {} end end
def routes # :nodoc:
def routes # :nodoc: get_header("action_dispatch.routes") end
def routes=(routes) # :nodoc:
def routes=(routes) # :nodoc: set_header("action_dispatch.routes", routes) end
def secret_key_base
def secret_key_base get_header Cookies::SECRET_KEY_BASE end
def send_early_hints(links)
If you are using +javascript_include_tag+ or +stylesheet_link_tag+ the
send_early_hints("Link" => "; rel=preload; as=style\n; rel=preload")
The +send_early_hints+ method accepts a hash of links as follows:
If the env contains +rack.early_hints+ then the server accepts HTTP2 push for Link headers.
making preparations for processing the final response.
Early Hints is an HTTP/2 status code that indicates hints to help a client start
def send_early_hints(links) return unless env["rack.early_hints"] env["rack.early_hints"].call(links) end
def server_software
def server_software (get_header("SERVER_SOFTWARE") && /^([a-zA-Z]+)/ =~ get_header("SERVER_SOFTWARE")) ? $1.downcase : nil end
def session=(session) #:nodoc:
def session=(session) #:nodoc: Session.set self, session end
def session_options=(options)
def session_options=(options) Session::Options.set self, options end
def show_exceptions? # :nodoc:
def show_exceptions? # :nodoc: # We're treating `nil` as "unset", and we want the default setting to be # `true`. This logic should be extracted to `env_config` and calculated # once. !(get_header("action_dispatch.show_exceptions") == false) end
def signed_cookie_digest
def signed_cookie_digest get_header Cookies::SIGNED_COOKIE_DIGEST end
def signed_cookie_salt
def signed_cookie_salt get_header Cookies::SIGNED_COOKIE_SALT end
def ssl?
def ssl? super || scheme == "wss" end
def use_authenticated_cookie_encryption
def use_authenticated_cookie_encryption get_header Cookies::USE_AUTHENTICATED_COOKIE_ENCRYPTION end
def use_cookies_with_metadata
def use_cookies_with_metadata get_header Cookies::USE_COOKIES_WITH_METADATA end
def xml_http_request?
(case-insensitive), which may need to be manually added depending on the
Returns true if the "X-Requested-With" header contains "XMLHttpRequest"
def xml_http_request? get_header("HTTP_X_REQUESTED_WITH") =~ /XMLHttpRequest/i end