summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAzul <azul@riseup.net>2017-07-21 08:19:20 +0200
committerAzul <azul@riseup.net>2017-07-21 08:53:41 +0200
commit406234367544a4207141230683dddaccd98fb21a (patch)
tree2707fe4563d6be32cd6a9b2d1cb4c1f5f303273c /lib
parent38dd81116b85c103dbc5e9f08a8ffce26238921a (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')
-rw-r--r--lib/nickserver/dispatcher.rb18
-rw-r--r--lib/nickserver/reel_server.rb29
-rw-r--r--lib/nickserver/request_handlers/base.rb9
-rw-r--r--lib/nickserver/request_handlers/fingerprint_handler.rb2
-rw-r--r--lib/nickserver/request_handlers/hkp_email_handler.rb2
-rw-r--r--lib/nickserver/request_handlers/leap_email_handler.rb2
-rw-r--r--lib/nickserver/request_handlers/local_email_handler.rb2
-rw-r--r--lib/nickserver/source.rb6
8 files changed, 41 insertions, 29 deletions
diff --git a/lib/nickserver/dispatcher.rb b/lib/nickserver/dispatcher.rb
index 71e71cf..dfd53e5 100644
--- a/lib/nickserver/dispatcher.rb
+++ b/lib/nickserver/dispatcher.rb
@@ -24,21 +24,23 @@ require 'nickserver/request_handlers/fingerprint_handler'
module Nickserver
class Dispatcher
-
- def initialize(responder)
+ def initialize(responder, adapter = nil)
@responder = responder
+ @adapter = adapter
end
def respond_to(params, headers)
request = Nickserver::Request.new params, headers
response = handle request
- send_response response
+ responder.respond response.status, response.content
end
protected
+ attr_reader :responder, :adapter
+
def handle(request)
- handler_chain.handle request
+ handler_chain.handle request, adapter
end
def handler_chain
@@ -51,7 +53,7 @@ module Nickserver
RequestHandlers::LeapEmailHandler,
RequestHandlers::HkpEmailHandler,
RequestHandlers::FingerprintHandler,
- Proc.new {|_req| proxy_error_response },
+ Proc.new { proxy_error_response },
Proc.new { Nickserver::Response.new(404, "404 Not Found\n") }
chain.continue_on HTTP::ConnectionError
return chain
@@ -65,11 +67,5 @@ module Nickserver
end
end
- def send_response(response)
- responder.respond response.status, response.content
- end
-
- attr_reader :responder
-
end
end
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)
diff --git a/lib/nickserver/request_handlers/base.rb b/lib/nickserver/request_handlers/base.rb
index e5d8992..495a6da 100644
--- a/lib/nickserver/request_handlers/base.rb
+++ b/lib/nickserver/request_handlers/base.rb
@@ -2,16 +2,17 @@ module Nickserver
module RequestHandlers
class Base
- def self.call(request)
- new(request).handle
+ def self.call(request, adapter = nil)
+ new(request, adapter).handle
end
- def initialize(request)
+ def initialize(request, adapter)
@request = request
+ @adapter = adapter
end
protected
- attr_reader :request
+ attr_reader :request, :adapter
end
end
end
diff --git a/lib/nickserver/request_handlers/fingerprint_handler.rb b/lib/nickserver/request_handlers/fingerprint_handler.rb
index 5b2dc7d..ac3c3c8 100644
--- a/lib/nickserver/request_handlers/fingerprint_handler.rb
+++ b/lib/nickserver/request_handlers/fingerprint_handler.rb
@@ -22,7 +22,7 @@ module Nickserver
end
def source
- Nickserver::Hkp::Source.new
+ Nickserver::Hkp::Source.new adapter
end
end
diff --git a/lib/nickserver/request_handlers/hkp_email_handler.rb b/lib/nickserver/request_handlers/hkp_email_handler.rb
index 2f73773..393ef87 100644
--- a/lib/nickserver/request_handlers/hkp_email_handler.rb
+++ b/lib/nickserver/request_handlers/hkp_email_handler.rb
@@ -16,7 +16,7 @@ module Nickserver
end
def source
- Nickserver::Hkp::Source.new
+ Nickserver::Hkp::Source.new adapter
end
end
diff --git a/lib/nickserver/request_handlers/leap_email_handler.rb b/lib/nickserver/request_handlers/leap_email_handler.rb
index bdebc23..bc3ddef 100644
--- a/lib/nickserver/request_handlers/leap_email_handler.rb
+++ b/lib/nickserver/request_handlers/leap_email_handler.rb
@@ -13,7 +13,7 @@ module Nickserver
protected
def source
- @source ||= Nicknym::Source.new
+ @source ||= Nicknym::Source.new adapter
end
def remote_email?
diff --git a/lib/nickserver/request_handlers/local_email_handler.rb b/lib/nickserver/request_handlers/local_email_handler.rb
index 9165ef2..08147a0 100644
--- a/lib/nickserver/request_handlers/local_email_handler.rb
+++ b/lib/nickserver/request_handlers/local_email_handler.rb
@@ -21,7 +21,7 @@ module Nickserver
end
def source
- Nickserver::CouchDB::Source.new
+ Nickserver::CouchDB::Source.new adapter
end
end
diff --git a/lib/nickserver/source.rb b/lib/nickserver/source.rb
index dc0669a..934407a 100644
--- a/lib/nickserver/source.rb
+++ b/lib/nickserver/source.rb
@@ -1,11 +1,7 @@
-require 'nickserver/adapters/celluloid_http'
-
module Nickserver
class Source
- DEFAULT_ADAPTER_CLASS = Nickserver::Adapters::CelluloidHttp
-
- def initialize(adapter = DEFAULT_ADAPTER_CLASS.new)
+ def initialize(adapter = nil)
@adapter = adapter
end