Sha256: 678155ebb1ca40bf8948a177954e340c4f4db45bd15c8a636a3d8ae94a5a1a46

Contents?: true

Size: 1.55 KB

Versions: 1

Compression:

Stored size: 1.55 KB

Contents

# encoding: utf-8

module Hatetepe
  class Server
    SERVER = 'Server'.freeze
    SERVER_VALUE = "hatetepe/#{Hatetepe::VERSION}".freeze
    DATE = 'Date'.freeze

    def self.start(config)
      callback = proc { |connection| new(config, connection) }
      EM.start_server(config[:address], config[:port],
                      Connection::EventMachine, callback)
    end

    include Support::Handlers
    include Connection::Status

    attr_reader :config

    def initialize(config, connection)
      @config = config

      setup_connection(connection)
      setup_handlers
      notify_handlers(:setup, @config, self, @connection)
    end

    def serve(request)
      served = Promise.new
      served.then { |response| respond(request, response) }

      Fiber.new { notify_handlers(:serve, request, served) }.resume
    end

    def respond(request, response)
      fiber = Fiber.new do
        add_extra_headers(response)
        respond!(request, response)
        response.closed { finish(request) }
      end
      fiber.resume
    end

    def finish(request)
      notify_handlers(:finish, request)
    end

    def close
      @connection.close
    end

    private

    def add_extra_headers(response)
      date = Time.now.httpdate
      response.add_extra_headers(SERVER => SERVER_VALUE, DATE => date)
    end

    def respond!(request, response)
      notify_handlers(:respond, request, response)
      @connection.serialize(response)
    end

    def setup_connection(connection)
      @connection = connection
      @connection.parse(method(:serve))
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

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