Sha256: 44d42746ca932432a362fd6ebc7313c67f729fdc3f55fa2a5d26c5ff3062f832

Contents?: true

Size: 1.56 KB

Versions: 1

Compression:

Stored size: 1.56 KB

Contents

# encoding: utf-8

module HTTPkit
  class Server::KeepAliveHandler
    CONNECTION = 'Connection'.freeze
    CLOSE = 'close'.freeze
    KEEP_ALIVE = 'keep-alive'.freeze

    def setup(_, server, _)
      @server = server
      @requests = {}
    end

    def serve(request, served)
      @requests[sequence(request)] = served
    end

    def respond(request, response)
      synchronize_responses(request)

      if close_connection?(request)
        yield request, close_response(response)
      else
        yield request, keep_alive_response(response)
      end
    end

    def finish(request)
      @requests.delete(sequence(request))
    end

    private

    def sequence(request)
      request.sequence(@server)
    end

    def close_response(response)
      # XXX: possible race condition with other locations waiting for this
      response.closed { @server.close }
      response.with_headers(CONNECTION => CLOSE)
    end

    def keep_alive_response(response)
      response.with_headers(CONNECTION => KEEP_ALIVE)
    end

    def synchronize_responses(request)
      served = @requests[sequence(request) - 1]
      served.sync.closed! if served
    end

    def connection_header(request)
      response = @requests[sequence(request)].value
      request.headers[CONNECTION] || response.headers[CONNECTION]
    end

    def close_connection?(request)
      header = connection_header(request).to_s.downcase
      header == CLOSE || http10_close?(request.http_version, header)
    end

    def http10_close?(version, header)
      version < 1.1 && header != KEEP_ALIVE
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
httpkit-0.6.0.pre.5 lib/httpkit/server/keep_alive_handler.rb