class ActionDispatch::ShowExceptions

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. Every time 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.

Constants

FAILSAFE_RESPONSE

Public Class Methods

new(app, exceptions_app) click to toggle source
# File lib/action_dispatch/middleware/show_exceptions.rb, line 24
def initialize(app, exceptions_app)
  @app = app
  @exceptions_app = exceptions_app
end

Public Instance Methods

call(env) click to toggle source
# File lib/action_dispatch/middleware/show_exceptions.rb, line 29
def call(env)
  @app.call(env)
rescue Exception => exception
  if env['action_dispatch.show_exceptions'] == false
    raise exception
  else
    render_exception(env, exception)
  end
end

Private Instance Methods

pass_response(status) click to toggle source
# File lib/action_dispatch/middleware/show_exceptions.rb, line 54
def pass_response(status)
  [status, {"Content-Type" => "text/html; charset=#{Response.default_charset}", "Content-Length" => "0"}, []]
end
render_exception(env, exception) click to toggle source
# File lib/action_dispatch/middleware/show_exceptions.rb, line 41
def render_exception(env, exception)
  wrapper = ExceptionWrapper.new(env, exception)
  status  = wrapper.status_code
  env["action_dispatch.exception"] = wrapper.exception
  env["action_dispatch.original_path"] = env["PATH_INFO"]
  env["PATH_INFO"] = "/#{status}"
  response = @exceptions_app.call(env)
  response[1]['X-Cascade'] == 'pass' ? pass_response(status) : response
rescue Exception => failsafe_error
  $stderr.puts "Error during failsafe response: #{failsafe_error}\n  #{failsafe_error.backtrace * "\n  "}"
  FAILSAFE_RESPONSE
end