class ActionDispatch::ShowExceptions

catches the exceptions and returns a FAILSAFE_RESPONSE.
If any exception happens inside the exceptions app, this middleware
will send an empty response as result with the correct status code.
If the application returns a “X-Cascade” pass response, this middleware
PATH_INFO to the exception status code and call the rack app.
store the exception in env, rewrite the
of ShowExceptions. Every time there is an exception, ShowExceptions will
The exceptions app should be passed as parameter on initialization
and calls an exceptions app that will wrap it in a format for the end user.
This middleware rescues any exception returned by the application

def call(env)

def call(env)
  request = ActionDispatch::Request.new env
  @app.call(env)
rescue Exception => exception
  if request.show_exceptions?
    render_exception(request, exception)
  else
    raise exception
  end
end

def initialize(app, exceptions_app)

def initialize(app, exceptions_app)
  @app = app
  @exceptions_app = exceptions_app
end

def pass_response(status)

def pass_response(status)
  [status, {"Content-Type" => "text/html; charset=#{Response.default_charset}", "Content-Length" => "0"}, []]
end

def render_exception(request, exception)

def render_exception(request, exception)
  backtrace_cleaner = request.get_header 'action_dispatch.backtrace_cleaner'
  wrapper = ExceptionWrapper.new(backtrace_cleaner, exception)
  status  = wrapper.status_code
  request.set_header "action_dispatch.exception", wrapper.exception
  request.set_header "action_dispatch.original_path", request.path_info
  request.path_info = "/#{status}"
  response = @exceptions_app.call(request.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