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



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

def cipher
  @cipher
end

#client_certObject (readonly)

HTTP request client certificate



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

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



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

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



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

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

#body_readerObject

Prepares the HTTPRequest object for use as the source for IO.copy_stream



264
265
266
267
268
269
270
271
272
273
274
# File 'lib/webrick/httprequest.rb', line 264

def body_reader
  @body_tmp = []
  @body_rd = Fiber.new do
    body do |buf|
      @body_tmp << buf
      Fiber.yield
    end
  end
  @body_rd.resume # grab the first chunk and yield
  self
end

#content_lengthObject

The content-length header



299
300
301
# File 'lib/webrick/httprequest.rb', line 299

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

#content_typeObject

The content-type header



306
307
308
# File 'lib/webrick/httprequest.rb', line 306

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



323
324
325
326
327
328
329
330
# File 'lib/webrick/httprequest.rb', line 323

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



385
386
387
388
389
390
391
392
393
394
395
# File 'lib/webrick/httprequest.rb', line 385

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



335
336
337
# File 'lib/webrick/httprequest.rb', line 335

def host
  return @forwarded_host || @host
end

#keep_alive?Boolean

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

Returns:

  • (Boolean)


370
371
372
# File 'lib/webrick/httprequest.rb', line 370

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



402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
# File 'lib/webrick/httprequest.rb', line 402

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



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

alias orig_meta_vars meta_vars

#orig_parseObject

:stopdoc:



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

alias orig_parse parse

#orig_parse_uriObject



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

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



342
343
344
# File 'lib/webrick/httprequest.rb', line 342

def port
  return @forwarded_port || @port
end

#queryObject

Request query as a Hash



289
290
291
292
293
294
# File 'lib/webrick/httprequest.rb', line 289

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

#readpartial(size, buf = ''.b) ⇒ Object

for IO.copy_stream. Note: we may return a larger string than size here; but IO.copy_stream does not care.



278
279
280
281
282
283
284
# File 'lib/webrick/httprequest.rb', line 278

def readpartial(size, buf = ''.b) # :nodoc
  res = @body_tmp.shift or raise EOFError, 'end of file reached'
  buf.replace(res)
  res.clear
  @body_rd.resume # get more chunks
  buf
end

#remote_ipObject

The client’s IP address



356
357
358
# File 'lib/webrick/httprequest.rb', line 356

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

#server_nameObject

The server name this request is for



349
350
351
# File 'lib/webrick/httprequest.rb', line 349

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

#ssl?Boolean

Is this an SSL request?

Returns:

  • (Boolean)


363
364
365
# File 'lib/webrick/httprequest.rb', line 363

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

#to_sObject

:nodoc:



374
375
376
377
378
379
380
# File 'lib/webrick/httprequest.rb', line 374

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