Class: WEBrick::HTTPRequest

Inherits:
Object
  • Object
show all
Defined in:
lib/webrick/https.rb,
lib/webrick/httprequest.rb

Overview

An HTTP request. This is consumed by service and do_* methods in WEBrick servlets

Constant Summary collapse

BODY_CONTAINABLE_METHODS =

:nodoc:

[ "POST", "PUT" ]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ HTTPRequest

Creates a new HTTP request. WEBrick::Config::HTTP is the default configuration.



152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File '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

Instance Attribute Details

#acceptObject (readonly)

The Accept header value



99
100
101
# File 'lib/webrick/httprequest.rb', line 99

def accept
  @accept
end

#accept_charsetObject (readonly)

The Accept-Charset header value



104
105
106
# File 'lib/webrick/httprequest.rb', line 104

def accept_charset
  @accept_charset
end

#accept_encodingObject (readonly)

The Accept-Encoding header value



109
110
111
# File 'lib/webrick/httprequest.rb', line 109

def accept_encoding
  @accept_encoding
end

#accept_languageObject (readonly)

The Accept-Language header value



114
115
116
# File 'lib/webrick/httprequest.rb', line 114

def accept_language
  @accept_language
end

#addrObject (readonly)

The socket address of the server



126
127
128
# File 'lib/webrick/httprequest.rb', line 126

def addr
  @addr
end

#attributesObject (readonly)

Hash of request attributes



136
137
138
# File 'lib/webrick/httprequest.rb', line 136

def attributes
  @attributes
end

#cipherObject (readonly)

HTTP request SSL cipher



28
29
30
# File 'lib/webrick/https.rb', line 28

def cipher
  @cipher
end

#client_certObject (readonly)

HTTP request client certificate



38
39
40
# File 'lib/webrick/https.rb', line 38

def client_cert
  @client_cert
end

#cookiesObject (readonly)

The parsed request cookies



94
95
96
# File 'lib/webrick/httprequest.rb', line 94

def cookies
  @cookies
end

#headerObject (readonly)

The parsed header of the request



89
90
91
# File 'lib/webrick/httprequest.rb', line 89

def header
  @header
end

#http_versionObject (readonly)

The HTTP version of the request



50
51
52
# File 'lib/webrick/httprequest.rb', line 50

def http_version
  @http_version
end

#keep_aliveObject (readonly)

Is this a keep-alive connection?



141
142
143
# File 'lib/webrick/httprequest.rb', line 141

def keep_alive
  @keep_alive
end

#pathObject (readonly)

The request path



62
63
64
# File 'lib/webrick/httprequest.rb', line 62

def path
  @path
end

#path_infoObject

The path info (CGI variable)



72
73
74
# File 'lib/webrick/httprequest.rb', line 72

def path_info
  @path_info
end

#peeraddrObject (readonly)

The socket address of the client



131
132
133
# File 'lib/webrick/httprequest.rb', line 131

def peeraddr
  @peeraddr
end

#query_stringObject

The query from the URI of the request



77
78
79
# File 'lib/webrick/httprequest.rb', line 77

def query_string
  @query_string
end

#raw_headerObject (readonly)

The raw header of the request



84
85
86
# File 'lib/webrick/httprequest.rb', line 84

def raw_header
  @raw_header
end

#request_lineObject (readonly)

The complete request line such as:

GET / HTTP/1.1


35
36
37
# File 'lib/webrick/httprequest.rb', line 35

def request_line
  @request_line
end

#request_methodObject (readonly)

The request method, GET, POST, PUT, etc.



40
41
42
# File 'lib/webrick/httprequest.rb', line 40

def request_method
  @request_method
end

#request_timeObject (readonly)

The local time this request was received



146
147
148
# File 'lib/webrick/httprequest.rb', line 146

def request_time
  @request_time
end

#request_uriObject (readonly)

The parsed URI of the request



57
58
59
# File 'lib/webrick/httprequest.rb', line 57

def request_uri
  @request_uri
end

#script_nameObject

The script name (CGI variable)



67
68
69
# File 'lib/webrick/httprequest.rb', line 67

def script_name
  @script_name
end

#server_certObject (readonly)

HTTP request server certificate



33
34
35
# File 'lib/webrick/https.rb', line 33

def server_cert
  @server_cert
end

#unparsed_uriObject (readonly)

The unparsed URI of the request



45
46
47
# File 'lib/webrick/httprequest.rb', line 45

def unparsed_uri
  @unparsed_uri
end

#userObject

The remote user (CGI variable)



121
122
123
# File 'lib/webrick/httprequest.rb', line 121

def user
  @user
end

Instance Method Details

#[](header_name) ⇒ Object

Retrieves header_name



287
288
289
290
291
292
# File 'lib/webrick/httprequest.rb', line 287

def [](header_name)
  if @header
    value = @header[header_name.downcase]
    value.empty? ? nil : value.join(", ")
  end
end

#body(&block) ⇒ Object

Returns the request body.



254
255
256
257
258
# File '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

#content_lengthObject

The content-length header



273
274
275
# File 'lib/webrick/httprequest.rb', line 273

def content_length
  return Integer(self['content-length'])
end

#content_typeObject

The content-type header



280
281
282
# File 'lib/webrick/httprequest.rb', line 280

def content_type
  return self['content-type']
end

#continueObject

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



244
245
246
247
248
249
# File 'lib/webrick/httprequest.rb', line 244

def continue # :nodoc:
  if self['expect'] == '100-continue' && @config[:HTTPVersion] >= "1.1"
    @socket << "HTTP/#{@config[:HTTPVersion]} 100 continue#{CRLF}#{CRLF}"
    @header.delete('expect')
  end
end

#eachObject

Iterates over the request headers



297
298
299
300
301
302
303
304
# File '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

#fixupObject

Consumes any remaining body and updates keep-alive status



359
360
361
362
363
364
365
366
367
368
369
# File 'lib/webrick/httprequest.rb', line 359

def fixup() # :nodoc:
  begin
    body{|chunk| }   # read remaining body
  rescue HTTPStatus::Error => ex
    @logger.error("HTTPRequest#fixup: #{ex.class} occurred.")
    @keep_alive = false
  rescue => ex
    @logger.error(ex)
    @keep_alive = false
  end
end

#hostObject

The host this request is for



309
310
311
# File 'lib/webrick/httprequest.rb', line 309

def host
  return @forwarded_host || @host
end

#keep_alive?Boolean

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

Returns:

  • (Boolean)


344
345
346
# File 'lib/webrick/httprequest.rb', line 344

def keep_alive?
  @keep_alive
end

#meta_varsObject

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



376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
# File 'lib/webrick/httprequest.rb', line 376

def meta_vars
  meta = orig_meta_vars
  if server_cert
    meta["HTTPS"] = "on"
    meta["SSL_SERVER_CERT"] = @server_cert.to_pem
    meta["SSL_CLIENT_CERT"] = @client_cert ? @client_cert.to_pem : ""
    if @client_cert_chain
      @client_cert_chain.each_with_index{|cert, i|
        meta["SSL_CLIENT_CERT_CHAIN_#{i}"] = cert.to_pem
      }
    end
    meta["SSL_CIPHER"] = @cipher[0]
    meta["SSL_PROTOCOL"] = @cipher[1]
    meta["SSL_CIPHER_USEKEYSIZE"] = @cipher[2].to_s
    meta["SSL_CIPHER_ALGKEYSIZE"] = @cipher[3].to_s
  end
  meta
end

#orig_meta_varsObject



64
# File 'lib/webrick/https.rb', line 64

alias orig_meta_vars meta_vars

#orig_parseObject

:stopdoc:



42
# File 'lib/webrick/https.rb', line 42

alias orig_parse parse

#orig_parse_uriObject



54
# File 'lib/webrick/https.rb', line 54

alias orig_parse_uri parse_uri

#parse(socket = nil) ⇒ Object

Parses a request from socket. This is called internally by WEBrick::HTTPServer.



192
193
194
195
196
197
198
199
200
# File 'lib/webrick/httprequest.rb', line 192

def parse(socket=nil)
  if socket.respond_to?(:cert)
    @server_cert = socket.cert || @config[:SSLCertificate]
    @client_cert = socket.peer_cert
    @client_cert_chain = socket.peer_cert_chain
    @cipher      = socket.cipher
  end
  orig_parse(socket)
end

#portObject

The port this request is for



316
317
318
# File 'lib/webrick/httprequest.rb', line 316

def port
  return @forwarded_port || @port
end

#queryObject

Request query as a Hash



263
264
265
266
267
268
# File 'lib/webrick/httprequest.rb', line 263

def query
  unless @query
    parse_query()
  end
  @query
end

#remote_ipObject

The client’s IP address



330
331
332
# File 'lib/webrick/httprequest.rb', line 330

def remote_ip
  return self["client-ip"] || @forwarded_for || @peeraddr[3]
end

#server_nameObject

The server name this request is for



323
324
325
# File 'lib/webrick/httprequest.rb', line 323

def server_name
  return @forwarded_server || @config[:ServerName]
end

#ssl?Boolean

Is this an SSL request?

Returns:

  • (Boolean)


337
338
339
# File 'lib/webrick/httprequest.rb', line 337

def ssl?
  return @request_uri.scheme == "https"
end

#to_sObject

:nodoc:



348
349
350
351
352
353
354
# File 'lib/webrick/httprequest.rb', line 348

def to_s # :nodoc:
  ret = @request_line.dup
  @raw_header.each{|line| ret << line }
  ret << CRLF
  ret << body if body
  ret
end