Class: ActionController::AbstractRequest
- Defined in:
- lib/action_controller/request.rb,
lib/action_controller/deprecated_request_methods.rb
Overview
Subclassing AbstractRequest makes these methods available to the request objects used in production and testing, CgiRequest and TestRequest
Direct Known Subclasses
Instance Attribute Summary collapse
-
#env ⇒ Object
readonly
Returns the hash of environment variables for this request, such as { ‘RAILS_ENV’ => ‘production’ }.
Instance Method Summary collapse
-
#accepts ⇒ Object
Returns the accepted MIME type for the request.
-
#content_type ⇒ Object
Determine whether the body of a HTTP call is URL-encoded (default) or matches one of the registered param_parsers.
-
#cookies ⇒ Object
:nodoc:.
-
#delete? ⇒ Boolean
Is this a DELETE request? Equivalent to request.method == :delete.
-
#domain(tld_length = 1) ⇒ Object
Returns the domain part of a host, such as rubyonrails.org in “www.rubyonrails.org”.
-
#formatted_post? ⇒ Boolean
Is this a POST request formatted as XML or YAML?.
-
#get? ⇒ Boolean
Is this a GET (or HEAD) request? Equivalent to request.method == :get.
-
#head? ⇒ Boolean
Is this a HEAD request? HEAD is mapped as :get for request.method, so here we ask the REQUEST_METHOD header directly.
-
#host ⇒ Object
Returns the host for this request, such as example.com.
-
#host_with_port ⇒ Object
Returns a host:port string for this request, such as example.com or example.com:8080.
-
#method ⇒ Object
Returns the HTTP request method as a lowercase symbol (:get, for example).
-
#parameters ⇒ Object
Returns both GET and POST parameters in a single hash.
-
#path ⇒ Object
Returns the interpreted path to requested resource after all the installation directory of this application was taken into account.
-
#path_parameters ⇒ Object
Returns a hash with the parameters used to form the path of the request .
-
#path_parameters=(parameters) ⇒ Object
:nodoc:.
-
#port ⇒ Object
Returns the port number of this request as an integer.
-
#port_string ⇒ Object
Returns a port suffix like “:8080” if the port number of this request is not the default HTTP port 80 or HTTPS port 443.
-
#post? ⇒ Boolean
Is this a POST request? Equivalent to request.method == :post.
-
#post_format ⇒ Object
Determine whether the body of a HTTP call is URL-encoded (default) or matches one of the registered param_parsers.
-
#protocol ⇒ Object
Return ‘https://’ if this is an SSL request and ‘http://’ otherwise.
-
#put? ⇒ Boolean
Is this a PUT request? Equivalent to request.method == :put.
-
#query_parameters ⇒ Object
– Must be implemented in the concrete request ++.
-
#raw_post ⇒ Object
Receive the raw post data.
-
#relative_url_root ⇒ Object
Returns the path minus the web server relative installation directory.
-
#remote_ip ⇒ Object
Determine originating IP address.
-
#request_parameters ⇒ Object
:nodoc:.
-
#request_uri ⇒ Object
Return the request URI, accounting for server idiosyncracies.
-
#reset_session ⇒ Object
:nodoc:.
-
#server_software ⇒ Object
Returns the lowercase name of the HTTP server software.
-
#session ⇒ Object
:nodoc:.
-
#session=(session) ⇒ Object
:nodoc:.
-
#ssl? ⇒ Boolean
Is this an SSL request?.
-
#standard_port ⇒ Object
Returns the standard port number for this request’s protocol.
-
#subdomains(tld_length = 1) ⇒ Object
Returns all the subdomains as an array, so [“dev”, “www”] would be returned for “dev.www.rubyonrails.org”.
-
#symbolized_path_parameters ⇒ Object
The same as
path_parameters
with explicitly symbolized keys. -
#xml_http_request? ⇒ Boolean
(also: #xhr?)
Returns true if the request’s “X-Requested-With” header contains “XMLHttpRequest”.
-
#xml_post? ⇒ Boolean
Is this a POST request formatted as XML?.
-
#yaml_post? ⇒ Boolean
Is this a POST request formatted as YAML?.
Instance Attribute Details
#env ⇒ Object (readonly)
Returns the hash of environment variables for this request, such as { ‘RAILS_ENV’ => ‘production’ }.
9 10 11 |
# File 'lib/action_controller/request.rb', line 9 def env @env end |
Instance Method Details
#accepts ⇒ Object
Returns the accepted MIME type for the request
77 78 79 80 81 82 83 84 |
# File 'lib/action_controller/request.rb', line 77 def accepts @accepts ||= if @env['HTTP_ACCEPT'].to_s.strip.empty? [ content_type, Mime::ALL ] else Mime::Type.parse(@env['HTTP_ACCEPT']) end end |
#content_type ⇒ Object
Determine whether the body of a HTTP call is URL-encoded (default) or matches one of the registered param_parsers.
For backward compatibility, the post format is extracted from the X-Post-Data-Format HTTP header if present.
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/action_controller/request.rb', line 58 def content_type @content_type ||= begin content_type = @env['CONTENT_TYPE'].to_s.downcase if x_post_format = @env['HTTP_X_POST_DATA_FORMAT'] case x_post_format.to_s.downcase when 'yaml' content_type = 'application/x-yaml' when 'xml' content_type = 'application/xml' end end Mime::Type.lookup(content_type) end end |
#cookies ⇒ Object
:nodoc:
252 253 |
# File 'lib/action_controller/request.rb', line 252 def #:nodoc: end |
#delete? ⇒ Boolean
Is this a DELETE request? Equivalent to request.method == :delete
43 44 45 |
# File 'lib/action_controller/request.rb', line 43 def delete? method == :delete end |
#domain(tld_length = 1) ⇒ Object
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”.
116 117 118 119 120 |
# File 'lib/action_controller/request.rb', line 116 def domain(tld_length = 1) return nil if !/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/.match(host).nil? or host.nil? host.split('.').last(1 + tld_length).join('.') end |
#formatted_post? ⇒ Boolean
Is this a POST request formatted as XML or YAML?
20 21 22 |
# File 'lib/action_controller/deprecated_request_methods.rb', line 20 def formatted_post? post? && (post_format == :yaml || post_format == :xml) end |
#get? ⇒ Boolean
Is this a GET (or HEAD) request? Equivalent to request.method == :get
28 29 30 |
# File 'lib/action_controller/request.rb', line 28 def get? method == :get end |
#head? ⇒ Boolean
Is this a HEAD request? HEAD is mapped as :get for request.method, so here we ask the REQUEST_METHOD header directly. Thus, for head, both get? and head? will return true.
49 50 51 |
# File 'lib/action_controller/request.rb', line 49 def head? @env['REQUEST_METHOD'].downcase.to_sym == :head end |
#host ⇒ Object
Returns the host for this request, such as example.com.
249 250 |
# File 'lib/action_controller/request.rb', line 249 def host end |
#host_with_port ⇒ Object
Returns a host:port string for this request, such as example.com or example.com:8080.
211 212 213 |
# File 'lib/action_controller/request.rb', line 211 def host_with_port host + port_string end |
#method ⇒ Object
Returns the HTTP request method as a lowercase symbol (:get, for example). Note, HEAD is returned as :get since the two are supposedly to be functionaly equivilent for all purposes except that HEAD won’t return a response body (which Rails also takes care of elsewhere).
19 20 21 22 23 24 25 |
# File 'lib/action_controller/request.rb', line 19 def method @request_method ||= (!parameters[:_method].blank? && @env['REQUEST_METHOD'] == 'POST') ? parameters[:_method].to_s.downcase.to_sym : @env['REQUEST_METHOD'].downcase.to_sym @request_method == :head ? :get : @request_method end |
#parameters ⇒ Object
Returns both GET and POST parameters in a single hash.
12 13 14 |
# File 'lib/action_controller/request.rb', line 12 def parameters @parameters ||= request_parameters.update(query_parameters).update(path_parameters).with_indifferent_access end |
#path ⇒ Object
Returns the interpreted path to requested resource after all the installation directory of this application was taken into account
167 168 169 170 171 172 173 |
# File 'lib/action_controller/request.rb', line 167 def path path = (uri = request_uri) ? uri.split('?').first : '' # Cut off the path to the installation directory if given path.sub!(%r/^#{relative_url_root}/, '') path || '' end |
#path_parameters ⇒ Object
Returns a hash with the parameters used to form the path of the request
Example:
{:action => 'my_action', :controller => 'my_controller'}
230 231 232 |
# File 'lib/action_controller/request.rb', line 230 def path_parameters @path_parameters ||= {} end |
#path_parameters=(parameters) ⇒ Object
:nodoc:
215 216 217 218 |
# File 'lib/action_controller/request.rb', line 215 def path_parameters=(parameters) #:nodoc: @path_parameters = parameters @symbolized_path_parameters = @parameters = nil end |
#port ⇒ Object
Returns the port number of this request as an integer.
191 192 193 |
# File 'lib/action_controller/request.rb', line 191 def port @port_as_int ||= @env['SERVER_PORT'].to_i end |
#port_string ⇒ Object
Returns a port suffix like “:8080” if the port number of this request is not the default HTTP port 80 or HTTPS port 443.
205 206 207 |
# File 'lib/action_controller/request.rb', line 205 def port_string (port == standard_port) ? '' : ":#{port}" end |
#post? ⇒ Boolean
Is this a POST request? Equivalent to request.method == :post
33 34 35 |
# File 'lib/action_controller/request.rb', line 33 def post? method == :post end |
#post_format ⇒ Object
Determine whether the body of a HTTP call is URL-encoded (default) or matches one of the registered param_parsers.
For backward compatibility, the post format is extracted from the X-Post-Data-Format HTTP header if present.
8 9 10 11 12 13 14 15 16 17 |
# File 'lib/action_controller/deprecated_request_methods.rb', line 8 def post_format case content_type.to_s when 'application/xml' :xml when 'application/x-yaml' :yaml else :url_encoded end end |
#protocol ⇒ Object
Return ‘https://’ if this is an SSL request and ‘http://’ otherwise.
157 158 159 |
# File 'lib/action_controller/request.rb', line 157 def protocol ssl? ? 'https://' : 'http://' end |
#put? ⇒ Boolean
Is this a PUT request? Equivalent to request.method == :put
38 39 40 |
# File 'lib/action_controller/request.rb', line 38 def put? method == :put end |
#query_parameters ⇒ Object
– Must be implemented in the concrete request ++
242 243 |
# File 'lib/action_controller/request.rb', line 242 def query_parameters #:nodoc: end |
#raw_post ⇒ Object
Receive the raw post data. This is useful for services such as REST, XMLRPC and SOAP which communicate over HTTP POST but don’t use the traditional parameter format.
134 135 136 |
# File 'lib/action_controller/request.rb', line 134 def raw_post @env['RAW_POST_DATA'] end |
#relative_url_root ⇒ Object
Returns the path minus the web server relative installation directory. This can be set with the environment variable RAILS_RELATIVE_URL_ROOT. It can be automatically extracted for Apache setups. If the server is not Apache, this method returns an empty string.
179 180 181 182 183 184 185 186 187 188 |
# File 'lib/action_controller/request.rb', line 179 def relative_url_root @@relative_url_root ||= case when @env["RAILS_RELATIVE_URL_ROOT"] @env["RAILS_RELATIVE_URL_ROOT"] when server_software == 'apache' @env["SCRIPT_NAME"].to_s.sub(/\/dispatch\.(fcgi|rb|cgi)$/, '') else '' end end |
#remote_ip ⇒ Object
Determine 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 before falling back to REMOTE_ADDR. HTTP_X_FORWARDED_FOR may be a comma- delimited list in the case of multiple chained proxies; the first is the originating IP.
100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/action_controller/request.rb', line 100 def remote_ip return @env['HTTP_CLIENT_IP'] if @env.include? 'HTTP_CLIENT_IP' if @env.include? 'HTTP_X_FORWARDED_FOR' then remote_ips = @env['HTTP_X_FORWARDED_FOR'].split(',').reject do |ip| ip =~ /^unknown$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\./i end return remote_ips.first.strip unless remote_ips.empty? end @env['REMOTE_ADDR'] end |
#request_parameters ⇒ Object
:nodoc:
245 246 |
# File 'lib/action_controller/request.rb', line 245 def request_parameters #:nodoc: end |
#request_uri ⇒ Object
Return the request URI, accounting for server idiosyncracies. WEBrick includes the full URL. IIS leaves REQUEST_URI blank.
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
# File 'lib/action_controller/request.rb', line 140 def request_uri if uri = @env['REQUEST_URI'] # Remove domain, which webrick puts into the request_uri. (%r{^\w+\://[^/]+(/.*|$)$} =~ uri) ? $1 : uri else # Construct IIS missing REQUEST_URI from SCRIPT_NAME and PATH_INFO. script_filename = @env['SCRIPT_NAME'].to_s.match(%r{[^/]+$}) uri = @env['PATH_INFO'] uri = uri.sub(/#{script_filename}\//, '') unless script_filename.nil? unless (env_qs = @env['QUERY_STRING']).nil? || env_qs.empty? uri << '?' << env_qs end @env['REQUEST_URI'] = uri end end |
#reset_session ⇒ Object
:nodoc:
262 263 |
# File 'lib/action_controller/request.rb', line 262 def reset_session #:nodoc: end |
#server_software ⇒ Object
Returns the lowercase name of the HTTP server software.
235 236 237 |
# File 'lib/action_controller/request.rb', line 235 def server_software (@env['SERVER_SOFTWARE'] && /^([a-zA-Z]+)/ =~ @env['SERVER_SOFTWARE']) ? $1.downcase : nil end |
#session ⇒ Object
:nodoc:
255 256 |
# File 'lib/action_controller/request.rb', line 255 def session #:nodoc: end |
#session=(session) ⇒ Object
:nodoc:
258 259 260 |
# File 'lib/action_controller/request.rb', line 258 def session=(session) #:nodoc: @session = session end |
#ssl? ⇒ Boolean
Is this an SSL request?
162 163 164 |
# File 'lib/action_controller/request.rb', line 162 def ssl? @env['HTTPS'] == 'on' || @env['HTTP_X_FORWARDED_PROTO'] == 'https' end |
#standard_port ⇒ Object
Returns the standard port number for this request’s protocol
196 197 198 199 200 201 |
# File 'lib/action_controller/request.rb', line 196 def standard_port case protocol when 'https://' then 443 else 80 end end |
#subdomains(tld_length = 1) ⇒ Object
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”.
125 126 127 128 129 |
# File 'lib/action_controller/request.rb', line 125 def subdomains(tld_length = 1) return [] unless host parts = host.split('.') parts[0..-(tld_length+2)] end |
#symbolized_path_parameters ⇒ Object
The same as path_parameters
with explicitly symbolized keys
221 222 223 |
# File 'lib/action_controller/request.rb', line 221 def symbolized_path_parameters @symbolized_path_parameters ||= path_parameters.symbolize_keys end |
#xml_http_request? ⇒ Boolean Also known as: xhr?
Returns true if the request’s “X-Requested-With” header contains “XMLHttpRequest”. (The Prototype Javascript library sends this header with every Ajax request.)
89 90 91 |
# File 'lib/action_controller/request.rb', line 89 def xml_http_request? not /XMLHttpRequest/i.match(@env['HTTP_X_REQUESTED_WITH']).nil? end |
#xml_post? ⇒ Boolean
Is this a POST request formatted as XML?
25 26 27 |
# File 'lib/action_controller/deprecated_request_methods.rb', line 25 def xml_post? post? && post_format == :xml end |
#yaml_post? ⇒ Boolean
Is this a POST request formatted as YAML?
30 31 32 |
# File 'lib/action_controller/deprecated_request_methods.rb', line 30 def yaml_post? post? && post_format == :yaml end |