From a1c7d68b05f142322a190b450971d27c076310a9 Mon Sep 17 00:00:00 2001 From: Azul Date: Mon, 19 Sep 2016 09:51:38 +0200 Subject: refactor: separate handler chain from dispatcher Handler Chain is of handlers that respond to call. Invoking handle(*args) on the chain will call the handlers with the given args until one of them returns a result that is truethy (i.e. not false or nil). Extracted from the dispatcher so we can also handle exceptions there in the future. (So that if one of the network connections to the request_handlers fails we can continue while still tracking the failed exception.) --- lib/nickserver/dispatcher.rb | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'lib/nickserver/dispatcher.rb') diff --git a/lib/nickserver/dispatcher.rb b/lib/nickserver/dispatcher.rb index 7a584e5..9968e95 100644 --- a/lib/nickserver/dispatcher.rb +++ b/lib/nickserver/dispatcher.rb @@ -35,10 +35,7 @@ module Nickserver protected def handle(request) - handler_chain.each do |handler| - response = handler.call request - return response if response - end + handler_chain.handle request rescue RuntimeError => exc puts "Error: #{exc}" puts exc.backtrace @@ -46,13 +43,11 @@ module Nickserver end def handler_chain - [ - RequestHandlers::InvalidEmailHandler, + HandlerChain.new RequestHandlers::InvalidEmailHandler, RequestHandlers::LocalEmailHandler, RequestHandlers::HkpEmailHandler, RequestHandlers::FingerprintHandler, Proc.new { Nickserver::Response.new(404, "404 Not Found\n") } - ] end def send_response(response) -- cgit v1.2.3 From 6f507ed7b4f53054313173ce795ffd2cbcecd0b7 Mon Sep 17 00:00:00 2001 From: Azul Date: Wed, 21 Sep 2016 12:48:11 +0200 Subject: feature: activate nicknym lookup --- lib/nickserver/dispatcher.rb | 3 +++ 1 file changed, 3 insertions(+) (limited to 'lib/nickserver/dispatcher.rb') diff --git a/lib/nickserver/dispatcher.rb b/lib/nickserver/dispatcher.rb index 9968e95..75f6083 100644 --- a/lib/nickserver/dispatcher.rb +++ b/lib/nickserver/dispatcher.rb @@ -14,8 +14,10 @@ # require 'nickserver/request' +require 'nickserver/handler_chain' require 'nickserver/request_handlers/invalid_email_handler' require 'nickserver/request_handlers/local_email_handler' +require 'nickserver/request_handlers/leap_email_handler' require 'nickserver/request_handlers/hkp_email_handler' require 'nickserver/request_handlers/fingerprint_handler' @@ -45,6 +47,7 @@ module Nickserver def handler_chain HandlerChain.new RequestHandlers::InvalidEmailHandler, RequestHandlers::LocalEmailHandler, + RequestHandlers::LeapEmailHandler, RequestHandlers::HkpEmailHandler, RequestHandlers::FingerprintHandler, Proc.new { Nickserver::Response.new(404, "404 Not Found\n") } -- cgit v1.2.3 From 48cdd4b1ee0685674aa998d4daa295656d80ead3 Mon Sep 17 00:00:00 2001 From: Azul Date: Thu, 22 Sep 2016 11:07:47 +0200 Subject: feature: 502 on ConnectionErrors If one source raises a 502 and no other handler has any result we'll respond with a 502 - bad gateway. --- lib/nickserver/dispatcher.rb | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'lib/nickserver/dispatcher.rb') diff --git a/lib/nickserver/dispatcher.rb b/lib/nickserver/dispatcher.rb index 75f6083..869f721 100644 --- a/lib/nickserver/dispatcher.rb +++ b/lib/nickserver/dispatcher.rb @@ -24,6 +24,7 @@ require 'nickserver/request_handlers/fingerprint_handler' module Nickserver class Dispatcher + def initialize(responder) @responder = responder end @@ -45,12 +46,26 @@ module Nickserver end def handler_chain - HandlerChain.new RequestHandlers::InvalidEmailHandler, + @handler_chain ||= init_handler_chain + end + + def init_handler_chain + chain = HandlerChain.new RequestHandlers::InvalidEmailHandler, RequestHandlers::LocalEmailHandler, RequestHandlers::LeapEmailHandler, RequestHandlers::HkpEmailHandler, RequestHandlers::FingerprintHandler, + Proc.new {|_req| proxy_error_response }, Proc.new { Nickserver::Response.new(404, "404 Not Found\n") } + chain.continue_on HTTP::ConnectionError + return chain + end + + def proxy_error_response + exception = handler_chain.rescued_exceptions.first + if exception + Nickserver::Response.new(502, exception.to_s) + end end def send_response(response) -- cgit v1.2.3