From 35433792f9fa23f7b8d9c771d1d3676286a48870 Mon Sep 17 00:00:00 2001 From: Azul Date: Fri, 23 Sep 2016 15:54:56 +0200 Subject: basic logging and recovery from exceptions raised --- lib/nickserver/daemon.rb | 1 + lib/nickserver/reel_server.rb | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/nickserver/daemon.rb b/lib/nickserver/daemon.rb index 9cc1af7..0f9e7bf 100644 --- a/lib/nickserver/daemon.rb +++ b/lib/nickserver/daemon.rb @@ -176,6 +176,7 @@ module Nickserver $stdout.reopen(log_path, 'a') $stderr.reopen $stdout $stdout.sync = true + $stderr.sync = true else # redirect to /dev/null $stdin.reopen '/dev/null' diff --git a/lib/nickserver/reel_server.rb b/lib/nickserver/reel_server.rb index d2a95ba..9a7053b 100644 --- a/lib/nickserver/reel_server.rb +++ b/lib/nickserver/reel_server.rb @@ -23,14 +23,24 @@ module Nickserver def on_connection(connection) connection.each_request do |request| - handler = handler_for(request) - handler.respond_to params(request), request.headers + handle_request(request) end end protected + def handle_request(request) + puts "#{request.method} #{request.uri}" + puts " #{params(request)}" + handler = handler_for(request) + handler.respond_to params(request), request.headers + rescue StandardError => e + puts e + puts e.backtrace.join "\n " + request.respond 500, "{}" + end + def handler_for(request) # with reel the request is the responder Dispatcher.new(request) -- cgit v1.2.3 From 5a93f2d29c96e649440101f2d1ca28247631b59e Mon Sep 17 00:00:00 2001 From: Azul Date: Sat, 24 Sep 2016 12:00:56 +0200 Subject: use plain http.rb rather than celluloid i/o Turns out http.rb does not support celluloid i/o andymore and we were not making use of it anyway. Here's what https://github.com/httprb/http/wiki/Thread-Safety says: (NOTE: this gem previously supported Celluloid::IO, but that support was removed to add the current timeout backend. It may be added back in a future version) So now we have a plain http.rb adapter and use that as the default. This prevents actors from crashing in the adapter (as we don't have any). --- lib/nickserver/adapters/http.rb | 21 +++++++++++++++++++++ lib/nickserver/source.rb | 4 ++-- 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 lib/nickserver/adapters/http.rb (limited to 'lib') diff --git a/lib/nickserver/adapters/http.rb b/lib/nickserver/adapters/http.rb new file mode 100644 index 0000000..b0ba728 --- /dev/null +++ b/lib/nickserver/adapters/http.rb @@ -0,0 +1,21 @@ +require 'nickserver/adapters' +require 'nickserver/config' +require 'http' + +module Nickserver::Adapters + class Http + + def get(url, options = {}) + response = HTTP.get url, + params: options[:query], + ssl_context: ctx + return response.code, response.to_s + end + + def ctx + OpenSSL::SSL::SSLContext.new.tap do |ctx| + ctx.ca_file = Nickserver::Config.hkp_ca_file + end + end + end +end diff --git a/lib/nickserver/source.rb b/lib/nickserver/source.rb index edc57e9..ca2c34c 100644 --- a/lib/nickserver/source.rb +++ b/lib/nickserver/source.rb @@ -1,9 +1,9 @@ -require 'nickserver/adapters/celluloid_http' +require 'nickserver/adapters/http' module Nickserver class Source - def initialize(adapter = Nickserver::Adapters::CelluloidHttp.new) + def initialize(adapter = Nickserver::Adapters::Http.new) @adapter = adapter end -- cgit v1.2.3 From bde67131c2382883f7957fa06d85b471a18c09d4 Mon Sep 17 00:00:00 2001 From: Azul Date: Sat, 24 Sep 2016 12:12:21 +0200 Subject: log HTTP::ConnectionErrors, respond with json body --- lib/nickserver/dispatcher.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/nickserver/dispatcher.rb b/lib/nickserver/dispatcher.rb index 869f721..07571d5 100644 --- a/lib/nickserver/dispatcher.rb +++ b/lib/nickserver/dispatcher.rb @@ -62,9 +62,11 @@ module Nickserver end def proxy_error_response - exception = handler_chain.rescued_exceptions.first - if exception - Nickserver::Response.new(502, exception.to_s) + exc = handler_chain.rescued_exceptions.first + if exc + puts " Error: #{exc}" + Nickserver::Response.new 502, + %Q|{"error": "#{exc}"}| end end -- cgit v1.2.3 From 4cd842927a60e4e81915da22983f216ccd54d6a3 Mon Sep 17 00:00:00 2001 From: Azul Date: Thu, 29 Sep 2016 12:56:14 +0200 Subject: skip tests with ConnectionErrors We handle these errors nicely in the dispatcher and have tests for that. Tests should fail or err out when running into exceptions we are not handling yet. But for these it's better to just skip. --- lib/nickserver/dispatcher.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/nickserver/dispatcher.rb b/lib/nickserver/dispatcher.rb index 07571d5..f9801d1 100644 --- a/lib/nickserver/dispatcher.rb +++ b/lib/nickserver/dispatcher.rb @@ -66,7 +66,7 @@ module Nickserver if exc puts " Error: #{exc}" Nickserver::Response.new 502, - %Q|{"error": "#{exc}"}| + JSON.dump(error: exc.to_s) end end -- cgit v1.2.3 From 997af2eea91263b1d6c07e02a98f02f81a320acf Mon Sep 17 00:00:00 2001 From: Azul Date: Thu, 29 Sep 2016 13:18:38 +0200 Subject: use stderr for errors --- lib/nickserver/dispatcher.rb | 6 +++--- lib/nickserver/reel_server.rb | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/nickserver/dispatcher.rb b/lib/nickserver/dispatcher.rb index f9801d1..26ad09e 100644 --- a/lib/nickserver/dispatcher.rb +++ b/lib/nickserver/dispatcher.rb @@ -40,8 +40,8 @@ module Nickserver def handle(request) handler_chain.handle request rescue RuntimeError => exc - puts "Error: #{exc}" - puts exc.backtrace + $stderr.puts "Error: #{exc}" + $stderr.puts exc.backtrace ErrorResponse.new(exc.to_s) end @@ -64,7 +64,7 @@ module Nickserver def proxy_error_response exc = handler_chain.rescued_exceptions.first if exc - puts " Error: #{exc}" + $stderr.puts " Error: #{exc}" Nickserver::Response.new 502, JSON.dump(error: exc.to_s) end diff --git a/lib/nickserver/reel_server.rb b/lib/nickserver/reel_server.rb index 9a7053b..79265ec 100644 --- a/lib/nickserver/reel_server.rb +++ b/lib/nickserver/reel_server.rb @@ -36,8 +36,8 @@ module Nickserver handler = handler_for(request) handler.respond_to params(request), request.headers rescue StandardError => e - puts e - puts e.backtrace.join "\n " + $stderr.puts e + $stderr.puts e.backtrace.join "\n " request.respond 500, "{}" end -- cgit v1.2.3 From 8ee1d1cb70bee8c938966e4e042b4929ced8b1a3 Mon Sep 17 00:00:00 2001 From: Azul Date: Fri, 30 Sep 2016 11:59:20 +0200 Subject: logging: use proper logger This way the logs do not interfere with test output --- lib/nickserver/dispatcher.rb | 5 ----- lib/nickserver/logging_responder.rb | 18 ++++++++++++++++++ lib/nickserver/reel_server.rb | 17 ++++++++++++----- 3 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 lib/nickserver/logging_responder.rb (limited to 'lib') diff --git a/lib/nickserver/dispatcher.rb b/lib/nickserver/dispatcher.rb index 26ad09e..71e71cf 100644 --- a/lib/nickserver/dispatcher.rb +++ b/lib/nickserver/dispatcher.rb @@ -39,10 +39,6 @@ module Nickserver def handle(request) handler_chain.handle request - rescue RuntimeError => exc - $stderr.puts "Error: #{exc}" - $stderr.puts exc.backtrace - ErrorResponse.new(exc.to_s) end def handler_chain @@ -64,7 +60,6 @@ module Nickserver def proxy_error_response exc = handler_chain.rescued_exceptions.first if exc - $stderr.puts " Error: #{exc}" Nickserver::Response.new 502, JSON.dump(error: exc.to_s) end diff --git a/lib/nickserver/logging_responder.rb b/lib/nickserver/logging_responder.rb new file mode 100644 index 0000000..6eb756f --- /dev/null +++ b/lib/nickserver/logging_responder.rb @@ -0,0 +1,18 @@ +module Nickserver + class LoggingResponder + + def initialize(responder, logger) + @responder = responder + @logger = logger + end + + def respond(status, body) + logger.info " -> #{status}" + responder.respond(status, body) + end + + protected + + attr_reader :responder, :logger + end +end diff --git a/lib/nickserver/reel_server.rb b/lib/nickserver/reel_server.rb index 79265ec..0ff4425 100644 --- a/lib/nickserver/reel_server.rb +++ b/lib/nickserver/reel_server.rb @@ -1,8 +1,11 @@ silence_warnings do require 'reel' end +require 'logger' +require 'nickserver/config' require 'nickserver/adapters/celluloid_http' require 'nickserver/dispatcher' +require 'nickserver/logging_responder' module Nickserver class ReelServer < Reel::Server::HTTP @@ -31,19 +34,20 @@ module Nickserver protected def handle_request(request) - puts "#{request.method} #{request.uri}" - puts " #{params(request)}" + logger.info "#{request.method} #{request.uri}" + logger.debug " #{params(request)}" handler = handler_for(request) handler.respond_to params(request), request.headers rescue StandardError => e - $stderr.puts e - $stderr.puts e.backtrace.join "\n " + logger.error e + logger.error e.backtrace.join "\n " request.respond 500, "{}" end def handler_for(request) # with reel the request is the responder - Dispatcher.new(request) + responder = LoggingResponder.new(request, logger) + Dispatcher.new(responder) end def params(request) @@ -54,5 +58,8 @@ module Nickserver end end + def logger + @logger ||= ::Logger.new Config.log_file + end end end -- cgit v1.2.3 From 3242f3f2e4eac9e3e38b1ba4da069475872a270b Mon Sep 17 00:00:00 2001 From: Azul Date: Fri, 30 Sep 2016 12:03:36 +0200 Subject: logger: log to STDOUT when run in foreground --- lib/nickserver/daemon.rb | 1 + 1 file changed, 1 insertion(+) (limited to 'lib') diff --git a/lib/nickserver/daemon.rb b/lib/nickserver/daemon.rb index 0f9e7bf..12ed30e 100644 --- a/lib/nickserver/daemon.rb +++ b/lib/nickserver/daemon.rb @@ -256,6 +256,7 @@ module Nickserver puts "\nShutting down..." exit(0) end + Config.log_file = STDOUT yield exit(0) end -- cgit v1.2.3 From c3499f703245b6493ddc94d27542a4b49a9bfc81 Mon Sep 17 00:00:00 2001 From: Azul Date: Fri, 30 Sep 2016 12:46:41 +0200 Subject: logger: log celluloid errors to default log --- lib/nickserver/reel_server.rb | 1 + 1 file changed, 1 insertion(+) (limited to 'lib') diff --git a/lib/nickserver/reel_server.rb b/lib/nickserver/reel_server.rb index 0ff4425..c378aca 100644 --- a/lib/nickserver/reel_server.rb +++ b/lib/nickserver/reel_server.rb @@ -15,6 +15,7 @@ module Nickserver end def initialize(host = "127.0.0.1", port = 3000) + Celluloid.logger = logger super(host, port, &method(:on_connection)) end -- cgit v1.2.3 From ab31d9ca7dca20c873a7240482d1736d0f6b6dae Mon Sep 17 00:00:00 2001 From: Azul Date: Fri, 30 Sep 2016 12:47:32 +0200 Subject: change default adapter to CelluloidHttp Turns out without this nickserver will not respond to multiple concurrent requests. --- lib/nickserver/source.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/nickserver/source.rb b/lib/nickserver/source.rb index ca2c34c..dc0669a 100644 --- a/lib/nickserver/source.rb +++ b/lib/nickserver/source.rb @@ -1,9 +1,11 @@ -require 'nickserver/adapters/http' +require 'nickserver/adapters/celluloid_http' module Nickserver class Source - def initialize(adapter = Nickserver::Adapters::Http.new) + DEFAULT_ADAPTER_CLASS = Nickserver::Adapters::CelluloidHttp + + def initialize(adapter = DEFAULT_ADAPTER_CLASS.new) @adapter = adapter end -- cgit v1.2.3