Class: Rack::Request

### Home Classes Methods

### In Files

- lib/rack/request.rb

### Parent

Object

### Methods

- ::new
- #GET
- #POST
- #[]
- #[]=
- #accept_encoding
- #accept_language
- #base_url
- #body
- #content_charset
- #content_length
- #content_type
- #cookies
- #delete?
- #delete_param
- #form_data?
- #fullpath
- #get?
- #head?
- #host
- #host_with_port
- #ip
- #link?
- #logger
- #media_type
- #media_type_params
- #options?
- #params
- #parse_http_accept_header
- #parse_multipart
- #parse_query
- #parseable_data?
- #patch?
- #path
- #path_info
- #path_info=
- #port
- #post?
- #put?
- #query_string
- #referer
- #referrer
- #reject_trusted_ip_addresses
- #request_method
- #scheme
- #script_name
- #script_name=
- #session
- #session_options
- #split_ip_addresses
- #ssl?
- #trace?
- #trusted_proxy?
- #unlink?
- #update_param
- #url
- #user_agent
- #values_at
- #xhr?

### Files

- KNOWN-ISSUES

### Class/Module Index

Quicksearch

- Rack
- Rack::Auth
- Rack::Auth::AbstractHandler
- Rack::Auth::AbstractRequest
- Rack::Auth::Basic
- Rack::Auth::Basic::Request
- Rack::Auth::Digest
- Rack::Auth::Digest::MD5
- Rack::Auth::Digest::Nonce
- Rack::Auth::Digest::Params
- Rack::Auth::Digest::Request
- Rack::BodyProxy
- Rack::Builder
- Rack::Cascade
- Rack::Chunked
- Rack::Chunked::Body
- Rack::CommonLogger
- Rack::ConditionalGet
- Rack::Config
- Rack::ContentLength
- Rack::ContentType
- Rack::Deflater
- Rack::Deflater::DeflateStream
- Rack::Deflater::GzipStream
- Rack::Directory
- Rack::ETag
- Rack::File
- Rack::ForwardRequest
- Rack::Handler
- Rack::Handler::CGI
- Rack::Handler::EventedMongrel
- Rack::Handler::FastCGI
- Rack::Handler::LSWS
- Rack::Handler::Mongrel
- Rack::Handler::SCGI
- Rack::Handler::SwiftipliedMongrel
- Rack::Handler::Thin
- Rack::Handler::WEBrick
- Rack::Head
- Rack::Lint
- Rack::Lobster
- Rack::Lock
- Rack::Logger
- Rack::MethodOverride
- Rack::Mime
- Rack::MockRequest
- Rack::MockRequest::FatalWarner
- Rack::MockRequest::FatalWarning
- Rack::MockResponse
- Rack::Multipart
- Rack::Multipart::Generator
- Rack::Multipart::MultipartPartLimitError
- Rack::Multipart::Parser
- Rack::Multipart::UploadedFile
- Rack::NullLogger
- Rack::Recursive
- Rack::Reloader
- Rack::Reloader::Stat
- Rack::Request
- Rack::Response
- Rack::Response::Helpers
- Rack::RewindableInput
- Rack::RewindableInput::Tempfile
- Rack::Runtime
- Rack::Sendfile
- Rack::Server
- Rack::Server::Options
- Rack::Session
- Rack::Session::Abstract
- Rack::Session::Abstract::ID
- Rack::Session::Abstract::SessionHash
- Rack::Session::Cookie
- Rack::Session::Cookie::Base64
- Rack::Session::Cookie::Base64::JSON
- Rack::Session::Cookie::Base64::Marshal
- Rack::Session::Cookie::Base64::ZipJSON
- Rack::Session::Cookie::Identity
- Rack::Session::Memcache
- Rack::Session::Pool
- Rack::ShowExceptions
- Rack::ShowStatus
- Rack::Static
- Rack::TempfileReaper
- Rack::URLMap
- Rack::Utils
- Rack::Utils::Context
- Rack::Utils::HeaderHash
- Rack::Utils::InvalidParameterError
- Rack::Utils::KeySpaceConstrainedParams
- Rack::Utils::Multipart
- Rack::Utils::OkJson
- Rack::Utils::OkJson::Error
- Rack::Utils::OkJson::Utf8Error
- Rack::Utils::ParameterTypeError
- FCGI
- FCGI::Stream
- WEBrick
- WEBrick::HTTPResponse
- Object

No matching classes.

# Rack::Request

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"]

### Constants

DEFAULT_PORTS

  Default ports depending on scheme. Used to decide whether or not to include the port in a generated URI.

FORM_DATA_MEDIA_TYPES

  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.

PARSEABLE_DATA_MEDIA_TYPES

  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

### Attributes

env[R]

The environment of the request.

### Public Class Methods

new(env) click to toggle source

    # File lib/rack/request.rb, line 16
    def initialize(env)
      @env = env
    end

### Public Instance Methods

GET() click to toggle source

Returns the data received in the query string.

    # File lib/rack/request.rb, line 187
    def GET
      if @env["rack.request.query_string"] == query_string
        @env["rack.request.query_hash"]
      else
        p = parse_query({ :query => query_string, :separator => '&;' })
        @env["rack.request.query_string"] = query_string
        @env["rack.request.query_hash"]   = p
      end
    end

POST() click to toggle source

Returns the data received in the request body.

This method support both application/x-www-form-urlencoded and multipart/form-data.

    # File lib/rack/request.rb, line 201
        def POST
          if @env["rack.input"].nil?
            raise "Missing rack.input"
          elsif @env["rack.request.form_input"].equal? @env["rack.input"]
            @env["rack.request.form_hash"]
          elsif form_data? || parseable_data?
            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!(/\0\z/, '') # performance replacement:
              form_vars.slice!(-1) if form_vars[-1] == \00
    \

              @env["rack.request.form_vars"] = form_vars
              @env["rack.request.form_hash"] = parse_query({ :query => form_vars, :separator => '&' })

              @env["rack.input"].rewind
            end
            @env["rack.request.form_input"] = @env["rack.input"]
            @env["rack.request.form_hash"]
          else
            {}
          end
        end

[](key) click to toggle source

shortcut for request.params

    # File lib/rack/request.rb, line 269
    def [](key)
      params[key.to_s]
    end

[]=(key, value) click to toggle source

shortcut for request.params = value

Note that modifications will not be persisted in the env. Use update_param or delete_param if you want to destructively modify params.

    # File lib/rack/request.rb, line 276
    def []=(key, value)
      params[key.to_s] = value
    end

accept_encoding() click to toggle source

    # File lib/rack/request.rb, line 336
    def accept_encoding
      parse_http_accept_header(@env["HTTP_ACCEPT_ENCODING"])
    end

accept_language() click to toggle source

    # File lib/rack/request.rb, line 340
    def accept_language
      parse_http_accept_header(@env["HTTP_ACCEPT_LANGUAGE"])
    end

base_url() click to toggle source

    # File lib/rack/request.rb, line 317
    def base_url
      url = "#{scheme}://#{host}"
      url << ":#{port}" if port != DEFAULT_PORTS[scheme]
      url
    end

body() click to toggle source

    # File lib/rack/request.rb, line 20
    def body;            @env["rack.input"]                       end

content_charset() click to toggle source

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 62
    def content_charset
      media_type_params['charset']
    end

content_length() click to toggle source

    # File lib/rack/request.rb, line 25
    def content_length;  @env['CONTENT_LENGTH']                   end

content_type() click to toggle source

    # File lib/rack/request.rb, line 27
    def content_type
      content_type = @env['CONTENT_TYPE']
      content_type.nil? || content_type.empty? ? nil : content_type
    end

cookies() click to toggle source

    # File lib/rack/request.rb, line 295
    def cookies
      hash   = @env["rack.request.cookie_hash"] ||= {}
      string = @env["HTTP_COOKIE"]

      return hash if string == @env["rack.request.cookie_string"]
      hash.clear

      # According to RFC 2109:
      #   If multiple cookies satisfy the criteria above, they are ordered in
      #   the Cookie header such that those with more specific Path attributes
      #   precede those with less specific.  Ordering with respect to other
      #   attributes (e.g., Domain) is unspecified.
      cookies = Utils.parse_query(string, ';,') { |s| Rack::Utils.unescape(s) rescue s }
      cookies.each { |k,v| hash[k] = Array === v ? v.first : v }
      @env["rack.request.cookie_string"] = string
      hash
    end

delete?() click to toggle source

Checks the HTTP request method (or verb) to see if it was of type DELETE

    # File lib/rack/request.rb, line 116
    def delete?;  request_method == "DELETE"  end

delete_param(k) click to toggle source

Destructively delete a parameter, whether it's in GET or POST. Returns the value of the deleted parameter.

If the parameter is in both GET and POST, the POST value takes precedence since that's how params works.

env is not touched.

    # File lib/rack/request.rb, line 262
    def delete_param(k)
      v = [ self.POST.delete(k), self.GET.delete(k) ].compact.first
      @params = nil
      v
    end

form_data?() click to toggle source

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 174
    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

fullpath() click to toggle source

    # File lib/rack/request.rb, line 332
    def fullpath
      query_string.empty? ? path : "#{path}?#{query_string}"
    end

get?() click to toggle source

Checks the HTTP request method (or verb) to see if it was of type GET

    # File lib/rack/request.rb, line 119
    def get?;     request_method == GET       end

head?() click to toggle source

Checks the HTTP request method (or verb) to see if it was of type HEAD

    # File lib/rack/request.rb, line 122
    def head?;    request_method == HEAD      end

host() click to toggle source

    # File lib/rack/request.rb, line 106
    def host
      # Remove port number.
      host_with_port.to_s.sub(/:\d+\z/, '')
    end

host_with_port() click to toggle source

    # File lib/rack/request.rb, line 84
    def 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

ip() click to toggle source

    # File lib/rack/request.rb, line 348
    def ip
      remote_addrs = split_ip_addresses(@env['REMOTE_ADDR'])
      remote_addrs = reject_trusted_ip_addresses(remote_addrs)

      return remote_addrs.first if remote_addrs.any?

      forwarded_ips = split_ip_addresses(@env['HTTP_X_FORWARDED_FOR'])

      return reject_trusted_ip_addresses(forwarded_ips).last || @env["REMOTE_ADDR"]
    end

link?() click to toggle source

Checks the HTTP request method (or verb) to see if it was of type LINK

    # File lib/rack/request.rb, line 128
    def link?;    request_method == "LINK"    end

logger() click to toggle source

    # File lib/rack/request.rb, line 34
    def logger;          @env['rack.logger']                      end

media_type() click to toggle source

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 42
    def media_type
      content_type && content_type.split(/\s*[;,]\s*/, 2).first.downcase
    end

media_type_params() click to toggle source

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 51
    def media_type_params
      return {} if content_type.nil?
      Hash[*content_type.split(/\s*[;,]\s*/)[1..-1].
        collect { |s| s.split('=', 2) }.
        map { |k,v| [k.downcase, strip_doublequotes(v)] }.flatten]
    end

options?() click to toggle source

Checks the HTTP request method (or verb) to see if it was of type OPTIONS

    # File lib/rack/request.rb, line 125
    def options?; request_method == "OPTIONS" end

params() click to toggle source

The union of GET and POST data.

Note that modifications will not be persisted in the env. Use update_param or delete_param if you want to destructively modify params.

    # File lib/rack/request.rb, line 229
    def params
      @params ||= self.GET.merge(self.POST)
    rescue EOFError
      self.GET.dup
    end

parseable_data?() click to toggle source

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 182
    def parseable_data?
      PARSEABLE_DATA_MEDIA_TYPES.include?(media_type)
    end

patch?() click to toggle source

Checks the HTTP request method (or verb) to see if it was of type PATCH

    # File lib/rack/request.rb, line 131
    def patch?;   request_method == "PATCH"   end

path() click to toggle source

    # File lib/rack/request.rb, line 328
    def path
      script_name + path_info
    end

path_info() click to toggle source

    # File lib/rack/request.rb, line 22
    def path_info;       @env[PATH_INFO].to_s                     end

path_info=(s) click to toggle source

    # File lib/rack/request.rb, line 112
    def path_info=(s);   @env["PATH_INFO"] = s.to_s               end

port() click to toggle source

    # File lib/rack/request.rb, line 92
    def port
      if port = host_with_port.split(/:/)[1]
        port.to_i
      elsif port = @env['HTTP_X_FORWARDED_PORT']
        port.to_i
      elsif @env.has_key?("HTTP_X_FORWARDED_HOST")
        DEFAULT_PORTS[scheme]
      elsif @env.has_key?("HTTP_X_FORWARDED_PROTO")
        DEFAULT_PORTS[@env['HTTP_X_FORWARDED_PROTO'].split(',')[0]]
      else
        @env["SERVER_PORT"].to_i
      end
    end

post?() click to toggle source

Checks the HTTP request method (or verb) to see if it was of type POST

    # File lib/rack/request.rb, line 134
    def post?;    request_method == "POST"    end

put?() click to toggle source

Checks the HTTP request method (or verb) to see if it was of type PUT

    # File lib/rack/request.rb, line 137
    def put?;     request_method == "PUT"     end

query_string() click to toggle source

    # File lib/rack/request.rb, line 24
    def query_string;    @env[QUERY_STRING].to_s                  end

referer() click to toggle source

the referer of the client

    # File lib/rack/request.rb, line 286
    def referer
      @env['HTTP_REFERER']
    end

Also aliased as: referrer
referrer() click to toggle source
Alias for: referer
request_method() click to toggle source

    # File lib/rack/request.rb, line 23
    def request_method;  @env["REQUEST_METHOD"]                   end

scheme() click to toggle source

    # File lib/rack/request.rb, line 66
    def scheme
      if @env['HTTPS'] == 'on'
        'https'
      elsif @env['HTTP_X_FORWARDED_SSL'] == 'on'
        'https'
      elsif @env['HTTP_X_FORWARDED_SCHEME']
        @env['HTTP_X_FORWARDED_SCHEME']
      elsif @env['HTTP_X_FORWARDED_PROTO']
        @env['HTTP_X_FORWARDED_PROTO'].split(',')[0]
      else
        @env["rack.url_scheme"]
      end
    end

script_name() click to toggle source

    # File lib/rack/request.rb, line 21
    def script_name;     @env[SCRIPT_NAME].to_s                   end

script_name=(s) click to toggle source

    # File lib/rack/request.rb, line 111
    def script_name=(s); @env["SCRIPT_NAME"] = s.to_s             end

session() click to toggle source

    # File lib/rack/request.rb, line 32
    def session;         @env['rack.session'] ||= {}              end

session_options() click to toggle source

    # File lib/rack/request.rb, line 33
    def session_options; @env['rack.session.options'] ||= {}      end

ssl?() click to toggle source

    # File lib/rack/request.rb, line 80
    def ssl?
      scheme == 'https'
    end

trace?() click to toggle source

Checks the HTTP request method (or verb) to see if it was of type TRACE

    # File lib/rack/request.rb, line 140
    def trace?;   request_method == "TRACE"   end

trusted_proxy?(ip) click to toggle source

    # File lib/rack/request.rb, line 344
    def trusted_proxy?(ip)
      ip =~ /\A127\.0\.0\.1\Z|\A(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.|\A::1\Z|\Afd[0-9a-f]{2}:.+|\Alocalhost\Z|\Aunix\Z|\Aunix:/
    end

unlink?() click to toggle source

Checks the HTTP request method (or verb) to see if it was of type UNLINK

    # File lib/rack/request.rb, line 143
    def unlink?;  request_method == "UNLINK"  end

update_param(k, v) click to toggle source

Destructively update a parameter, whether it's in GET and/or POST. Returns nil.

The parameter is updated wherever it was previous defined, so GET, POST, or both. If it wasn't previously defined, it's inserted into GET.

env is not touched.

    # File lib/rack/request.rb, line 240
    def update_param(k, v)
      found = false
      if self.GET.has_key?(k)
        found = true
        self.GET[k] = v
      end
      if self.POST.has_key?(k)
        found = true
        self.POST[k] = v
      end
      unless found
        self.GET[k] = v
      end
      @params = nil
      nil
    end

url() click to toggle source

Tries to return a remake of the original request URL as a string.

    # File lib/rack/request.rb, line 324
    def url
      base_url + fullpath
    end

user_agent() click to toggle source

    # File lib/rack/request.rb, line 291
    def user_agent
      @env['HTTP_USER_AGENT']
    end

values_at(*keys) click to toggle source

like Hash#values_at

    # File lib/rack/request.rb, line 281
    def values_at(*keys)
      keys.map{|key| params[key] }
    end

xhr?() click to toggle source

    # File lib/rack/request.rb, line 313
    def xhr?
      @env["HTTP_X_REQUESTED_WITH"] == "XMLHttpRequest"
    end

### Protected Instance Methods

parse_http_accept_header(header) click to toggle source

    # File lib/rack/request.rb, line 378
    def parse_http_accept_header(header)
      header.to_s.split(/\s*,\s*/).map do |part|
        attribute, parameters = part.split(/\s*;\s*/, 2)
        quality = 1.0
        if parameters and /\Aq=([\d.]+)/ =~ parameters
          quality = $1.to_f
        end
        [attribute, quality]
      end
    end

parse_multipart(env) click to toggle source

    # File lib/rack/request.rb, line 374
    def parse_multipart(env)
      Rack::Multipart.parse_multipart(env)
    end

parse_query(qs) click to toggle source

    # File lib/rack/request.rb, line 368
    def parse_query(qs)
      d = '&'
      qs, d = qs[:query], qs[:separator] if Hash === qs
      Utils.parse_nested_query(qs, d)
    end

reject_trusted_ip_addresses(ip_addresses) click to toggle source

    # File lib/rack/request.rb, line 364
    def reject_trusted_ip_addresses(ip_addresses)
      ip_addresses.reject { |ip| trusted_proxy?(ip) }
    end

split_ip_addresses(ip_addresses) click to toggle source

    # File lib/rack/request.rb, line 360
    def split_ip_addresses(ip_addresses)
      ip_addresses ? ip_addresses.strip.split(/[,\s]+/) : []
    end

[Validate]

Generated with the Darkfish Rdoc Generator 2.