Module: RequestExceptionHandler

Defined in:
lib/request_exception_handler.rb

Overview

The mixin that provides the request_exception by default included into ActionController::Base

Constant Summary collapse

THREAD_LOCAL_NAME =
:_request_exception
@@parse_request_parameters_exception_handler =
lambda do |request, exception|
  RequestExceptionHandler.store_request_exception(exception)
  request_body = request.respond_to?(:body) ? request.body : request.raw_post
   logger = RequestExceptionHandler.logger
  if logger.debug?
    content_log = request_body
    if request_body.is_a?(StringIO)
      pos = request_body.pos
      content_log = request_body.read
    end
    logger.debug "#{exception.class.name} occurred while parsing request parameters." <<
                 "\nContents:\n#{content_log}\n"
    request_body.pos = pos if pos
  elsif logger.info?
    logger.info "#{exception.class.name} occurred while parsing request parameters."
  end
   content_type = if request.respond_to?(:content_mime_type)
    request.content_mime_type
  elsif request.respond_to?(:content_type_with_parameters)
    request.send :content_type_with_parameters # (legacy) ActionController::AbstractRequest
  else
    request.content_type
  end
  { "body" => request_body, "content_type" => content_type, "content_length" => request.content_length }
end
@@parse_request_parameters_exception_logger =
nil

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



52
53
54
# File 'lib/request_exception_handler.rb', line 52

def self.included(base)
  base.prepend_before_filter :check_request_exception
end

.loggerObject

Retrieves the Rails logger.



45
46
47
48
49
50
# File 'lib/request_exception_handler.rb', line 45

def self.logger
  @@parse_request_parameters_exception_logger ||=
    defined?(Rails.logger) ? Rails.logger :
      defined?(RAILS_DEFAULT_LOGGER) ? RAILS_DEFAULT_LOGGER :
        Logger.new(STDERR)
end

.reset_request_exceptionObject

Resets the current request_exception (to nil).



57
58
59
# File 'lib/request_exception_handler.rb', line 57

def self.reset_request_exception
  store_request_exception nil
end

.store_request_exception(exception) ⇒ Object

Resets the current request_exception (to nil).



64
65
66
# File 'lib/request_exception_handler.rb', line 64

def self.store_request_exception(exception)
  Thread.current.thread_variable_set THREAD_LOCAL_NAME, exception
end

Instance Method Details

#check_request_exceptionObject

Checks and raises a request_exception (gets prepended as a before filter).



94
95
96
97
98
# File 'lib/request_exception_handler.rb', line 94

def check_request_exception
  if e = request_exception
    raise e if e.is_a?(Exception)
  end
end

#request_exceptionObject

Retrieves and keeps track of the current request exception if any.



69
70
71
72
73
74
# File 'lib/request_exception_handler.rb', line 69

def request_exception
  return @_request_exception if defined? @_request_exception
  @_request_exception = Thread.current.thread_variable_get(THREAD_LOCAL_NAME)
  RequestExceptionHandler.reset_request_exception
  @_request_exception
end