diff options
author | Azul <azul@riseup.net> | 2017-07-21 08:19:20 +0200 |
---|---|---|
committer | Azul <azul@riseup.net> | 2017-07-21 08:53:41 +0200 |
commit | 406234367544a4207141230683dddaccd98fb21a (patch) | |
tree | 2707fe4563d6be32cd6a9b2d1cb4c1f5f303273c /lib/nickserver/reel_server.rb | |
parent | 38dd81116b85c103dbc5e9f08a8ffce26238921a (diff) |
fix: filedescriptor leak from http_adapters
Now we reuse a single adapter for all requests triggered
by an incoming request. Then we .terminate the adapter.
Includes a regression test.
Diffstat (limited to 'lib/nickserver/reel_server.rb')
-rw-r--r-- | lib/nickserver/reel_server.rb | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/lib/nickserver/reel_server.rb b/lib/nickserver/reel_server.rb index c378aca..9626466 100644 --- a/lib/nickserver/reel_server.rb +++ b/lib/nickserver/reel_server.rb @@ -10,6 +10,8 @@ require 'nickserver/logging_responder' module Nickserver class ReelServer < Reel::Server::HTTP + DEFAULT_ADAPTER_CLASS = Nickserver::Adapters::CelluloidHttp + def self.start(options = {}) new(options[:host], options[:port]) end @@ -35,20 +37,37 @@ module Nickserver protected def handle_request(request) + logging_request(request) do + with_http_adapter do |adapter| + handler = handler_for(request, adapter) + handler.respond_to params(request), request.headers + end + end + rescue StandardError => e + request.respond 500, "{}" + end + + def logging_request(request) logger.info "#{request.method} #{request.uri}" logger.debug " #{params(request)}" - handler = handler_for(request) - handler.respond_to params(request), request.headers + yield rescue StandardError => e logger.error e logger.error e.backtrace.join "\n " - request.respond 500, "{}" + raise + end + + def with_http_adapter + adapter = DEFAULT_ADAPTER_CLASS.new + yield adapter + ensure + adapter.terminate if adapter.respond_to? :terminate end - def handler_for(request) + def handler_for(request, adapter) # with reel the request is the responder responder = LoggingResponder.new(request, logger) - Dispatcher.new(responder) + Dispatcher.new(responder, adapter) end def params(request) |