Sha256: f6f9aa569d2c709c0fee5adb2d28e7c1a5acbe9510ff4cce75b010f1e77240df

Contents?: true

Size: 1.12 KB

Versions: 1

Compression:

Stored size: 1.12 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
      setup_body

      write(banana_line)
      write(header_block)

      write_body
    end

    private

    def write(*data)
      data.each { |str| @writer.call(str) }
    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 << sprintf(HEADER, *e) } + CRLF
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

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