Rack::Request
Which IP addresses are “trusted proxies” that can be stripped from the right-hand-side of X-Forwarded-For
Override Rack’s GET method to support indifferent access
# File lib/action_controller/request.rb, line 425 def GET @env["action_controller.request.query_parameters"] ||= normalize_parameters(super) end
Override Rack’s POST method to support indifferent access
# File lib/action_controller/request.rb, line 431 def POST @env["action_controller.request.request_parameters"] ||= normalize_parameters(super) end
Returns the accepted MIME type for the request.
# File lib/action_controller/request.rb, line 103 def accepts @accepts ||= begin header = @env['HTTP_ACCEPT'].to_s.strip if header.empty? [content_type, Mime::ALL].compact else Mime::Type.parse(header) end end end
The request body is an IO input stream. If the RAW_POST_DATA environment variable is already set, wrap it in a StringIO.
# File lib/action_controller/request.rb, line 411 def body if raw_post = @env['RAW_POST_DATA'] raw_post.force_encoding(Encoding::BINARY) if raw_post.respond_to?(:force_encoding) StringIO.new(raw_post) else @env['rack.input'] end end
# File lib/action_controller/request.rb, line 199 def cache_format parameters[:format] end
Returns the content length of the request as an integer.
# File lib/action_controller/request.rb, line 80 def content_length super.to_i end
The MIME type of the HTTP request, such as Mime::XML.
For backward compatibility, the post format is extracted from the X-Post-Data-Format HTTP header if present.
# File lib/action_controller/request.rb, line 88 def content_type @content_type ||= begin if @env['CONTENT_TYPE'] =~ /^([^,\;]*)/ Mime::Type.lookup($1.strip.downcase) else nil end end end
Is this a DELETE request? Equivalent to request.method == :delete.
# File lib/action_controller/request.rb, line 62 def delete? request_method == :delete end
Returns the domain part of a host, such as “rubyonrails.org” in “www.rubyonrails.org”. You can specify a different tld_length, such as 2 to catch rubyonrails.co.uk in “www.rubyonrails.co.uk”.
# File lib/action_controller/request.rb, line 319 def domain(tld_length = 1) return nil unless named_host?(host) host.split('.').last(1 + tld_length).join('.') end
# File lib/action_controller/request.rb, line 129 def etag_matches?(etag) if_none_match && if_none_match == etag end
# File lib/action_controller/request.rb, line 420 def form_data? FORM_DATA_MEDIA_TYPES.include?(content_type.to_s) end
Returns the Mime type for the format used in the request.
GET /posts/5.xml | request.format => Mime::XML GET /posts/5.xhtml | request.format => Mime::HTML GET /posts/5 | request.format => Mime::HTML or MIME::JS, or request.accepts.first depending on the value of <tt>ActionController::Base.use_accept_header</tt>
# File lib/action_controller/request.rb, line 154 def format @format ||= if parameters[:format] Mime::Type.lookup_by_extension(parameters[:format]) elsif ActionController::Base.use_accept_header accepts.first elsif xhr? Mime::Type.lookup_by_extension("js") else Mime::Type.lookup_by_extension("html") end end
Sets the format by string extension, which can be used to force custom formats that are not controlled by the extension.
class ApplicationController < ActionController::Base before_filter :adjust_format_for_iphone private def adjust_format_for_iphone request.format = :iphone if request.env["HTTP_USER_AGENT"][/iPhone/] end end
# File lib/action_controller/request.rb, line 179 def format=(extension) parameters[:format] = extension.to_s @format = Mime::Type.lookup_by_extension(parameters[:format]) end
Check response freshness (Last-Modified and ETag) against request If-Modified-Since and If-None-Match conditions. If both headers are supplied, both must match, or the request is not considered fresh.
# File lib/action_controller/request.rb, line 136 def fresh?(response) case when if_modified_since && if_none_match not_modified?(response.last_modified) && etag_matches?(response.etag) when if_modified_since not_modified?(response.last_modified) when if_none_match etag_matches?(response.etag) else false end end
Is this a GET (or HEAD) request? Equivalent to request.method == :get.
# File lib/action_controller/request.rb, line 47 def get? method == :get end
Is this a HEAD request? Since request.method sees HEAD as :get, this method checks the actual HTTP method directly.
# File lib/action_controller/request.rb, line 68 def head? request_method == :head end
Provides access to the request’s HTTP headers, for example:
request.headers["Content-Type"] # => "text/plain"
# File lib/action_controller/request.rb, line 75 def headers @headers ||= ActionController::Http::Headers.new(@env) end
Returns the host for this request, such as example.com.
# File lib/action_controller/request.rb, line 284 def host raw_host_with_port.sub(/:\d+$/, '') end
Returns a host:port string for this request, such as “example.com” or “example.com:8080”.
# File lib/action_controller/request.rb, line 290 def host_with_port "#{host}#{port_string}" end
# File lib/action_controller/request.rb, line 115 def if_modified_since if since = env['HTTP_IF_MODIFIED_SINCE'] Time.rfc2822(since) rescue nil end end
# File lib/action_controller/request.rb, line 121 def if_none_match env['HTTP_IF_NONE_MATCH'] end
# File lib/action_controller/request.rb, line 24 def key?(key) @env.key?(key) end
# File lib/action_controller/request.rb, line 98 def media_type content_type.to_s end
Returns the HTTP request method used for action processing as a lowercase symbol, such as :post. (Unlike request_method, this method returns :get for a HEAD request because the two are functionally equivalent from the application’s perspective.)
# File lib/action_controller/request.rb, line 42 def method request_method == :head ? :get : request_method end
# File lib/action_controller/request.rb, line 125 def not_modified?(modified_at) if_modified_since && modified_at && if_modified_since >= modified_at end
Returns both GET and POST parameters in a single hash.
# File lib/action_controller/request.rb, line 384 def parameters @parameters ||= request_parameters.merge(query_parameters).update(path_parameters).with_indifferent_access end
Returns the interpreted path to requested resource after all the installation directory of this application was taken into account.
# File lib/action_controller/request.rb, line 367 def path path = request_uri.to_s[/\A[^\?]*/] path.sub!(/\A#{ActionController::Base.relative_url_root}/, '') path end
Returns a hash with the parameters used to form the path of the request. Returned hash keys are strings:
{'action' => 'my_action', 'controller' => 'my_controller'}
See symbolized_path_parameters for symbolized keys.
# File lib/action_controller/request.rb, line 405 def path_parameters @env["action_controller.request.path_parameters"] ||= {} end
Returns the port number of this request as an integer.
# File lib/action_controller/request.rb, line 295 def port if raw_host_with_port =~ /:(\d+)$/ $1.to_i else standard_port end end
Returns a port suffix like “:8080” if the port number of this request is not the default HTTP port 80 or HTTPS port 443.
# File lib/action_controller/request.rb, line 313 def port_string port == standard_port ? '' : ":#{port}" end
Is this a POST request? Equivalent to request.method == :post.
# File lib/action_controller/request.rb, line 52 def post? request_method == :post end
Returns ‘https://’ if this is an SSL request and ‘http://’ otherwise.
# File lib/action_controller/request.rb, line 265 def protocol ssl? ? 'https://' : 'http://' end
Is this a PUT request? Equivalent to request.method == :put.
# File lib/action_controller/request.rb, line 57 def put? request_method == :put end
Returns the query string, accounting for server idiosyncrasies.
# File lib/action_controller/request.rb, line 336 def query_string @env['QUERY_STRING'].present? ? @env['QUERY_STRING'] : (@env['REQUEST_URI'].split('?', 2)[1] || '') end
Returns the host for this request, such as “example.com”.
# File lib/action_controller/request.rb, line 275 def raw_host_with_port if forwarded = env["HTTP_X_FORWARDED_HOST"] forwarded.split(/,\s?/).last else env['HTTP_HOST'] || "#{env['SERVER_NAME'] || env['SERVER_ADDR']}:#{env['SERVER_PORT']}" end end
Read the request body. This is useful for web services that need to work with raw requests directly.
# File lib/action_controller/request.rb, line 375 def raw_post unless @env.include? 'RAW_POST_DATA' @env['RAW_POST_DATA'] = body.read(@env['CONTENT_LENGTH'].to_i) body.rewind if body.respond_to?(:rewind) end @env['RAW_POST_DATA'] end
Determines originating IP address. REMOTE_ADDR is the standard but will fail if the user is behind a proxy. HTTP_CLIENT_IP and/or HTTP_X_FORWARDED_FOR are set by proxies so check for these if REMOTE_ADDR is a proxy. HTTP_X_FORWARDED_FOR may be a comma- delimited list in the case of multiple chained proxies; the last address which is not trusted is the originating IP.
# File lib/action_controller/request.rb, line 221 def remote_ip remote_addr_list = @env['REMOTE_ADDR'] && @env['REMOTE_ADDR'].scan(/[^,\s]+/) unless remote_addr_list.blank? not_trusted_addrs = remote_addr_list.reject {|addr| addr =~ TRUSTED_PROXIES} return not_trusted_addrs.first unless not_trusted_addrs.empty? end remote_ips = @env['HTTP_X_FORWARDED_FOR'].present? && @env['HTTP_X_FORWARDED_FOR'].split(',') if @env.include? 'HTTP_CLIENT_IP' if ActionController::Base.ip_spoofing_check && remote_ips && !remote_ips.include?(@env['HTTP_CLIENT_IP']) # We don't know which came from the proxy, and which from the user raise ActionControllerError.new(IP spoofing attack?!HTTP_CLIENT_IP=#{@env['HTTP_CLIENT_IP'].inspect}HTTP_X_FORWARDED_FOR=#{@env['HTTP_X_FORWARDED_FOR'].inspect}) end return @env['HTTP_CLIENT_IP'] end if remote_ips while remote_ips.size > 1 && TRUSTED_PROXIES =~ remote_ips.last.strip remote_ips.pop end return remote_ips.last.strip end @env['REMOTE_ADDR'] end
Returns the true HTTP request method as a lowercase symbol, such as :get. If the request method is not listed in the HTTP_METHODS constant above, an UnknownHttpMethod exception is raised.
# File lib/action_controller/request.rb, line 34 def request_method @request_method ||= HTTP_METHOD_LOOKUP[super] || raise(UnknownHttpMethod, "#{super}, accepted HTTP methods are #{HTTP_METHODS.to_sentence(:locale => :en)}") end
Returns the request URI, accounting for server idiosyncrasies. WEBrick includes the full URL. IIS leaves REQUEST_URI blank.
# File lib/action_controller/request.rb, line 342 def request_uri if uri = @env['REQUEST_URI'] # Remove domain, which webrick puts into the request_uri. (%{^\w+\://[^/]+(/.*|$)$} =~ uri) ? $1 : uri else # Construct IIS missing REQUEST_URI from SCRIPT_NAME and PATH_INFO. uri = @env['PATH_INFO'].to_s if script_filename = @env['SCRIPT_NAME'].to_s.match(%{[^/]+$}) uri = uri.sub(/#{script_filename}\//, '') end env_qs = @env['QUERY_STRING'].to_s uri += "?#{env_qs}" unless env_qs.empty? if uri.blank? @env.delete('REQUEST_URI') else @env['REQUEST_URI'] = uri end end end
# File lib/action_controller/request.rb, line 448 def reset_session # session may be a hash, if so, we do not want to call destroy # fixes issue 6440 session.destroy if session and session.respond_to?(:destroy) self.session = {} end
# File lib/action_controller/request.rb, line 463 def server_port @env['SERVER_PORT'].to_i end
Returns the lowercase name of the HTTP server software.
# File lib/action_controller/request.rb, line 255 def server_software (@env['SERVER_SOFTWARE'] && /^([a-zA-Z]+)/ =~ @env['SERVER_SOFTWARE']) ? $1.downcase : nil end
# File lib/action_controller/request.rb, line 440 def session @env['rack.session'] ||= {} end
# File lib/action_controller/request.rb, line 455 def session_options @env['rack.session.options'] ||= {} end
# File lib/action_controller/request.rb, line 459 def session_options=(options) @env['rack.session.options'] = options end
Is this an SSL request?
# File lib/action_controller/request.rb, line 270 def ssl? @env['HTTPS'] == 'on' || @env['HTTP_X_FORWARDED_PROTO'] == 'https' end
Returns the standard port number for this request’s protocol.
# File lib/action_controller/request.rb, line 304 def standard_port case protocol when 'https://' then 443 else 80 end end
Returns all the subdomains as an array, so ["dev", "www"] would be returned for “dev.www.rubyonrails.org”. You can specify a different tld_length, such as 2 to catch ["www"] instead of ["www", "rubyonrails"] in “www.rubyonrails.co.uk”.
# File lib/action_controller/request.rb, line 329 def subdomains(tld_length = 1) return [] unless named_host?(host) parts = host.split('.') parts[0..-(tld_length+2)] end
The same as path_parameters with explicitly symbolized keys.
# File lib/action_controller/request.rb, line 395 def symbolized_path_parameters @symbolized_path_parameters ||= path_parameters.symbolize_keys end
Returns a symbolized version of the :format parameter of the request. If no format is given it returns :jsfor Ajax requests and :html otherwise.
# File lib/action_controller/request.rb, line 187 def template_format parameter_format = parameters[:format] if parameter_format parameter_format elsif xhr? :js else :html end end
Returns the complete URL used for this request.
# File lib/action_controller/request.rb, line 260 def url protocol + host_with_port + request_uri end
Returns true if the request’s “X-Requested-With” header contains “XMLHttpRequest”. (The Prototype Javascript library sends this header with every Ajax request.)
# File lib/action_controller/request.rb, line 206 def xml_http_request? !(@env['HTTP_X_REQUESTED_WITH'] !~ /XMLHttpRequest/) end
Remove nils from the params hash
# File lib/action_controller/request.rb, line 497 def deep_munge(hash) keys = hash.keys.find_all { |k| hash[k] == [nil] } keys.each { |k| hash[k] = nil } hash.each_value do |v| case v when Array v.grep(Hash) { |x| deep_munge(x) } v.compact! when Hash deep_munge(v) end end hash end
Generated with the Darkfish Rdoc Generator 2.