diff options
Diffstat (limited to 'actionpack/lib/action_dispatch')
| -rw-r--r-- | actionpack/lib/action_dispatch/http/filter_parameters.rb | 4 | ||||
| -rw-r--r-- | actionpack/lib/action_dispatch/middleware/debug_exceptions.rb | 24 | 
2 files changed, 25 insertions, 3 deletions
| diff --git a/actionpack/lib/action_dispatch/http/filter_parameters.rb b/actionpack/lib/action_dispatch/http/filter_parameters.rb index ec86b8bc47..ec012ad02d 100644 --- a/actionpack/lib/action_dispatch/http/filter_parameters.rb +++ b/actionpack/lib/action_dispatch/http/filter_parameters.rb @@ -9,8 +9,8 @@ module ActionDispatch      # sub-hashes of the params hash to filter. Filtering only certain sub-keys      # from a hash is possible by using the dot notation: 'credit_card.number'.      # If a block is given, each key and value of the params hash and all -    # sub-hashes is passed to it, where the value or the key can be replaced using -    # String#replace or similar method. +    # sub-hashes are passed to it, where the value or the key can be replaced using +    # String#replace or similar methods.      #      #   env["action_dispatch.parameter_filter"] = [:password]      #   => replaces the value to all keys matching /password/i with "[FILTERED]" diff --git a/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb b/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb index 511306eb0e..33edad8bd9 100644 --- a/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb +++ b/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb @@ -50,10 +50,18 @@ module ActionDispatch        end      end -    def initialize(app, routes_app = nil, response_format = :default) +    cattr_reader :interceptors, instance_accessor: false, default: [] + +    def self.register_interceptor(object = nil, &block) +      interceptor = object || block +      interceptors << interceptor +    end + +    def initialize(app, routes_app = nil, response_format = :default, interceptors = self.class.interceptors)        @app             = app        @routes_app      = routes_app        @response_format = response_format +      @interceptors    = interceptors      end      def call(env) @@ -67,12 +75,26 @@ module ActionDispatch        response      rescue Exception => exception +      invoke_interceptors(request, exception)        raise exception unless request.show_exceptions?        render_exception(request, exception)      end      private +      def invoke_interceptors(request, exception) +        backtrace_cleaner = request.get_header("action_dispatch.backtrace_cleaner") +        wrapper = ExceptionWrapper.new(backtrace_cleaner, exception) + +        @interceptors.each do |interceptor| +          begin +            interceptor.call(request, exception) +          rescue Exception +            log_error(request, wrapper) +          end +        end +      end +        def render_exception(request, exception)          backtrace_cleaner = request.get_header("action_dispatch.backtrace_cleaner")          wrapper = ExceptionWrapper.new(backtrace_cleaner, exception) | 
