An HTTP request. This is consumed by service and do_* methods in WEBrick
servlets
The complete request line such as:
GET / HTTP/1.1
The request method, GET, POST, PUT, etc.
The unparsed URI
of the request
The HTTP version of the request
The parsed URI
of the request
The request path
The script name (CGI
variable)
The query from the URI
of the request
The raw header of the request
The parsed header of the request
The parsed request cookies
The Accept header value
The Accept-Charset header value
The Accept-Encoding header value
The Accept-Language header value
The socket address of the server
The socket address of the client
Hash
of request attributes
Is this a keep-alive connection?
The local time this request was received
HTTP request SSL cipher
HTTP request server certificate
HTTP request client certificate
# File tmp/rubies/ruby-2.3.8/lib/webrick/httprequest.rb, line 152
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
Creates a new HTTP request. WEBrick::Config::HTTP is the default configuration.
# File tmp/rubies/ruby-2.3.8/lib/webrick/httprequest.rb, line 287
def [](header_name)
if @header
value = @header[header_name.downcase]
value.empty? ? nil : value.join(", ")
end
end
Retrieves header_name
# File tmp/rubies/ruby-2.3.8/lib/webrick/httprequest.rb, line 254
def body(&block) # :yields: body_chunk
block ||= Proc.new{|chunk| @body << chunk }
read_body(@socket, block)
@body.empty? ? nil : @body
end
Returns the request body.
# File tmp/rubies/ruby-2.3.8/lib/webrick/httprequest.rb, line 273
def content_length
return Integer(self['content-length'])
end
The content-length header
# File tmp/rubies/ruby-2.3.8/lib/webrick/httprequest.rb, line 280
def content_type
return self['content-type']
end
The content-type header
# File tmp/rubies/ruby-2.3.8/lib/webrick/httprequest.rb, line 297
def each
if @header
@header.each{|k, v|
value = @header[k]
yield(k, value.empty? ? nil : value.join(", "))
}
end
end
Iterates over the request headers
# File tmp/rubies/ruby-2.3.8/lib/webrick/httprequest.rb, line 309
def host
return @forwarded_host || @host
end
The host this request is for
# File tmp/rubies/ruby-2.3.8/lib/webrick/httprequest.rb, line 344
def keep_alive?
@keep_alive
end
Should the connection this request was made on be kept alive?
# File tmp/rubies/ruby-2.3.8/lib/webrick/httprequest.rb, line 376
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
This method provides the metavariables defined by the revision 3 of “The WWW Common Gateway Interface Version 1.1” To browse the current document of CGI
Version 1.1, see below: tools.ietf.org/html/rfc3875
# File tmp/rubies/ruby-2.3.8/lib/webrick/httprequest.rb, line 192
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
Parses a request from socket
. This is called internally by WEBrick::HTTPServer
.
# File tmp/rubies/ruby-2.3.8/lib/webrick/httprequest.rb, line 316
def port
return @forwarded_port || @port
end
The port this request is for
# File tmp/rubies/ruby-2.3.8/lib/webrick/httprequest.rb, line 263
def query
unless @query
parse_query()
end
@query
end
Request query as a Hash
# File tmp/rubies/ruby-2.3.8/lib/webrick/httprequest.rb, line 330
def remote_ip
return self["client-ip"] || @forwarded_for || @peeraddr[3]
end
The client’s IP address
# File tmp/rubies/ruby-2.3.8/lib/webrick/httprequest.rb, line 323
def server_name
return @forwarded_server || @config[:ServerName]
end
The server name this request is for
# File tmp/rubies/ruby-2.3.8/lib/webrick/httprequest.rb, line 337
def ssl?
return @request_uri.scheme == "https"
end
Is this an SSL request?