Module: Net::HTTPHeader
- Defined in:
- lib/net/http.rb
Overview
Header module.
Provides access to @header in the mixed-into class as a hash-like object, except with case-insensitive keys. Also provides methods for accessing commonly-used header values in a more convenient format.
Instance Method Summary (collapse)
-
- (Object) [](key)
Returns the header field corresponding to the case-insensitive key.
-
- (Object) []=(key, val)
Sets the header field corresponding to the case-insensitive key.
-
- (Object) add_field(key, val)
- Ruby 1.8.3
-
Adds header field instead of replace.
-
- (Object) basic_auth(account, password)
Set the Authorization: header for "Basic" authorization.
-
- (Boolean) chunked?
Returns "true" if the "transfer-encoding" header is present and set to "chunked".
- - (Boolean) connection_close?
- - (Boolean) connection_keep_alive?
-
- (Object) content_length
Returns an Integer object which represents the Content-Length: header field or nil if that field is not provided.
- - (Object) content_length=(len)
-
- (Object) content_range
Returns a Range object which represents Content-Range: header field.
-
- (Object) content_type
Returns a content type string such as "text/html".
-
- (Object) delete(key)
Removes a header field.
-
- (Object) each_capitalized
(also: #canonical_each)
As for #each_header, except the keys are provided in capitalized form.
-
- (Object) each_capitalized_name
Iterates for each capitalized header names.
-
- (Object) each_header
(also: #each)
Iterates for each header names and values.
-
- (Object) each_name(&block)
(also: #each_key)
Iterates for each header names.
-
- (Object) each_value
Iterates for each header values.
-
- (Object) fetch(key, *args, &block)
Returns the header field corresponding to the case-insensitive key.
-
- (Object) get_fields(key)
- Ruby 1.8.3
-
Returns an array of header field strings corresponding to the case-insensitive key.
- - (Object) initialize_http_header(initheader)
-
- (Boolean) key?(key)
true if key header exists.
-
- (Object) main_type
Returns a content type string such as "text".
-
- (Object) proxy_basic_auth(account, password)
Set Proxy-Authorization: header for "Basic" authorization.
-
- (Object) range
Returns an Array of Range objects which represents Range: header field, or nil if there is no such header.
-
- (Object) range_length
The length of the range represented in Content-Range: header.
-
- (Object) set_content_type(type, params = {})
(also: #content_type=)
Set Content-Type: header field by type and params.
-
- (Object) set_form_data(params, sep = '&')
(also: #form_data=)
Set header fields and a body from HTML form data.
-
- (Object) set_range(r, e = nil)
(also: #range=)
Set Range: header from Range (arg r) or beginning index and length from it (arg idx&len).
-
- (Object) size
(also: #length)
:nodoc: obsolete.
-
- (Object) sub_type
Returns a content type string such as "html".
-
- (Object) to_hash
Returns a Hash consist of header names and values.
-
- (Object) type_params
Returns content type parameters as a Hash as like => "iso-2022-jp".
Instance Method Details
- (Object) [](key)
Returns the header field corresponding to the case-insensitive key. For example, a key of "Content-Type" might return "text/html"
1310 1311 1312 1313 |
# File 'lib/net/http.rb', line 1310 def [](key) a = @header[key.downcase] or return nil a.join(', ') end |
- (Object) []=(key, val)
Sets the header field corresponding to the case-insensitive key.
1316 1317 1318 1319 1320 1321 1322 |
# File 'lib/net/http.rb', line 1316 def []=(key, val) unless val @header.delete key.downcase return val end @header[key.downcase] = [val] end |
- (Object) add_field(key, val)
- Ruby 1.8.3
-
Adds header field instead of replace. Second argument val must be a String. See also #[]=, #[] and #get_fields.
request.add_field 'X-My-Header', 'a' p request['X-My-Header'] #=> "a" p request.get_fields('X-My-Header') #=> ["a"] request.add_field 'X-My-Header', 'b' p request['X-My-Header'] #=> "a, b" p request.get_fields('X-My-Header') #=> ["a", "b"] request.add_field 'X-My-Header', 'c' p request['X-My-Header'] #=> "a, b, c" p request.get_fields('X-My-Header') #=> ["a", "b", "c"]
1339 1340 1341 1342 1343 1344 1345 |
# File 'lib/net/http.rb', line 1339 def add_field(key, val) if @header.key?(key.downcase) @header[key.downcase].push val else @header[key.downcase] = [val] end end |
- (Object) basic_auth(account, password)
Set the Authorization: header for "Basic" authorization.
1612 1613 1614 |
# File 'lib/net/http.rb', line 1612 def basic_auth(account, password) @header['authorization'] = [basic_encode(account, password)] end |
- (Boolean) chunked?
Returns "true" if the "transfer-encoding" header is present and set to "chunked". This is an HTTP/1.1 feature, allowing the the content to be sent in "chunks" without at the outset stating the entire content length.
1512 1513 1514 1515 1516 |
# File 'lib/net/http.rb', line 1512 def chunked? return false unless @header['transfer-encoding'] field = self['Transfer-Encoding'] (/(?:\A|[^\-\w])chunked(?![\-\w])/i =~ field) ? true : false end |
- (Boolean) connection_close?
1626 1627 1628 1629 |
# File 'lib/net/http.rb', line 1626 def connection_close? tokens(@header['connection']).include?('close') or tokens(@header['proxy-connection']).include?('close') end |
- (Boolean) connection_keep_alive?
1631 1632 1633 1634 |
# File 'lib/net/http.rb', line 1631 def connection_keep_alive? tokens(@header['connection']).include?('keep-alive') or tokens(@header['proxy-connection']).include?('keep-alive') end |
- (Object) content_length
Returns an Integer object which represents the Content-Length: header field or nil if that field is not provided.
1493 1494 1495 1496 1497 1498 |
# File 'lib/net/http.rb', line 1493 def content_length return nil unless key?('Content-Length') len = self['Content-Length'].slice(/\d+/) or raise HTTPHeaderSyntaxError, 'wrong Content-Length format' len.to_i end |
- (Object) content_length=(len)
1500 1501 1502 1503 1504 1505 1506 |
# File 'lib/net/http.rb', line 1500 def content_length=(len) unless len @header.delete 'content-length' return nil end @header['content-length'] = [len.to_i.to_s] end |
- (Object) content_range
Returns a Range object which represents Content-Range: header field. This indicates, for a partial entity body, where this fragment fits inside the full entity body, as range of byte offsets.
1521 1522 1523 1524 1525 1526 |
# File 'lib/net/http.rb', line 1521 def content_range return nil unless @header['content-range'] m = %r<bytes\s+(\d+)-(\d+)/(\d+|\*)>i.match(self['Content-Range']) or raise HTTPHeaderSyntaxError, 'wrong Content-Range format' m[1].to_i .. m[2].to_i end |
- (Object) content_type
Returns a content type string such as "text/html". This method returns nil if Content-Type: header field does not exist.
1536 1537 1538 1539 1540 1541 1542 |
# File 'lib/net/http.rb', line 1536 def content_type return nil unless main_type() if sub_type() then "#{main_type()}/#{sub_type()}" else main_type() end end |
- (Object) delete(key)
Removes a header field.
1407 1408 1409 |
# File 'lib/net/http.rb', line 1407 def delete(key) @header.delete(key.downcase) end |
- (Object) each_capitalized Also known as: canonical_each
As for #each_header, except the keys are provided in capitalized form.
1422 1423 1424 1425 1426 1427 |
# File 'lib/net/http.rb', line 1422 def each_capitalized block_given? or return enum_for(__method__) @header.each do |k,v| yield capitalize(k), v.join(', ') end end |
- (Object) each_capitalized_name
Iterates for each capitalized header names.
1391 1392 1393 1394 1395 1396 |
# File 'lib/net/http.rb', line 1391 def each_capitalized_name #:yield: +key+ block_given? or return enum_for(__method__) @header.each_key do |k| yield capitalize(k) end end |
- (Object) each_header Also known as: each
Iterates for each header names and values.
1373 1374 1375 1376 1377 1378 |
# File 'lib/net/http.rb', line 1373 def each_header #:yield: +key+, +value+ block_given? or return enum_for(__method__) @header.each do |k,va| yield k, va.join(', ') end end |
- (Object) each_name(&block) Also known as: each_key
Iterates for each header names.
1383 1384 1385 1386 |
# File 'lib/net/http.rb', line 1383 def each_name(&block) #:yield: +key+ block_given? or return enum_for(__method__) @header.each_key(&block) end |
- (Object) each_value
Iterates for each header values.
1399 1400 1401 1402 1403 1404 |
# File 'lib/net/http.rb', line 1399 def each_value #:yield: +value+ block_given? or return enum_for(__method__) @header.each_value do |va| yield va.join(', ') end end |
- (Object) fetch(key, *args, &block)
Returns the header field corresponding to the case-insensitive key. Returns the default value args, or the result of the block, or raises an IndexErrror if there's no header field named key See Hash#fetch
1367 1368 1369 1370 |
# File 'lib/net/http.rb', line 1367 def fetch(key, *args, &block) #:yield: +key+ a = @header.fetch(key.downcase, *args, &block) a.kind_of?(Array) ? a.join(', ') : a end |
- (Object) get_fields(key)
- Ruby 1.8.3
-
Returns an array of header field strings corresponding to the case-insensitive key. This method allows you to get duplicated header fields without any processing. See also #[].
p response.get_fields('Set-Cookie') #=> ["session=al98axx; expires=Fri, 31-Dec-1999 23:58:23", "query=rubyscript; expires=Fri, 31-Dec-1999 23:58:23"] p response['Set-Cookie'] #=> "session=al98axx; expires=Fri, 31-Dec-1999 23:58:23, query=rubyscript; expires=Fri, 31-Dec-1999 23:58:23"
1358 1359 1360 1361 |
# File 'lib/net/http.rb', line 1358 def get_fields(key) return nil unless @header[key.downcase] @header[key.downcase].dup end |
- (Object) initialize_http_header(initheader)
1293 1294 1295 1296 1297 1298 1299 1300 |
# File 'lib/net/http.rb', line 1293 def initialize_http_header(initheader) @header = {} return unless initheader initheader.each do |key, value| warn "net/http: warning: duplicated HTTP header: #{key}" if key?(key) and $VERBOSE @header[key.downcase] = [value.strip] end end |
- (Boolean) key?(key)
true if key header exists.
1412 1413 1414 |
# File 'lib/net/http.rb', line 1412 def key?(key) @header.key?(key.downcase) end |
- (Object) main_type
Returns a content type string such as "text". This method returns nil if Content-Type: header field does not exist.
1546 1547 1548 1549 |
# File 'lib/net/http.rb', line 1546 def main_type return nil unless @header['content-type'] self['Content-Type'].split(';').first.to_s.split('/')[0].to_s.strip end |
- (Object) proxy_basic_auth(account, password)
Set Proxy-Authorization: header for "Basic" authorization.
1617 1618 1619 |
# File 'lib/net/http.rb', line 1617 def proxy_basic_auth(account, password) @header['proxy-authorization'] = [basic_encode(account, password)] end |
- (Object) range
Returns an Array of Range objects which represents Range: header field, or nil if there is no such header.
1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 |
# File 'lib/net/http.rb', line 1438 def range return nil unless @header['range'] self['Range'].split(/,/).map {|spec| m = /bytes\s*=\s*(\d+)?\s*-\s*(\d+)?/i.match(spec) or raise HTTPHeaderSyntaxError, "wrong Range: #{spec}" d1 = m[1].to_i d2 = m[2].to_i if m[1] and m[2] then d1..d2 elsif m[1] then d1..-1 elsif m[2] then -d2..-1 else raise HTTPHeaderSyntaxError, 'range is not specified' end } end |
- (Object) range_length
The length of the range represented in Content-Range: header.
1529 1530 1531 1532 |
# File 'lib/net/http.rb', line 1529 def range_length r = content_range() or return nil r.end - r.begin + 1 end |
- (Object) set_content_type(type, params = {}) Also known as: content_type=
Set Content-Type: header field by type and params. type must be a String, params must be a Hash.
1576 1577 1578 |
# File 'lib/net/http.rb', line 1576 def set_content_type(type, params = {}) @header['content-type'] = [type + params.map{|k,v|"; #{k}=#{v}"}.join('')] end |
- (Object) set_form_data(params, sep = '&') Also known as: form_data=
Set header fields and a body from HTML form data. params should be a Hash containing HTML form data. Optional argument sep means data record separator.
This method also set Content-Type: header field to application/x-www-form-urlencoded.
Example:
http.form_data = {"q" => "ruby", "lang" => "en"}
http.form_data = {"q" => ["ruby", "perl"], "lang" => "en"}
http.set_form_data({"q" => "ruby", "lang" => "en"}, ';')
1594 1595 1596 1597 |
# File 'lib/net/http.rb', line 1594 def set_form_data(params, sep = '&') self.body = params.map {|k, v| encode_kvpair(k, v) }.flatten.join(sep) self.content_type = 'application/x-www-form-urlencoded' end |
- (Object) set_range(r, e = nil) Also known as: range=
Set Range: header from Range (arg r) or beginning index and length from it (arg idx&len).
req.range = (0..1023)
req.set_range 0, 1023
1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 |
# File 'lib/net/http.rb', line 1460 def set_range(r, e = nil) unless r @header.delete 'range' return r end r = (r...r+e) if e case r when Numeric n = r.to_i rangestr = (n > 0 ? "0-#{n-1}" : "-#{-n}") when Range first = r.first last = r.last last -= 1 if r.exclude_end? if last == -1 rangestr = (first > 0 ? "#{first}-" : "-#{-first}") else raise HTTPHeaderSyntaxError, 'range.first is negative' if first < 0 raise HTTPHeaderSyntaxError, 'range.last is negative' if last < 0 raise HTTPHeaderSyntaxError, 'must be .first < .last' if first > last rangestr = "#{first}-#{last}" end else raise TypeError, 'Range/Integer is required' end @header['range'] = ["bytes=#{rangestr}"] r end |
- (Object) size Also known as: length
:nodoc: obsolete
1302 1303 1304 |
# File 'lib/net/http.rb', line 1302 def size #:nodoc: obsolete @header.size end |
- (Object) sub_type
Returns a content type string such as "html". This method returns nil if Content-Type: header field does not exist or sub-type is not given (e.g. "Content-Type: text").
1554 1555 1556 1557 1558 1559 |
# File 'lib/net/http.rb', line 1554 def sub_type return nil unless @header['content-type'] main, sub = *self['Content-Type'].split(';').first.to_s.split('/') return nil unless sub sub.strip end |
- (Object) to_hash
Returns a Hash consist of header names and values.
1417 1418 1419 |
# File 'lib/net/http.rb', line 1417 def to_hash @header.dup end |
- (Object) type_params
Returns content type parameters as a Hash as like => "iso-2022-jp".
1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 |
# File 'lib/net/http.rb', line 1563 def type_params result = {} list = self['Content-Type'].to_s.split(';') list.shift list.each do |param| k, v = *param.split('=', 2) result[k.strip] = v.strip end result end |