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 |