# encoding: utf-8 module HTTPkit class Server SERVER = 'Server'.freeze SERVER_VALUE = "httpkit/#{HTTPkit::VERSION}".freeze DATE = 'Date'.freeze def self.start(config) Connection::EventMachine.start_server(config, self) end include Support::HandlerManager::Setup include Connection::Status attr_reader :config def initialize(config, connection) @config = config setup_connection(connection) setup_handlers end def serve(request) served = Promise.new served.then { |response| respond(request, response) } Fiber.new { @handlers.notify(: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) @handlers.notify(:finish, request) 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) @handlers.notify(:respond, request, response) @connection.serialize(response) end def setup_connection(connection) @connection = connection @connection.on_message = method(:serve) end end end