diff options
author | Azul <azul@riseup.net> | 2016-09-19 09:51:38 +0200 |
---|---|---|
committer | Azul <azul@riseup.net> | 2016-09-19 09:51:38 +0200 |
commit | a1c7d68b05f142322a190b450971d27c076310a9 (patch) | |
tree | 75b171436d9f1109025904fda4cc650b2570a74b /lib | |
parent | d3c9ec2c815a4cd79cfaf40d1de0365fdec90cb2 (diff) |
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.)
Diffstat (limited to 'lib')
-rw-r--r-- | lib/nickserver/dispatcher.rb | 9 | ||||
-rw-r--r-- | lib/nickserver/handler_chain.rb | 26 |
2 files changed, 28 insertions, 7 deletions
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) diff --git a/lib/nickserver/handler_chain.rb b/lib/nickserver/handler_chain.rb new file mode 100644 index 0000000..a0eba4d --- /dev/null +++ b/lib/nickserver/handler_chain.rb @@ -0,0 +1,26 @@ +# +# Handler Chain +# +# A chain 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 here in the +# future. +# + +module Nickserver + class HandlerChain + + def initialize(*handlers) + @handlers = handlers + end + + def handle(*args) + result = nil + _handled_by = @handlers.find{|h| result = h.call(*args)} + result + end + + end +end |