2007-05-18 02:24:50 -04:00
require 'tempfile'
require 'stringio'
require 'strscan'
2008-08-08 02:43:12 -04:00
require 'active_support/memoizable'
2008-12-22 17:15:53 -05:00
require 'action_controller/cgi_ext'
2007-11-28 21:08:51 -05:00
2009-01-27 19:54:01 -05:00
module ActionDispatch
2009-01-09 12:15:38 -05:00
class Request < Rack :: Request
2008-12-22 19:15:08 -05:00
2009-01-09 12:15:38 -05:00
%w[ AUTH_TYPE GATEWAY_INTERFACE
2008-12-22 19:15:08 -05:00
PATH_TRANSLATED REMOTE_HOST
2009-01-09 12:15:38 -05:00
REMOTE_IDENT REMOTE_USER REMOTE_ADDR
2008-12-22 19:15:08 -05:00
SERVER_NAME SERVER_PROTOCOL
HTTP_ACCEPT HTTP_ACCEPT_CHARSET HTTP_ACCEPT_ENCODING
HTTP_ACCEPT_LANGUAGE HTTP_CACHE_CONTROL HTTP_FROM
HTTP_NEGOTIATE HTTP_PRAGMA HTTP_REFERER HTTP_USER_AGENT ] . each do | env |
define_method ( env . sub ( / ^HTTP_ /n , '' ) . downcase ) do
@env [ env ]
end
end
def key? ( key )
@env . key? ( key )
end
2008-08-08 02:43:12 -04:00
HTTP_METHODS = %w( get head put post delete options )
HTTP_METHOD_LOOKUP = HTTP_METHODS . inject ( { } ) { | h , m | h [ m ] = h [ m . upcase ] = m . to_sym ; h }
2009-01-18 13:10:58 -05:00
# Returns the true HTTP request \method as a lowercase symbol, such as
# <tt>:get</tt>. If the request \method is not listed in the HTTP_METHODS
# constant above, an UnknownHttpMethod exception is raised.
2007-11-28 21:08:51 -05:00
def request_method
2009-01-27 19:54:01 -05:00
HTTP_METHOD_LOOKUP [ super ] || raise ( ActionController :: UnknownHttpMethod , " #{ super } , accepted HTTP methods are #{ HTTP_METHODS . to_sentence } " )
2007-11-28 21:08:51 -05:00
end
2009-01-18 13:10:58 -05:00
# Returns the HTTP request \method used for action processing as a
# lowercase symbol, such as <tt>:post</tt>. (Unlike #request_method, this
# method returns <tt>:get</tt> for a HEAD request because the two are
# functionally equivalent from the application's perspective.)
2004-11-23 20:04:44 -05:00
def method
2007-11-28 21:08:51 -05:00
request_method == :head ? :get : request_method
2004-11-23 20:04:44 -05:00
end
2008-05-02 09:45:23 -04:00
# Is this a GET (or HEAD) request? Equivalent to <tt>request.method == :get</tt>.
2004-11-23 20:04:44 -05:00
def get?
method == :get
end
2008-05-02 09:45:23 -04:00
# Is this a POST request? Equivalent to <tt>request.method == :post</tt>.
2004-11-23 20:04:44 -05:00
def post?
2007-11-28 21:08:51 -05:00
request_method == :post
2004-11-23 20:04:44 -05:00
end
2008-05-02 09:45:23 -04:00
# Is this a PUT request? Equivalent to <tt>request.method == :put</tt>.
2004-11-23 20:04:44 -05:00
def put?
2007-11-28 21:08:51 -05:00
request_method == :put
2004-11-23 20:04:44 -05:00
end
2008-05-02 09:45:23 -04:00
# Is this a DELETE request? Equivalent to <tt>request.method == :delete</tt>.
2004-11-23 20:04:44 -05:00
def delete?
2007-11-28 21:08:51 -05:00
request_method == :delete
2004-11-23 20:04:44 -05:00
end
2008-09-03 12:58:47 -04:00
# Is this a HEAD request? Since <tt>request.method</tt> sees HEAD as <tt>:get</tt>,
# this \method checks the actual HTTP \method directly.
2004-12-07 05:50:26 -05:00
def head?
2007-11-28 21:08:51 -05:00
request_method == :head
2004-12-07 05:50:26 -05:00
end
2005-05-14 04:36:19 -04:00
2008-07-16 08:00:36 -04:00
# Provides access to the request's HTTP headers, for example:
2008-09-03 12:58:47 -04:00
#
# request.headers["Content-Type"] # => "text/plain"
2007-02-17 13:16:44 -05:00
def headers
2009-01-27 19:54:01 -05:00
Http :: Headers . new ( @env )
2007-02-17 13:16:44 -05:00
end
2008-09-03 12:58:47 -04:00
# Returns the content length of the request as an integer.
2007-05-18 02:24:50 -04:00
def content_length
2009-01-09 12:15:38 -05:00
super . to_i
2007-05-18 02:24:50 -04:00
end
2007-05-19 17:34:36 -04:00
# The MIME type of the HTTP request, such as Mime::XML.
2005-06-24 10:43:15 -04:00
#
2008-09-03 12:58:47 -04:00
# For backward compatibility, the post \format is extracted from the
2005-06-24 10:43:15 -04:00
# X-Post-Data-Format HTTP header if present.
2006-03-05 13:59:58 -05:00
def content_type
2009-01-27 12:26:07 -05:00
@content_type || = begin
if @env [ 'CONTENT_TYPE' ] =~ / ^([^, \ ;]*) /
Mime :: Type . lookup ( $1 . strip . downcase )
else
nil
end
2009-01-17 21:29:50 -05:00
end
2006-03-10 20:23:29 -05:00
end
2008-09-03 12:58:47 -04:00
# Returns the accepted MIME type for the request.
2006-03-10 20:23:29 -05:00
def accepts
2009-01-27 12:26:07 -05:00
@accepts || = begin
header = @env [ 'HTTP_ACCEPT' ] . to_s . strip
2008-08-08 02:43:12 -04:00
2009-01-22 17:18:10 -05:00
fallback = xhr? ? Mime :: JS : Mime :: HTML
2008-08-08 02:43:12 -04:00
if header . empty?
2009-01-22 17:18:10 -05:00
[ content_type , fallback , Mime :: ALL ] . compact
2008-08-08 02:43:12 -04:00
else
2009-01-22 17:18:10 -05:00
ret = Mime :: Type . parse ( header )
if ret . last == Mime :: ALL
ret . insert ( - 2 , fallback )
2009-01-27 12:26:07 -05:00
end
2009-01-22 17:18:10 -05:00
ret
2008-08-08 02:43:12 -04:00
end
end
def if_modified_since
if since = env [ 'HTTP_IF_MODIFIED_SINCE' ]
2008-08-19 18:07:17 -04:00
Time . rfc2822 ( since ) rescue nil
2008-08-08 02:43:12 -04:00
end
end
def if_none_match
env [ 'HTTP_IF_NONE_MATCH' ]
end
def not_modified? ( modified_at )
if_modified_since && modified_at && if_modified_since > = modified_at
end
def etag_matches? ( etag )
if_none_match && if_none_match == etag
end
# Check response freshness (Last-Modified and ETag) against request
2008-10-20 20:30:13 -04:00
# If-Modified-Since and If-None-Match conditions. If both headers are
# supplied, both must match, or the request is not considered fresh.
2008-08-08 02:43:12 -04:00
def fresh? ( response )
2008-10-20 20:30:13 -04:00
case
2008-12-23 14:36:05 -05:00
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
2005-05-14 04:36:19 -04:00
end
2005-05-22 03:43:05 -04:00
2008-12-25 20:12:33 -05:00
ONLY_ALL = [ Mime :: ALL ] . freeze
2008-09-03 12:58:47 -04:00
# Returns the Mime type for the \format used in the request.
2006-12-02 18:07:04 -05:00
#
# GET /posts/5.xml | request.format => Mime::XML
# GET /posts/5.xhtml | request.format => Mime::HTML
2008-06-27 04:29:04 -04:00
# 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>
2008-12-25 20:12:33 -05:00
2009-01-22 17:18:10 -05:00
def format ( view_path = [ ] )
2008-08-08 02:43:12 -04:00
@format || =
2008-06-27 04:29:04 -04:00
if parameters [ :format ]
2008-12-25 20:12:33 -05:00
Mime [ parameters [ :format ] ]
2009-01-27 19:54:01 -05:00
elsif ActionController :: Base . use_accept_header && ! ( accepts == ONLY_ALL )
2008-12-25 20:12:33 -05:00
accepts . first
elsif xhr? then Mime :: JS
else Mime :: HTML
2008-06-27 04:29:04 -04:00
end
2006-12-02 18:07:04 -05:00
end
2008-07-24 14:41:51 -04:00
2008-12-25 20:12:33 -05:00
def formats
@formats =
2009-01-27 19:54:01 -05:00
if ActionController :: Base . use_accept_header
2008-12-25 20:12:33 -05:00
Array ( Mime [ parameters [ :format ] ] || accepts )
else
[ format ]
end
end
2008-07-24 14:41:51 -04:00
2008-09-03 12:58:47 -04:00
# Sets the \format by string extension, which can be used to force custom formats
# that are not controlled by the extension.
2007-09-15 00:18:32 -04:00
#
# class ApplicationController < ActionController::Base
# before_filter :adjust_format_for_iphone
2008-07-24 14:41:51 -04:00
#
2007-09-15 00:18:32 -04:00
# private
# def adjust_format_for_iphone
# request.format = :iphone if request.env["HTTP_USER_AGENT"][/iPhone/]
# end
# end
def format = ( extension )
parameters [ :format ] = extension . to_s
2008-02-07 11:46:50 -05:00
@format = Mime :: Type . lookup_by_extension ( parameters [ :format ] )
2007-09-15 00:18:32 -04:00
end
2006-12-02 18:07:04 -05:00
2008-06-27 04:29:04 -04:00
# Returns a symbolized version of the <tt>:format</tt> parameter of the request.
2008-09-03 12:58:47 -04:00
# If no \format is given it returns <tt>:js</tt>for Ajax requests and <tt>:html</tt>
2008-06-27 04:29:04 -04:00
# otherwise.
2008-06-27 14:24:21 -04:00
def template_format
parameter_format = parameters [ :format ]
2008-06-27 04:29:04 -04:00
if parameter_format
2008-09-30 05:31:00 -04:00
parameter_format
2008-06-27 04:29:04 -04:00
elsif xhr?
2008-06-27 14:24:21 -04:00
:js
else
2008-06-27 04:29:04 -04:00
:html
2008-06-27 14:24:21 -04:00
end
end
2008-06-27 04:29:04 -04:00
def cache_format
2008-09-30 05:31:00 -04:00
parameters [ :format ]
2008-06-27 04:29:04 -04:00
end
2005-06-24 12:40:01 -04:00
# Returns true if the request's "X-Requested-With" header contains
# "XMLHttpRequest". (The Prototype Javascript library sends this header with
# every Ajax request.)
2005-05-22 03:43:05 -04:00
def xml_http_request?
2007-10-02 01:32:14 -04:00
! ( @env [ 'HTTP_X_REQUESTED_WITH' ] !~ / XMLHttpRequest /i )
2005-05-22 03:43:05 -04:00
end
alias xhr? :xml_http_request?
2008-03-28 17:38:01 -04:00
# Which IP addresses are "trusted proxies" that can be stripped from
# the right-hand-side of X-Forwarded-For
TRUSTED_PROXIES = / ^127 \ .0 \ .0 \ .1$|^(10|172 \ .(1[6-9]|2[0-9]|30|31)|192 \ .168) \ . /i
2008-09-03 12:58:47 -04:00
# Determines originating IP address. REMOTE_ADDR is the standard
2004-11-23 20:04:44 -05:00
# but will fail if the user is behind a proxy. HTTP_CLIENT_IP and/or
2008-03-28 17:38:01 -04:00
# 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.
2004-11-23 20:04:44 -05:00
def remote_ip
2008-11-30 20:06:11 -05:00
remote_addr_list = @env [ 'REMOTE_ADDR' ] && @env [ 'REMOTE_ADDR' ] . scan ( / [^, \ s]+ / )
2008-03-28 17:38:01 -04:00
2008-07-01 04:52:20 -04:00
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
2008-06-03 19:11:47 -04:00
remote_ips = @env [ 'HTTP_X_FORWARDED_FOR' ] && @env [ 'HTTP_X_FORWARDED_FOR' ] . split ( ',' )
2008-03-28 17:38:01 -04:00
if @env . include? 'HTTP_CLIENT_IP'
2008-11-22 13:04:30 -05:00
if ActionController :: Base . ip_spoofing_check && remote_ips && ! remote_ips . include? ( @env [ 'HTTP_CLIENT_IP' ] )
2008-03-28 17:38:01 -04:00
# We don't know which came from the proxy, and which from the user
2009-01-27 19:54:01 -05:00
raise ActionController :: ActionControllerError . new ( <<EOM)
2008-03-28 17:38:01 -04:00
IP spoofing attack? !
HTTP_CLIENT_IP = #{@env['HTTP_CLIENT_IP'].inspect}
HTTP_X_FORWARDED_FOR = #{@env['HTTP_X_FORWARDED_FOR'].inspect}
EOM
end
2008-06-03 19:11:47 -04:00
2008-03-28 17:38:01 -04:00
return @env [ 'HTTP_CLIENT_IP' ]
end
2004-11-25 11:39:18 -05:00
2008-06-03 19:11:47 -04:00
if remote_ips
2008-03-28 17:38:01 -04:00
while remote_ips . size > 1 && TRUSTED_PROXIES =~ remote_ips . last . strip
remote_ips . pop
2004-11-25 11:39:18 -05:00
end
2008-03-28 17:38:01 -04:00
return remote_ips . last . strip
2004-11-23 20:04:44 -05:00
end
2004-11-25 11:39:18 -05:00
2006-02-09 15:05:11 -05:00
@env [ 'REMOTE_ADDR' ]
2004-11-23 20:04:44 -05:00
end
2007-03-04 15:32:38 -05:00
# Returns the lowercase name of the HTTP server software.
def server_software
( @env [ 'SERVER_SOFTWARE' ] && / ^([a-zA-Z]+) / =~ @env [ 'SERVER_SOFTWARE' ] ) ? $1 . downcase : nil
end
2008-09-03 12:58:47 -04:00
# Returns the complete URL used for this request.
2007-03-04 15:32:38 -05:00
def url
2007-03-04 15:44:01 -05:00
protocol + host_with_port + request_uri
2007-03-04 15:32:38 -05:00
end
2008-09-03 12:58:47 -04:00
# Returns 'https://' if this is an SSL request and 'http://' otherwise.
2007-03-04 15:32:38 -05:00
def protocol
ssl? ? 'https://' : 'http://'
end
# Is this an SSL request?
def ssl?
@env [ 'HTTPS' ] == 'on' || @env [ 'HTTP_X_FORWARDED_PROTO' ] == 'https'
end
2008-09-03 12:58:47 -04:00
# Returns the \host for this request, such as "example.com".
2008-08-08 05:31:12 -04:00
def raw_host_with_port
2008-08-08 02:43:12 -04:00
if forwarded = env [ " HTTP_X_FORWARDED_HOST " ]
forwarded . split ( / , \ s? / ) . last
else
2008-12-28 12:05:12 -05:00
env [ 'HTTP_HOST' ] || " #{ env [ 'SERVER_NAME' ] || env [ 'SERVER_ADDR' ] } : #{ env [ 'SERVER_PORT' ] } "
2008-08-08 02:43:12 -04:00
end
end
2007-03-04 15:32:38 -05:00
# Returns the host for this request, such as example.com.
def host
2008-08-08 05:31:12 -04:00
raw_host_with_port . sub ( / : \ d+$ / , '' )
2007-03-04 15:32:38 -05:00
end
2008-09-03 12:58:47 -04:00
# Returns a \host:\port string for this request, such as "example.com" or
# "example.com:8080".
2007-03-04 15:32:38 -05:00
def host_with_port
2008-08-08 02:43:12 -04:00
" #{ host } #{ port_string } "
2007-03-04 15:32:38 -05:00
end
# Returns the port number of this request as an integer.
def port
2008-08-08 05:31:12 -04:00
if raw_host_with_port =~ / :( \ d+)$ /
2008-08-08 02:43:12 -04:00
$1 . to_i
else
standard_port
end
2007-03-04 15:32:38 -05:00
end
2008-09-03 12:58:47 -04:00
# Returns the standard \port number for this request's protocol.
2007-03-04 15:32:38 -05:00
def standard_port
case protocol
when 'https://' then 443
else 80
end
end
2008-09-03 12:58:47 -04:00
# Returns a \port suffix like ":8080" if the \port number of this request
# is not the default HTTP \port 80 or HTTPS \port 443.
2007-03-04 15:32:38 -05:00
def port_string
2008-08-08 05:31:12 -04:00
port == standard_port ? '' : " : #{ port } "
2007-03-04 15:32:38 -05:00
end
2008-09-03 12:58:47 -04:00
# Returns the \domain part of a \host, such as "rubyonrails.org" in "www.rubyonrails.org". You can specify
2004-12-18 12:19:15 -05:00
# a different <tt>tld_length</tt>, such as 2 to catch rubyonrails.co.uk in "www.rubyonrails.co.uk".
def domain ( tld_length = 1 )
2007-11-07 09:57:51 -05:00
return nil unless named_host? ( host )
2005-11-20 00:31:33 -05:00
2005-01-25 06:15:26 -05:00
host . split ( '.' ) . last ( 1 + tld_length ) . join ( '.' )
2004-12-18 12:19:15 -05:00
end
2008-09-03 12:58:47 -04:00
# Returns all the \subdomains as an array, so <tt>["dev", "www"]</tt> would be
# returned for "dev.www.rubyonrails.org". You can specify a different <tt>tld_length</tt>,
# such as 2 to catch <tt>["www"]</tt> instead of <tt>["www", "rubyonrails"]</tt>
2004-12-18 12:19:15 -05:00
# in "www.rubyonrails.co.uk".
def subdomains ( tld_length = 1 )
2007-11-07 09:57:51 -05:00
return [ ] unless named_host? ( host )
2005-01-25 06:15:26 -05:00
parts = host . split ( '.' )
2005-07-12 12:16:13 -04:00
parts [ 0 .. - ( tld_length + 2 ) ]
2004-12-18 12:19:15 -05:00
end
2008-09-03 12:58:47 -04:00
# Returns the query string, accounting for server idiosyncrasies.
2007-10-03 12:39:18 -04:00
def query_string
2008-12-22 19:15:08 -05:00
@env [ 'QUERY_STRING' ] . present? ? @env [ 'QUERY_STRING' ] : ( @env [ 'REQUEST_URI' ] . split ( '?' , 2 ) [ 1 ] || '' )
2007-10-03 12:39:18 -04:00
end
2008-09-03 12:58:47 -04:00
# Returns the request URI, accounting for server idiosyncrasies.
2007-01-12 02:01:39 -05:00
# WEBrick includes the full URL. IIS leaves REQUEST_URI blank.
2004-11-23 20:04:44 -05:00
def request_uri
2006-02-09 15:05:11 -05:00
if uri = @env [ 'REQUEST_URI' ]
2007-01-12 02:01:39 -05:00
# 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.
2008-08-08 05:31:12 -04:00
uri = @env [ 'PATH_INFO' ] . to_s
if script_filename = @env [ 'SCRIPT_NAME' ] . to_s . match ( %r{ [^/]+$ } )
uri = uri . sub ( / #{ script_filename } \/ / , '' )
2005-07-23 05:00:05 -04:00
end
2007-10-02 01:32:14 -04:00
2008-08-08 05:31:12 -04:00
env_qs = @env [ 'QUERY_STRING' ] . to_s
uri += " ? #{ env_qs } " unless env_qs . empty?
if uri . blank?
2007-10-02 01:32:14 -04:00
@env . delete ( 'REQUEST_URI' )
else
@env [ 'REQUEST_URI' ] = uri
end
2005-04-18 11:43:07 -04:00
end
2005-06-24 10:43:15 -04:00
end
2004-11-23 20:04:44 -05:00
2008-09-03 12:58:47 -04:00
# Returns the interpreted \path to requested resource after all the installation
# directory of this application was taken into account.
2004-11-23 20:04:44 -05:00
def path
2008-11-30 20:24:36 -05:00
path = request_uri . to_s [ / \ A[^ \ ?]* / ]
path . sub! ( / \ A #{ ActionController :: Base . relative_url_root } / , '' )
path
2004-11-23 20:04:44 -05:00
end
2008-09-03 12:58:47 -04:00
# Read the request \body. This is useful for web services that need to
2007-05-23 15:09:37 -04:00
# work with raw requests directly.
2007-03-04 15:32:38 -05:00
def raw_post
2009-01-17 21:29:50 -05:00
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' ]
2004-12-18 13:01:28 -05:00
end
2008-09-03 12:58:47 -04:00
# Returns both GET and POST \parameters in a single hash.
2007-03-04 15:32:38 -05:00
def parameters
2007-10-22 17:10:56 -04:00
@parameters || = request_parameters . merge ( query_parameters ) . update ( path_parameters ) . with_indifferent_access
2004-11-23 20:04:44 -05:00
end
2009-01-09 14:12:39 -05:00
alias_method :params , :parameters
2005-11-20 00:31:33 -05:00
2006-04-26 14:35:53 -04:00
def path_parameters = ( parameters ) #:nodoc:
2008-12-28 16:34:59 -05:00
@env [ " rack.routing_args " ] = parameters
2005-06-24 12:40:01 -04:00
@symbolized_path_parameters = @parameters = nil
end
2005-11-20 00:31:33 -05:00
2008-09-03 12:58:47 -04:00
# The same as <tt>path_parameters</tt> with explicitly symbolized keys.
2008-07-24 14:41:51 -04:00
def symbolized_path_parameters
2005-06-24 12:40:01 -04:00
@symbolized_path_parameters || = path_parameters . symbolize_keys
2005-02-14 20:45:35 -05:00
end
2004-11-23 20:04:44 -05:00
2008-09-03 12:58:47 -04:00
# Returns a hash with the \parameters used to form the \path of the request.
# Returned hash keys are strings:
2006-04-26 14:35:53 -04:00
#
2007-12-05 17:04:02 -05:00
# {'action' => 'my_action', 'controller' => 'my_controller'}
2008-09-03 12:58:47 -04:00
#
# See <tt>symbolized_path_parameters</tt> for symbolized keys.
2005-02-14 20:45:35 -05:00
def path_parameters
2008-12-28 16:34:59 -05:00
@env [ " rack.routing_args " ] || = { }
2005-02-14 20:45:35 -05:00
end
2005-06-24 10:43:15 -04:00
2009-01-17 21:29:50 -05:00
# The request body is an IO input stream. If the RAW_POST_DATA environment
# variable is already set, wrap it in a StringIO.
2008-08-08 02:43:12 -04:00
def body
2009-01-17 21:29:50 -05:00
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
def form_data?
FORM_DATA_MEDIA_TYPES . include? ( content_type . to_s )
2008-08-08 02:43:12 -04:00
end
2005-06-24 10:43:15 -04:00
2009-01-09 13:52:59 -05:00
# Override Rack's GET method to support nested query strings
def GET
2009-01-17 21:29:50 -05:00
@env [ " action_controller.request.query_parameters " ] || = UrlEncodedPairParser . parse_query_parameters ( query_string )
2007-05-15 17:36:21 -04:00
end
2009-01-09 13:52:59 -05:00
alias_method :query_parameters , :GET
2007-05-15 17:36:21 -04:00
2009-01-09 14:12:39 -05:00
# Override Rack's POST method to support nested query strings
def POST
2009-01-17 21:29:50 -05:00
@env [ " action_controller.request.request_parameters " ] || = UrlEncodedPairParser . parse_hash_parameters ( super )
2004-11-23 20:04:44 -05:00
end
2009-01-09 14:12:39 -05:00
alias_method :request_parameters , :POST
2004-11-23 20:04:44 -05:00
2008-08-08 02:43:12 -04:00
def body_stream #:nodoc:
2008-12-22 19:15:08 -05:00
@env [ 'rack.input' ]
2004-11-23 20:04:44 -05:00
end
2008-12-22 19:15:08 -05:00
def session
@env [ 'rack.session' ] || = { }
2004-11-23 20:04:44 -05:00
end
2006-02-09 15:05:11 -05:00
def session = ( session ) #:nodoc:
2009-01-05 04:10:55 -05:00
@env [ 'rack.session' ] = session
2006-02-09 15:05:11 -05:00
end
2008-12-22 19:15:08 -05:00
def reset_session
@env [ 'rack.session' ] = { }
end
def session_options
@env [ 'rack.session.options' ] || = { }
end
def session_options = ( options )
@env [ 'rack.session.options' ] = options
end
def server_port
@env [ 'SERVER_PORT' ] . to_i
2005-11-20 00:31:33 -05:00
end
2007-05-15 18:10:03 -04:00
2007-05-19 17:34:36 -04:00
private
2007-11-07 09:57:51 -05:00
def named_host? ( host )
! ( host . nil? || / \ d{1,3} \ . \ d{1,3} \ . \ d{1,3} \ . \ d{1,3}$ / . match ( host ) )
end
2007-10-06 07:40:13 -04:00
end
2007-10-02 01:32:14 -04:00
end