Rack::Request provides a convenient interface to
a Rack environment. It is stateless, the
environment env
passed to the constructor will be directly
modified.
req = Rack::Request.new(env) req.post? req.params["data"]
The environment hash passed will store a reference to the Request object instantiated so that it will only instantiate if an instance of the Request object doesn’t already exist.
The set of form-data media-types. Requests that do not indicate one of the media types presents in this list will not be eligible for form-data / param parsing.
The set of media-types. Requests that do not indicate one of the media types presents in this list will not be eligible for param parsing like soap attachments or generic multiparts
The environment of the request.
# File lib/rack/request.rb, line 20 def initialize(env) @env = env end
Returns the data recieved in the query string.
# File lib/rack/request.rb, line 126 def GET if @env["rack.request.query_string"] == query_string @env["rack.request.query_hash"] else @env["rack.request.query_string"] = query_string @env["rack.request.query_hash"] = parse_query(query_string) end end
Returns the data recieved in the request body.
This method support both application/x-www-form-urlencoded and multipart/form-data.
# File lib/rack/request.rb, line 139 def POST if @env["rack.input"].nil? raise "Missing rack.input" elsif @env["rack.request.form_input"].eql? @env["rack.input"] @env["rack.request.form_hash"] elsif form_data? || parseable_data? @env["rack.request.form_input"] = @env["rack.input"] unless @env["rack.request.form_hash"] = parse_multipart(env) form_vars = @env["rack.input"].read # Fix for Safari Ajax postings that always append \0 form_vars.sub!(%r\00\\z/, '') @env["rack.request.form_vars"] = form_vars @env["rack.request.form_hash"] = parse_query(form_vars) @env["rack.input"].rewind end @env["rack.request.form_hash"] else {} end end
shortcut for request.params
# File lib/rack/request.rb, line 171 def [](key) params[key.to_s] end
shortcut for request.params = value
# File lib/rack/request.rb, line 176 def []=(key, value) params[key.to_s] = value end
# File lib/rack/request.rb, line 242 def accept_encoding @env["HTTP_ACCEPT_ENCODING"].to_s.split(%r,\s*/).map do |part| m = %r^([^\s,]+?)(?:;\s*q=(\d+(?:\.\d+)?))?$/.match(part) # From WEBrick if m [m[1], (m[2] || 1.0).to_f] else raise "Invalid value for Accept-Encoding: #{part.inspect}" end end end
# File lib/rack/request.rb, line 24 def body; @env["rack.input"] end
The character set of the request body if a “charset” media type parameter was given, or nil if no “charset” was specified. Note that, per RFC2616, text/* media types that specify no explicit charset are to be considered ISO-8859-1.
# File lib/rack/request.rb, line 63 def content_charset media_type_params['charset'] end
# File lib/rack/request.rb, line 31 def content_length; @env['CONTENT_LENGTH'] end
# File lib/rack/request.rb, line 32 def content_type; @env['CONTENT_TYPE'] end
# File lib/rack/request.rb, line 86 def delete?; request_method == "DELETE" end
Determine whether the request body contains form-data by checking the
request Content-Type for one of the media-types:
“application/x-www-form-urlencoded” or “multipart/form-data”. The
list of form-data media types can be modified through the
FORM_DATA_MEDIA_TYPES
array.
A request body is also assumed to contain form-data when no Content-Type header is provided and the #request_method is #POST.
# File lib/rack/request.rb, line 113 def form_data? type = media_type meth = env["rack.methodoverride.original_method"] || env['REQUEST_METHOD'] (meth == 'POST' && type.nil?) || FORM_DATA_MEDIA_TYPES.include?(type) end
# File lib/rack/request.rb, line 238 def fullpath query_string.empty? ? path : "#{path}?#{query_string}" end
# File lib/rack/request.rb, line 83 def get?; request_method == "GET" end
# File lib/rack/request.rb, line 87 def head?; request_method == "HEAD" end
# File lib/rack/request.rb, line 75 def host # Remove port number. host_with_port.to_s.gsub(%r:\d+\z/, '') end
# File lib/rack/request.rb, line 67 def host_with_port if forwarded = @env["HTTP_X_FORWARDED_HOST"] forwarded.split(%r,\s?/).last else @env['HTTP_HOST'] || "#{@env['SERVER_NAME'] || @env['SERVER_ADDR']}:#{@env['SERVER_PORT']}" end end
# File lib/rack/request.rb, line 254 def ip if addr = @env['HTTP_X_FORWARDED_FOR'] addr.split(',').last.strip else @env['REMOTE_ADDR'] end end
# File lib/rack/request.rb, line 35 def logger; @env['rack.logger'] end
The media type (type/subtype) portion of the CONTENT_TYPE header without any media type parameters. e.g., when CONTENT_TYPE is “text/plain;charset=utf-8”, the media-type is “text/plain”.
For more information on the use of media types in HTTP, see: www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7
# File lib/rack/request.rb, line 43 def media_type content_type && content_type.split(%r\s*[;,]\s*/, 2).first.downcase end
The media type parameters provided in CONTENT_TYPE as a Hash, or an empty Hash if no CONTENT_TYPE or media-type parameters were provided. e.g., when the CONTENT_TYPE is “text/plain;charset=utf-8”, this method responds with the following Hash:
{ 'charset' => 'utf-8' }
# File lib/rack/request.rb, line 52 def media_type_params return {} if content_type.nil? content_type.split(%r\s*[;,]\s*/)[1..-1]. collect { |s| s.split('=', 2) }. inject({}) { |hash,(k,v)| hash[k.downcase] = v ; hash } end
Determine whether the request body contains data by checking the request #media_type against registered parse-data media-types
# File lib/rack/request.rb, line 121 def parseable_data? PARSEABLE_DATA_MEDIA_TYPES.include?(media_type) end
# File lib/rack/request.rb, line 234 def path script_name + path_info end
# File lib/rack/request.rb, line 27 def path_info; @env["PATH_INFO"].to_s end
# File lib/rack/request.rb, line 81 def path_info=(s); @env["PATH_INFO"] = s.to_s end
# File lib/rack/request.rb, line 28 def port; @env["SERVER_PORT"].to_i end
# File lib/rack/request.rb, line 84 def post?; request_method == "POST" end
# File lib/rack/request.rb, line 85 def put?; request_method == "PUT" end
# File lib/rack/request.rb, line 30 def query_string; @env["QUERY_STRING"].to_s end
the referer of the client or ‘/’
# File lib/rack/request.rb, line 186 def referer @env['HTTP_REFERER'] || '/' end
# File lib/rack/request.rb, line 29 def request_method; @env["REQUEST_METHOD"] end
# File lib/rack/request.rb, line 25 def scheme; @env["rack.url_scheme"] end
# File lib/rack/request.rb, line 26 def script_name; @env["SCRIPT_NAME"].to_s end
# File lib/rack/request.rb, line 80 def script_name=(s); @env["SCRIPT_NAME"] = s.to_s end
# File lib/rack/request.rb, line 33 def session; @env['rack.session'] ||= {} end
# File lib/rack/request.rb, line 34 def session_options; @env['rack.session.options'] ||= {} end
Tries to return a remake of the original request URL as a string.
# File lib/rack/request.rb, line 220 def url url = scheme + "://" url << host if scheme == "https" && port != 443 || scheme == "http" && port != 80 url << ":#{port}" end url << fullpath url end
# File lib/rack/request.rb, line 191 def user_agent @env['HTTP_USER_AGENT'] end
like Hash#values_at
# File lib/rack/request.rb, line 181 def values_at(*keys) keys.map{|key| params[key] } end
# File lib/rack/request.rb, line 215 def xhr? @env["HTTP_X_REQUESTED_WITH"] == "XMLHttpRequest" end
# File lib/rack/request.rb, line 267 def parse_multipart(env) Utils::Multipart.parse_multipart(env) end
# File lib/rack/request.rb, line 263 def parse_query(qs) Utils.parse_nested_query(qs) end