HTTP message header.

A class that describes header part of HTTP message.

Methods
Constants
StatusCodeMap = { Status::OK => 'OK', Status::MOVED_PERMANENTLY => 'Moved Permanently', Status::FOUND => 'Found', Status::SEE_OTHER => 'See Other', Status::TEMPORARY_REDIRECT => 'Temporary Redirect', Status::MOVED_TEMPORARILY => 'Temporary Redirect', Status::BAD_REQUEST => 'Bad Request', Status::INTERNAL => 'Internal Server Error', }
CharsetMap = { 'NONE' => 'us-ascii', 'EUC' => 'euc-jp', 'SJIS' => 'shift_jis', 'UTF8' => 'utf-8', }
Attributes
[RW] body_charset Charset.
[RW] body_date A milestone of body.
[R] body_size Size of body.
[RW] body_type Content-type.
[R] chunked Chunked or not.
[RW] http_version HTTP version string in a HTTP header.
[RW] reason_phrase HTTP status reason phrase.
[R] request_method Request method.
[R] request_uri Requested URI.
[RW] request_via_proxy
[R] response_status_code
Public Class methods
new()

SYNOPSIS

  HTTP::Message.new

ARGS

  N/A

DESCRIPTION

  Create a instance of HTTP request or HTTP response.  Specify
  status_code for HTTP response.
# File lib/facets/more/http.rb, line 138
      def initialize
        @is_request = nil       # true, false and nil
        @http_version = 'HTTP/1.1'
        @body_type = nil
        @body_charset = nil
        @body_size = nil
        @body_date = nil
        @header_item = []
        @chunked = false
        @response_status_code = nil
        @reason_phrase = nil
        @request_method = nil
        @request_uri = nil
        @request_query = nil
        @request_via_proxy = nil
      end
Public Instance methods
[](key)
# File lib/facets/more/http.rb, line 227
      def [](key)
        get(key).collect { |item| item[1] }
      end
[]=(key, value)
# File lib/facets/more/http.rb, line 223
      def []=(key, value)
        set(key, value)
      end
body_size=(body_size)

body_size == nil means that the body is_a? IO

# File lib/facets/more/http.rb, line 189
      def body_size=(body_size)
        @body_size = body_size
        if @body_size
          @chunked = false
        else
          @chunked = true
        end
      end
contenttype()
# File lib/facets/more/http.rb, line 180
      def contenttype
        self['content-type'][0]
      end
contenttype=(contenttype)
# File lib/facets/more/http.rb, line 184
      def contenttype=(contenttype)
        self['content-type'] = contenttype
      end
dump(dev = '')
# File lib/facets/more/http.rb, line 198
      def dump(dev = '')
        set_header
        if @is_request
          dev << request_line
        else
          dev << response_status_line
        end
        dev << @header_item.collect { |key, value|
            dump_line("#{ key }: #{ value }")
          }.join
        dev
      end
get(key = nil)
# File lib/facets/more/http.rb, line 215
      def get(key = nil)
        if !key
          @header_item
        else
          @header_item.find_all { |pair| pair[0].upcase == key.upcase }
        end
      end
init_request(method, uri, query = nil, via_proxy = nil)
# File lib/facets/more/http.rb, line 155
      def init_request(method, uri, query = nil, via_proxy = nil)
        @is_request = true
        @request_method = method
        @request_uri = if uri.is_a?(URI)
            uri
          else
            URI.parse(uri.to_s)
          end
        @request_query = create_query_uri(@request_uri, query)
        @request_via_proxy = via_proxy
      end
init_response(status_code)
# File lib/facets/more/http.rb, line 167
      def init_response(status_code)
        @is_request = false
        self.response_status_code = status_code
      end
response_status_code=(status_code)
# File lib/facets/more/http.rb, line 175
      def response_status_code=(status_code)
        @response_status_code = status_code
        @reason_phrase = StatusCodeMap[@response_status_code]
      end
set(key, value)
# File lib/facets/more/http.rb, line 211
      def set(key, value)
        @header_item.push([key, value])
      end
Private Instance methods
create_query_uri(uri, query)
# File lib/facets/more/http.rb, line 291
      def create_query_uri(uri, query)
        path = uri.path.dup
        path = '/' if path.empty?
        query_str = nil
        if uri.query
          query_str = uri.query
        end
        if query
          if query_str
            query_str << '&' << Message.create_query_part_str(query)
          else
            query_str = Message.create_query_part_str(query)
          end
        end
        if query_str
          path << '?' << query_str
        end
        path
      end
dump_line(str)
# File lib/facets/more/http.rb, line 287
      def dump_line(str)
        str + CRLF
      end
request_line()
# File lib/facets/more/http.rb, line 233
      def request_line
        path = if @request_via_proxy
          if @request_uri.port
            "#{ @request_uri.scheme }://#{ @request_uri.host }:#{ @request_uri.port }#{ @request_query }"
          else
            "#{ @request_uri.scheme }://#{ @request_uri.host }#{ @request_query }"
          end
        else
          @request_query
        end
        dump_line("#{ @request_method } #{ path } #{ @http_version }")
      end
response_status_line()
# File lib/facets/more/http.rb, line 246
      def response_status_line
        if defined?(Apache)
          dump_line("#{ @http_version } #{ response_status_code } #{ @reason_phrase }")
        else
          dump_line("Status: #{ response_status_code } #{ @reason_phrase }")
        end
      end
set_header()
# File lib/facets/more/http.rb, line 254
      def set_header
        if defined?(Apache)
          set('Date', HTTP.http_date(Time.now))
        end

        keep_alive = HTTP.keep_alive_enabled?(@http_version)
        set('Connection', 'close') unless keep_alive

        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', HTTP.http_date(@body_date))
        end

        if @is_request == true
          if @http_version >= 'HTTP/1.1'
            if @request_uri.port == @request_uri.default_port
              set('Host', "#{@request_uri.host}")
            else
              set('Host', "#{@request_uri.host}:#{@request_uri.port}")
            end
          end
        elsif @is_request == false
          set('Content-Type', "#{ @body_type || 'text/html' }; charset=#{ CharsetMap[@body_charset || $KCODE] }")
        end
      end