From 847fa4c7dd5751f410750a2c819c91f2aa89f903 Mon Sep 17 00:00:00 2001 From: Grey Baker Date: Fri, 18 Sep 2015 21:31:35 +0100 Subject: [PATCH] Only capture handled exceptions if they are 5xx and handled by default handler --- lib/raven/integrations/rack.rb | 2 +- lib/raven/integrations/rails.rb | 5 +++++ .../middleware/public_exceptions_catcher.rb | 16 ++++++++++++++++ spec/raven/integrations/rack_spec.rb | 18 +----------------- 4 files changed, 23 insertions(+), 18 deletions(-) create mode 100644 lib/raven/integrations/rails/middleware/public_exceptions_catcher.rb diff --git a/lib/raven/integrations/rack.rb b/lib/raven/integrations/rack.rb index 9d128a896..b2d030215 100644 --- a/lib/raven/integrations/rack.rb +++ b/lib/raven/integrations/rack.rb @@ -60,7 +60,7 @@ def call(env) raise end - error = env['rack.exception'] || env['sinatra.error'] || env['action_dispatch.exception'] + error = env['rack.exception'] || env['sinatra.error'] Raven::Rack.capture_exception(error, env) if error diff --git a/lib/raven/integrations/rails.rb b/lib/raven/integrations/rails.rb index e10639865..2ca9b227f 100644 --- a/lib/raven/integrations/rails.rb +++ b/lib/raven/integrations/rails.rb @@ -36,6 +36,11 @@ class Rails < ::Rails::Railtie ::ActionDispatch::ShowExceptions.send(:include, Raven::Rails::Middleware::DebugExceptionsCatcher) end end + + if defined?(::ActionDispatch::PublicExceptions) + require 'raven/integrations/rails/middleware/public_exceptions_catcher' + ::ActionDispatch::PublicExceptions.send(:include, Raven::Rails::Middleware::PublicExceptionsCatcher) + end end rake_tasks do diff --git a/lib/raven/integrations/rails/middleware/public_exceptions_catcher.rb b/lib/raven/integrations/rails/middleware/public_exceptions_catcher.rb new file mode 100644 index 000000000..a6b13d848 --- /dev/null +++ b/lib/raven/integrations/rails/middleware/public_exceptions_catcher.rb @@ -0,0 +1,16 @@ +module Raven + class Rails + module Middleware + module PublicExceptionsCatcher + def self.included(base) + base.send(:alias_method_chain, :call, :raven) + end + + def call_with_raven(env) + Raven::Rack.capture_exception(env['action_dispatch.exception'], env) + call_without_raven(env) + end + end + end + end +end diff --git a/spec/raven/integrations/rack_spec.rb b/spec/raven/integrations/rack_spec.rb index 422783566..a91cb6374 100644 --- a/spec/raven/integrations/rack_spec.rb +++ b/spec/raven/integrations/rack_spec.rb @@ -46,22 +46,6 @@ stack.call(env) end - it 'should capture rails errors when ActionDispatch::ShowExceptions is enabled' do - exception = build_exception - env = {} - - expect(Raven::Rack).to receive(:capture_exception).with(exception, env) - - app = lambda do |e| - e['action_dispatch.exception'] = exception - [200, {}, ['okay']] - end - - stack = Raven::Rack.new(app) - - stack.call(env) - end - it 'should clear context after app is called' do Raven::Context.current.tags[:environment] = :test @@ -102,7 +86,7 @@ end stack = Raven::Rack.new(Rack::Lint.new(app)) - expect { stack.call(env) }.to_not raise_error(Rack::Lint::LintError) + expect { stack.call(env) }.to_not raise_error end end