Extended maintenance of Ruby 1.9.3 ended on February 23, 2015. Read more

In Files

  • webrick/httprequest.rb
  • webrick/https.rb

Class/Module Index [+]

Quicksearch

WEBrick::HTTPRequest

An HTTP request.

Attributes

addr[R]
attributes[R]
cipher[R]
client_cert[R]
keep_alive[R]
peeraddr[R]
request_time[R]
server_cert[R]
user[RW]

Public Class Methods

new(config) click to toggle source
 
               # File webrick/httprequest.rb, line 45
def initialize(config)
  @config = config
  @buffer_size = @config[:InputBufferSize]
  @logger = config[:Logger]

  @request_line = @request_method =
    @unparsed_uri = @http_version = nil

  @request_uri = @host = @port = @path = nil
  @script_name = @path_info = nil
  @query_string = nil
  @query = nil
  @form_data = nil

  @raw_header = Array.new
  @header = nil
  @cookies = []
  @accept = []
  @accept_charset = []
  @accept_encoding = []
  @accept_language = []
  @body = ""

  @addr = @peeraddr = nil
  @attributes = {}
  @user = nil
  @keep_alive = false
  @request_time = nil

  @remaining_size = nil
  @socket = nil

  @forwarded_proto = @forwarded_host = @forwarded_port =
    @forwarded_server = @forwarded_for = nil
end
            

Public Instance Methods

[](header_name) click to toggle source

Retrieves header_name

 
               # File webrick/httprequest.rb, line 171
def [](header_name)
  if @header
    value = @header[header_name.downcase]
    value.empty? ? nil : value.join(", ")
  end
end
            
body(&block) click to toggle source
 
               # File webrick/httprequest.rb, line 138
def body(&block)
  block ||= Proc.new{|chunk| @body << chunk }
  read_body(@socket, block)
  @body.empty? ? nil : @body
end
            
content_length() click to toggle source

The content-length header

 
               # File webrick/httprequest.rb, line 157
def content_length
  return Integer(self['content-length'])
end
            
content_type() click to toggle source

The content-type header

 
               # File webrick/httprequest.rb, line 164
def content_type
  return self['content-type']
end
            
continue() click to toggle source

Generate HTTP/1.1 100 continue response if the client expects it, otherwise does nothing.

 
               # File webrick/httprequest.rb, line 131
def continue
  if self['expect'] == '100-continue' && @config[:HTTPVersion] >= "1.1"
    @socket << "HTTP/#{@config[:HTTPVersion]} 100 continue#{CRLF}#{CRLF}"
    @header.delete('expect')
  end
end
            
each() click to toggle source

Iterates over the request headers

 
               # File webrick/httprequest.rb, line 181
def each
  if @header
    @header.each{|k, v|
      value = @header[k]
      yield(k, value.empty? ? nil : value.join(", "))
    }
  end
end
            
fixup() click to toggle source
 
               # File webrick/httprequest.rb, line 240
def fixup()
  begin
    body{|chunk| }   # read remaining body
  rescue HTTPStatus::Error => ex
    @logger.error("HTTPRequest#fixup: #{ex.class} occured.")
    @keep_alive = false
  rescue => ex
    @logger.error(ex)
    @keep_alive = false
  end
end
            
host() click to toggle source

The host this request is for

 
               # File webrick/httprequest.rb, line 193
def host
  return @forwarded_host || @host
end
            
keep_alive?() click to toggle source

Should the connection this request was made on be kept alive?

 
               # File webrick/httprequest.rb, line 228
def keep_alive?
  @keep_alive
end
            
meta_vars() click to toggle source

This method provides the metavariables defined by the revision 3 of “The WWW Common Gateway Interface Version 1.1” Web.Golux.Com/coar/cgi/

 
               # File webrick/httprequest.rb, line 256
def meta_vars
  meta = Hash.new

  cl = self["Content-Length"]
  ct = self["Content-Type"]
  meta["CONTENT_LENGTH"]    = cl if cl.to_i > 0
  meta["CONTENT_TYPE"]      = ct.dup if ct
  meta["GATEWAY_INTERFACE"] = "CGI/1.1"
  meta["PATH_INFO"]         = @path_info ? @path_info.dup : ""
 #meta["PATH_TRANSLATED"]   = nil      # no plan to be provided
  meta["QUERY_STRING"]      = @query_string ? @query_string.dup : ""
  meta["REMOTE_ADDR"]       = @peeraddr[3]
  meta["REMOTE_HOST"]       = @peeraddr[2]
 #meta["REMOTE_IDENT"]      = nil      # no plan to be provided
  meta["REMOTE_USER"]       = @user
  meta["REQUEST_METHOD"]    = @request_method.dup
  meta["REQUEST_URI"]       = @request_uri.to_s
  meta["SCRIPT_NAME"]       = @script_name.dup
  meta["SERVER_NAME"]       = @host
  meta["SERVER_PORT"]       = @port.to_s
  meta["SERVER_PROTOCOL"]   = "HTTP/" + @config[:HTTPVersion].to_s
  meta["SERVER_SOFTWARE"]   = @config[:ServerSoftware].dup

  self.each{|key, val|
    next if /^content-type$/i =~ key
    next if /^content-length$/i =~ key
    name = "HTTP_" + key
    name.gsub!(/-/o, "_")
    name.upcase!
    meta[name] = val
  }

  meta
end
            
Also aliased as: orig_meta_vars
orig_meta_vars() click to toggle source
Alias for: meta_vars
orig_parse(socket=nil) click to toggle source
Alias for: parse
orig_parse_uri(str, scheme="http") click to toggle source
Alias for: parse_uri
parse(socket=nil) click to toggle source
 
               # File webrick/httprequest.rb, line 81
def parse(socket=nil)
  @socket = socket
  begin
    @peeraddr = socket.respond_to?(:peeraddr) ? socket.peeraddr : []
    @addr = socket.respond_to?(:addr) ? socket.addr : []
  rescue Errno::ENOTCONN
    raise HTTPStatus::EOFError
  end

  read_request_line(socket)
  if @http_version.major > 0
    read_header(socket)
    @header['cookie'].each{|cookie|
      @cookies += Cookie::parse(cookie)
    }
    @accept = HTTPUtils.parse_qvalues(self['accept'])
    @accept_charset = HTTPUtils.parse_qvalues(self['accept-charset'])
    @accept_encoding = HTTPUtils.parse_qvalues(self['accept-encoding'])
    @accept_language = HTTPUtils.parse_qvalues(self['accept-language'])
  end
  return if @request_method == "CONNECT"
  return if @unparsed_uri == "*"

  begin
    setup_forwarded_info
    @request_uri = parse_uri(@unparsed_uri)
    @path = HTTPUtils::unescape(@request_uri.path)
    @path = HTTPUtils::normalize_path(@path)
    @host = @request_uri.host
    @port = @request_uri.port
    @query_string = @request_uri.query
    @script_name = ""
    @path_info = @path.dup
  rescue
    raise HTTPStatus::BadRequest, "bad URI `#{@unparsed_uri}'."
  end

  if /close/io =~ self["connection"]
    @keep_alive = false
  elsif /keep-alive/io =~ self["connection"]
    @keep_alive = true
  elsif @http_version < "1.1"
    @keep_alive = false
  else
    @keep_alive = true
  end
end
            
Also aliased as: orig_parse
port() click to toggle source

The port this request is for

 
               # File webrick/httprequest.rb, line 200
def port
  return @forwarded_port || @port
end
            
query() click to toggle source

Request query as a Hash

 
               # File webrick/httprequest.rb, line 147
def query
  unless @query
    parse_query()
  end
  @query
end
            
remote_ip() click to toggle source

The client’s IP address

 
               # File webrick/httprequest.rb, line 214
def remote_ip
  return self["client-ip"] || @forwarded_for || @peeraddr[3]
end
            
server_name() click to toggle source

The server name this request is for

 
               # File webrick/httprequest.rb, line 207
def server_name
  return @forwarded_server || @config[:ServerName]
end
            
ssl?() click to toggle source

Is this an SSL request?

 
               # File webrick/httprequest.rb, line 221
def ssl?
  return @request_uri.scheme == "https"
end
            

Header and entity body ↑ top

Attributes

accept[R]
accept_charset[R]
accept_encoding[R]
accept_language[R]
cookies[R]
header[R]
raw_header[R]

Request line ↑ top

Attributes

http_version[R]
request_line[R]
request_method[R]
unparsed_uri[R]

Request-URI ↑ top

Attributes

path[R]
path_info[RW]
query_string[RW]
request_uri[R]
script_name[RW]

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.