Class: ActionController::AbstractRequest

Inherits:
Object
  • Object
show all
Defined in:
lib/action_controller/request.rb

Overview

These methods are available in both the production and test Request objects.

Direct Known Subclasses

CgiRequest, TestRequest

Instance Method Summary collapse

Instance Method Details

#cookiesObject

:nodoc:


233
234
# File 'lib/action_controller/request.rb', line 233

def cookies #:nodoc:
end

#delete?Boolean

Is this a DELETE request? Equivalent to request.method == :delete

Returns:

  • (Boolean)

32
33
34
# File 'lib/action_controller/request.rb', line 32

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”.


111
112
113
114
115
# File 'lib/action_controller/request.rb', line 111

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

#envObject

:nodoc:


227
228
# File 'lib/action_controller/request.rb', line 227

def env #:nodoc:
end

#formatted_post?Boolean

Is this a POST request formatted as XML or YAML?

Returns:

  • (Boolean)

67
68
69
# File 'lib/action_controller/request.rb', line 67

def formatted_post?
  post? && (post_format == :xml || post_format == :yaml)
end

#get?Boolean

Is this a GET request? Equivalent to request.method == :get

Returns:

  • (Boolean)

17
18
19
# File 'lib/action_controller/request.rb', line 17

def get?
  method == :get
end

#head?Boolean

Is this a HEAD request? Equivalent to request.method == :head

Returns:

  • (Boolean)

37
38
39
# File 'lib/action_controller/request.rb', line 37

def head?
  method == :head
end

#hostObject

:nodoc:


230
231
# File 'lib/action_controller/request.rb', line 230

def host #:nodoc:
end

#host_with_portObject

Returns a host:port string for this request, such as example.com or example.com:8080.


196
197
198
# File 'lib/action_controller/request.rb', line 196

def host_with_port
  host + port_string
end

#methodObject

Returns the HTTP request method as a lowercase symbol (:get, for example)


12
13
14
# File 'lib/action_controller/request.rb', line 12

def method
  env['REQUEST_METHOD'].downcase.to_sym
end

#parametersObject

Returns both GET and POST parameters in a single hash.


7
8
9
# File 'lib/action_controller/request.rb', line 7

def parameters
  @parameters ||= request_parameters.merge(query_parameters).merge(path_parameters).with_indifferent_access
end

#pathObject

Returns the interpreted path to requested resource after all the installation directory of this application was taken into account


160
161
162
163
164
165
166
167
# File 'lib/action_controller/request.rb', line 160

def path
  path = (uri = request_uri) ? uri.split('?').first : ''

  # Cut off the path to the installation directory if given
  root = relative_url_root
  path[0, root.length] = '' if root
  path || ''
end

#path_parametersObject


209
210
211
# File 'lib/action_controller/request.rb', line 209

def path_parameters
  @path_parameters ||= {}
end

#path_parameters=(parameters) ⇒ Object


200
201
202
203
# File 'lib/action_controller/request.rb', line 200

def path_parameters=(parameters)
  @path_parameters = parameters
  @symbolized_path_parameters = @parameters = nil
end

#portObject

Returns the port number of this request as an integer.


176
177
178
# File 'lib/action_controller/request.rb', line 176

def port
  @port_as_int ||= env['SERVER_PORT'].to_i
end

#port_stringObject

Returns a port suffix like “:8080” if the port number of this request is not the default HTTP port 80 or HTTPS port 443.


190
191
192
# File 'lib/action_controller/request.rb', line 190

def port_string
  (port == standard_port) ? '' : ":#{port}"
end

#post?Boolean

Is this a POST request? Equivalent to request.method == :post

Returns:

  • (Boolean)

22
23
24
# File 'lib/action_controller/request.rb', line 22

def post?
  method == :post
end

#post_formatObject

Determine whether the body of a POST request is URL-encoded (default), XML, or YAML by checking the Content-Type HTTP header:

Content-Type        Post Format
application/xml     :xml
text/xml            :xml
application/x-yaml  :yaml
text/x-yaml         :yaml
*                   :url_encoded

For backward compatibility, the post format is extracted from the X-Post-Data-Format HTTP header if present.


53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/action_controller/request.rb', line 53

def post_format
  @post_format ||=
       if env['HTTP_X_POST_DATA_FORMAT']
         env['HTTP_X_POST_DATA_FORMAT'].downcase.to_sym
       else
         case env['CONTENT_TYPE'].to_s.downcase
         when 'application/xml', 'text/xml'        then :xml
         when 'application/x-yaml', 'text/x-yaml'  then :yaml
         else :url_encoded
         end
       end
end

#protocolObject

Return 'https://' if this is an SSL request and 'http://' otherwise.


150
151
152
# File 'lib/action_controller/request.rb', line 150

def protocol
  ssl? ? 'https://' : 'http://'
end

#put?Boolean

Is this a PUT request? Equivalent to request.method == :put

Returns:

  • (Boolean)

27
28
29
# File 'lib/action_controller/request.rb', line 27

def put?
  method == :put
end

#query_parametersObject

– Must be implemented in the concrete request ++


221
222
# File 'lib/action_controller/request.rb', line 221

def query_parameters #:nodoc:
end

#raw_postObject

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.


129
130
131
# File 'lib/action_controller/request.rb', line 129

def raw_post
  env['RAW_POST_DATA']
end

#relative_url_rootObject

Returns the path minus the web server relative installation directory. This method returns nil unless the web server is apache.


171
172
173
# File 'lib/action_controller/request.rb', line 171

def relative_url_root
  @@relative_url_root ||= server_software == 'apache' ? File.dirname(env["SCRIPT_NAME"].to_s).gsub(/(^\.$|^\/$)/, '') : ''
end

#remote_ipObject

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.


95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/action_controller/request.rb', line 95

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_parametersObject

:nodoc:


224
225
# File 'lib/action_controller/request.rb', line 224

def request_parameters #:nodoc:
end

#request_uriObject

Returns the request URI correctly, taking into account the idiosyncracies of the various servers.


135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/action_controller/request.rb', line 135

def request_uri
  if uri = env['REQUEST_URI']
    (%r{^\w+\://[^/]+(/.*|$)$} =~ uri) ? $1 : uri # Remove domain, which webrick puts into the request_uri.
  else  # REQUEST_URI is blank under IIS - get this from PATH_INFO and SCRIPT_NAME
    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
    uri
  end
end

#reset_sessionObject

:nodoc:


239
240
# File 'lib/action_controller/request.rb', line 239

def reset_session #:nodoc:
end

#server_softwareObject

Returns the lowercase name of the HTTP server software.


214
215
216
# File 'lib/action_controller/request.rb', line 214

def server_software
  (env['SERVER_SOFTWARE'] && /^([a-zA-Z]+)/ =~ env['SERVER_SOFTWARE']) ? $1.downcase : nil
end

#sessionObject

:nodoc:


236
237
# File 'lib/action_controller/request.rb', line 236

def session #:nodoc:
end

#ssl?Boolean

Is this an SSL request?

Returns:

  • (Boolean)

155
156
157
# File 'lib/action_controller/request.rb', line 155

def ssl?
  env['HTTPS'] == 'on' 
end

#standard_portObject

Returns the standard port number for this request's protocol


181
182
183
184
185
186
# File 'lib/action_controller/request.rb', line 181

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”.


120
121
122
123
124
# File 'lib/action_controller/request.rb', line 120

def subdomains(tld_length = 1)
  return [] unless host
  parts = host.split('.')
  parts[0..-(tld_length+2)]
end

#symbolized_path_parametersObject


205
206
207
# File 'lib/action_controller/request.rb', line 205

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.)

Returns:

  • (Boolean)

84
85
86
# File 'lib/action_controller/request.rb', line 84

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?

Returns:

  • (Boolean)

72
73
74
# File 'lib/action_controller/request.rb', line 72

def xml_post?
  post? && post_format == :xml
end

#yaml_post?Boolean

Is this a POST request formatted as YAML?

Returns:

  • (Boolean)

77
78
79
# File 'lib/action_controller/request.rb', line 77

def yaml_post?
  post? && post_format == :yaml
end