Class: ActionDispatch::ShowExceptions

Inherits:
Object
  • Object
show all
Defined in:
lib/action_dispatch/middleware/show_exceptions.rb

Overview

This middleware rescues any exception returned by the application and calls an exceptions app that will wrap it in a format for the end user.

The exceptions app should be passed as parameter on initialization of ShowExceptions. Everytime there is an exception, ShowExceptions will store the exception in env, rewrite the PATH_INFO to the exception status code and call the rack app.

If the application returns a “X-Cascade” pass response, this middleware will send an empty response as result with the correct status code. If any exception happens inside the exceptions app, this middleware catches the exceptions and returns a FAILSAFE_RESPONSE.

Constant Summary collapse

FAILSAFE_RESPONSE =
[500, {'Content-Type' => 'text/html'},
      ["<html><body><h1>500 Internal Server Error</h1>" <<
"If you are the administrator of this website, then please read this web " <<
"application's log file and/or the web server's log file to find out what " <<
"went wrong.</body></html>"]]

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app, exceptions_app = nil) ⇒ ShowExceptions

Returns a new instance of ShowExceptions.



39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/action_dispatch/middleware/show_exceptions.rb', line 39

def initialize(app, exceptions_app = nil)
  if [true, false].include?(exceptions_app)
    ActiveSupport::Deprecation.warn "Passing consider_all_requests_local option to ActionDispatch::ShowExceptions middleware no longer works"
    exceptions_app = nil
  end

  if exceptions_app.nil?
    raise ArgumentError, "You need to pass an exceptions_app when initializing ActionDispatch::ShowExceptions. " \
      "In case you want to render pages from a public path, you can use ActionDispatch::PublicExceptions.new('path/to/public')"
  end

  @app = app
  @exceptions_app = exceptions_app
end

Class Method Details

.rescue_responsesObject



26
27
28
29
30
# File 'lib/action_dispatch/middleware/show_exceptions.rb', line 26

def rescue_responses
  ActiveSupport::Deprecation.warn "ActionDispatch::ShowExceptions.rescue_responses is deprecated. " \
    "Please configure your exceptions using a railtie or in your application config instead."
  ExceptionWrapper.rescue_responses
end

.rescue_templatesObject



32
33
34
35
36
# File 'lib/action_dispatch/middleware/show_exceptions.rb', line 32

def rescue_templates
  ActiveSupport::Deprecation.warn "ActionDispatch::ShowExceptions.rescue_templates is deprecated. " \
    "Please configure your exceptions using a railtie or in your application config instead."
  ExceptionWrapper.rescue_templates
end

Instance Method Details

#call(env) ⇒ Object



54
55
56
57
58
59
60
61
62
# File 'lib/action_dispatch/middleware/show_exceptions.rb', line 54

def call(env)
  begin
    response  = @app.call(env)
  rescue Exception => exception
    raise exception if env['action_dispatch.show_exceptions'] == false
  end

  response || render_exception(env, exception)
end