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