class HTTP::Message::Headers

Represents HTTP message header.

Constants

CHARSET_MAP

$KCODE to charset mapping definition.

NIL_URI

Placeholder URI object for nil uri.

STATUS_CODE_MAP

HTTP response status code to reason phrase mapping definition.

Attributes

body_size[R]

Size of body. nil when size is unknown (e.g. chunked response).

chunked[RW]

Request/Response is chunked or not.

http_version[RW]

HTTP version in a HTTP header. String.

reason_phrase[RW]

Response only. HTTP status reason phrase.

request_absolute_uri[RW]

Request only. Requested via proxy or not.

request_method[R]

Request only. Requested method.

request_query[RW]

Request only. Requested query.

request_uri[RW]

Request only. Requested URI.

status_code[R]

Response only. HTTP status

Public Class Methods

new() click to toggle source

Creates a Message::Headers. Use init_request, init_response, or init_connect_request for acutual initialize.

# File lib/httpclient/http.rb, line 161
def initialize
  @http_version = '1.1'
  @body_size = nil
  @chunked = false

  @request_method = nil
  @request_uri = nil
  @request_query = nil
  @request_absolute_uri = nil

  @status_code = nil
  @reason_phrase = nil

  @body_type = nil
  @body_charset = nil
  @body_date = nil
  @body_encoding = nil

  @is_request = nil
  @header_item = []
  @dumped = false
end

Public Instance Methods

[](key) click to toggle source

Returns an Array of header values for the given key.

# File lib/httpclient/http.rb, line 322
def [](key)
  get(key).collect { |item| item[1] }
end
[]=(key, value) click to toggle source

Adds a header. See set.

# File lib/httpclient/http.rb, line 317
def []=(key, value)
  set(key, value)
end
add(key, value) click to toggle source

Adds a header. Addition order is preserved.

# File lib/httpclient/http.rb, line 277
def add(key, value)
  if value.is_a?(Array)
    value.each do |v|
      @header_item.push([key, v])
    end
  else
    @header_item.push([key, value])
  end
end
all() click to toggle source

Returns an Array of all headers.

# File lib/httpclient/http.rb, line 306
def all
  @header_item
end
body_size=(body_size) click to toggle source

Sets byte size of message body. body_size == nil means that the body is_a? IO

# File lib/httpclient/http.rb, line 253
def body_size=(body_size)
  @body_size = body_size
end
content_type() click to toggle source

Returns 'Content-Type' header value.

# File lib/httpclient/http.rb, line 224
def content_type
  self['Content-Type'][0]
end
Also aliased as: contenttype
content_type=(content_type) click to toggle source

Sets 'Content-Type' header value. Overrides if already exists.

# File lib/httpclient/http.rb, line 229
def content_type=(content_type)
  delete('Content-Type')
  self['Content-Type'] = content_type
end
Also aliased as: contenttype=
contenttype()
Alias for: content_type
contenttype=(content_type)
Alias for: content_type=
create_query_part() click to toggle source
# File lib/httpclient/http.rb, line 345
def create_query_part()
  query_str = nil
  if @request_uri.query
    query_str = @request_uri.query
  end
  if @request_query
    if query_str
      query_str += "&#{Message.create_query_part_str(@request_query)}"
    else
      query_str = Message.create_query_part_str(@request_query)
    end
  end
  query_str
end
create_query_uri() click to toggle source
# File lib/httpclient/http.rb, line 333
def create_query_uri()
  if @request_method == 'CONNECT'
    return "#{@request_uri.host}:#{@request_uri.port}"
  end
  path = @request_uri.path
  path = '/' if path.nil? or path.empty?
  if query_str = create_query_part()
    path += "?#{query_str}"
  end
  path
end
delete(key) click to toggle source

Deletes headers of the given key.

# File lib/httpclient/http.rb, line 311
def delete(key)
  key = key.upcase
  @header_item.delete_if { |k, v| k.upcase == key }
end
dump() click to toggle source

Dumps message header part and returns a dumped String.

# File lib/httpclient/http.rb, line 258
def dump
  set_header
  str = nil
  if @is_request
    str = request_line
  else
    str = response_status_line
  end
  str + @header_item.collect { |key, value|
    "#{ key }: #{ value }#{ CRLF }"
  }.join
end
get(key = nil) click to toggle source

Returns an Array of headers for the given key. Each element is a pair of key and value. It returns an single element Array even if the only one header exists. If nil key given, it returns all headers.

# File lib/httpclient/http.rb, line 296
def get(key = nil)
  if key.nil?
    all
  else
    key = key.upcase
    @header_item.find_all { |k, v| k.upcase == key }
  end
end
init_connect_request(uri) click to toggle source

Initialize this instance as a CONNECT request.

# File lib/httpclient/http.rb, line 185
def init_connect_request(uri)
  @is_request = true
  @request_method = 'CONNECT'
  @request_uri = uri
  @request_query = nil
  @http_version = '1.0'
end
init_request(method, uri, query = nil) click to toggle source

Initialize this instance as a general request.

# File lib/httpclient/http.rb, line 196
def init_request(method, uri, query = nil)
  @is_request = true
  @request_method = method
  @request_uri = uri || NIL_URI
  @request_query = query
  @request_absolute_uri = false
  self
end
init_response(status_code, req = nil) click to toggle source

Initialize this instance as a response.

# File lib/httpclient/http.rb, line 206
def init_response(status_code, req = nil)
  @is_request = false
  self.status_code = status_code
  if req
    @request_method = req.request_method
    @request_uri = req.request_uri
    @request_query = req.request_query
  end
  self
end
set(key, value) click to toggle source

Sets a header.

# File lib/httpclient/http.rb, line 288
def set(key, value)
  delete(key)
  add(key, value)
end
set_body_encoding() click to toggle source
# File lib/httpclient/http.rb, line 238
def set_body_encoding
  if type = self.content_type
    OpenURI::Meta.init(o = '')
    o.meta_add_field('content-type', type)
    @body_encoding = o.encoding
  end
end
set_date_header() click to toggle source

Set Date header

# File lib/httpclient/http.rb, line 272
def set_date_header
  set('Date', Time.now.httpdate)
end
set_headers(headers) click to toggle source
# File lib/httpclient/http.rb, line 326
def set_headers(headers)
  headers.each do |key, value|
    add(key, value)
  end
  set_body_encoding
end
status_code=(status_code) click to toggle source

Sets status code and reason phrase.

# File lib/httpclient/http.rb, line 218
def status_code=(status_code)
  @status_code = status_code
  @reason_phrase = STATUS_CODE_MAP[@status_code]
end

Private Instance Methods

charset_label() click to toggle source
# File lib/httpclient/http.rb, line 430
def charset_label
  # TODO: should handle response encoding for 1.9 correctly.
  if RUBY_VERSION > "1.9"
    CHARSET_MAP[@body_charset] || 'us-ascii'
  else
    CHARSET_MAP[@body_charset || $KCODE] || 'us-ascii'
  end
end
request_line() click to toggle source
# File lib/httpclient/http.rb, line 362
def request_line
  path = create_query_uri()
  if @request_absolute_uri
    path = "#{ @request_uri.scheme }://#{ @request_uri.host }:#{ @request_uri.port }#{ path }"
  end
  "#{ @request_method } #{ path } HTTP/#{ @http_version }#{ CRLF }"
end
response_status_line() click to toggle source
# File lib/httpclient/http.rb, line 370
def response_status_line
  if defined?(Apache)
    "HTTP/#{ @http_version } #{ @status_code } #{ @reason_phrase }#{ CRLF }"
  else
    "Status: #{ @status_code } #{ @reason_phrase }#{ CRLF }"
  end
end
set_header() click to toggle source
# File lib/httpclient/http.rb, line 378
def set_header
  if @is_request
    set_request_header
  else
    set_response_header
  end
end
set_request_header() click to toggle source
# File lib/httpclient/http.rb, line 386
def set_request_header
  return if @dumped
  @dumped = true
  keep_alive = Message.keep_alive_enabled?(@http_version)
  if !keep_alive and @request_method != 'CONNECT'
    set('Connection', 'close')
  end
  if @chunked
    set('Transfer-Encoding', 'chunked')
  elsif @body_size and (keep_alive or @body_size != 0)
    set('Content-Length', @body_size.to_s)
  end
  if @http_version >= '1.1' and get('Host').empty?
    if @request_uri.port == @request_uri.default_port
      # GFE/1.3 dislikes default port number (returns 404)
      set('Host', "#{@request_uri.hostname}")
    else
      set('Host', "#{@request_uri.hostname}:#{@request_uri.port}")
    end
  end
end
set_response_header() click to toggle source
# File lib/httpclient/http.rb, line 408
def set_response_header
  return if @dumped
  @dumped = true
  if defined?(Apache) && self['Date'].empty?
    set_date_header
  end
  keep_alive = Message.keep_alive_enabled?(@http_version)
  if @chunked
    set('Transfer-Encoding', 'chunked')
  else
    if keep_alive or @body_size != 0
      set('Content-Length', @body_size.to_s)
    end
  end
  if @body_date
    set('Last-Modified', @body_date.httpdate)
  end
  if self['Content-Type'].empty?
    set('Content-Type', "#{ @body_type || 'text/html' }; charset=#{ charset_label }")
  end
end