Sha256: 25b641de3dd0c2b8b0e88b9ae2fb3fe74ee6fc55c393905c5852e13b216cd937

Contents?: true

Size: 1.39 KB

Versions: 1

Compression:

Stored size: 1.39 KB

Contents

# encoding: utf-8

require 'forwardable'

module Hatetepe
  class Serializer
    REQUEST_LINE = "%s %s HTTP/%.1f\r\n".freeze
    RESPONSE_LINE = "HTTP/%.1f %d %s\r\n".freeze
    HEADER = "%s: %s\r\n".freeze
    CRLF = "\r\n".freeze

    include Encoding

    extend Forwardable
    def_delegator :@message, :headers
    def_delegator :@message, :body

    def initialize(message, writer)
      @message = message
      @writer = writer
    end

    def serialize
      write(banana_line)
      write(header_block)

      write_body
    end

    def setup_body
      if body.closed.pending?
        setup_chunked_encoding
        setup_chunked_streaming
      else
        setup_identity_encoding
      end
    end

    private

    def write(*data)
      @writer.call(data.join(''))
    end

    def banana_line
      if Request === @message
        request_line
      else
        response_line
      end
    end

    def request_line
      sprintf(REQUEST_LINE,
              @message.http_method.upcase, @message.uri, @message.http_version)
    end

    def response_line
      sprintf(RESPONSE_LINE,
              @message.http_version, @message.status, @message.status_name)
    end

    def header_block
      headers.reduce('') { |a, e| a << header_line(*e) } + CRLF
    end

    def header_line(key, value)
      if value.to_s.empty?
        ''
      else
        sprintf(HEADER, key, value)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
hatetepe-0.6.0.pre.2 lib/hatetepe/serializer.rb