2009-12-22 18:11:21 -05:00
require 'action_dispatch/http/request'
2011-12-01 14:02:00 -05:00
require 'action_dispatch/middleware/exception_wrapper'
2011-11-22 09:36:58 -05:00
require 'active_support/deprecation'
2009-06-08 16:33:18 -04:00
2009-05-03 00:02:22 -04:00
module ActionDispatch
2011-12-01 15:15:42 -05:00
# This middleware rescues any exception returned by the application
# and wraps them in a format for the end user.
2009-05-03 00:02:22 -04:00
class ShowExceptions
2009-05-17 13:24:42 -04:00
RESCUES_TEMPLATE_PATH = File . join ( File . dirname ( __FILE__ ) , 'templates' )
FAILSAFE_RESPONSE = [ 500 , { 'Content-Type' = > 'text/html' } ,
2009-05-27 16:01:03 -04:00
[ " <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> " ] ]
2009-05-03 00:02:22 -04:00
2011-12-01 14:16:12 -05:00
class << self
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
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
end
2011-11-22 09:36:58 -05:00
def initialize ( app , consider_all_requests_local = nil )
ActiveSupport :: Deprecation . warn " Passing consider_all_requests_local option to ActionDispatch::ShowExceptions middleware no longer works " unless consider_all_requests_local . nil?
2009-05-03 00:02:22 -04:00
@app = app
end
def call ( env )
2010-10-18 17:05:22 -04:00
begin
2011-12-01 14:46:18 -05:00
response = @app . call ( env )
2010-10-18 17:05:22 -04:00
rescue Exception = > exception
2011-01-12 13:01:31 -05:00
raise exception if env [ 'action_dispatch.show_exceptions' ] == false
2010-04-30 19:40:42 -04:00
end
2010-10-18 17:05:22 -04:00
2011-12-03 05:38:25 -05:00
response || render_exception_with_failsafe ( env , exception )
2009-05-17 13:24:42 -04:00
end
2009-05-11 20:07:05 -04:00
2009-05-17 13:24:42 -04:00
private
2009-05-03 00:02:22 -04:00
2011-12-02 03:57:43 -05:00
# Define this method because some plugins were monkey patching it.
# Remove this after 3.2 is out with the other deprecations in this class.
def status_code ( * )
end
2011-12-01 15:15:42 -05:00
def render_exception_with_failsafe ( env , exception )
render_exception ( env , exception )
rescue Exception = > failsafe_error
$stderr . puts " Error during failsafe response: #{ failsafe_error } \n #{ failsafe_error . backtrace * " \n " } "
FAILSAFE_RESPONSE
end
2011-12-01 14:46:18 -05:00
def render_exception ( env , exception )
wrapper = ExceptionWrapper . new ( env , exception )
2009-05-03 00:02:22 -04:00
2011-12-01 14:46:18 -05:00
status = wrapper . status_code
locale_path = " #{ public_path } / #{ status } . #{ I18n . locale } .html " if I18n . locale
path = " #{ public_path } / #{ status } .html "
2009-05-03 00:02:22 -04:00
2011-12-01 14:46:18 -05:00
if locale_path && File . exist? ( locale_path )
render ( status , File . read ( locale_path ) )
elsif File . exist? ( path )
render ( status , File . read ( path ) )
else
render ( status , '' )
2009-05-03 00:02:22 -04:00
end
2011-12-01 14:46:18 -05:00
end
2009-05-03 00:02:22 -04:00
2011-12-01 14:46:18 -05:00
def render ( status , body )
[ status , { 'Content-Type' = > " text/html; charset= #{ Response . default_charset } " , 'Content-Length' = > body . bytesize . to_s } , [ body ] ]
end
2011-11-24 14:37:48 -05:00
2011-12-01 14:46:18 -05:00
# TODO: Make this a middleware initialization parameter once
2011-12-01 15:15:42 -05:00
# we removed the second option (which is deprecated)
2011-12-01 14:46:18 -05:00
def public_path
defined? ( Rails . public_path ) ? Rails . public_path : 'public_path'
end
2009-05-03 00:02:22 -04:00
end
end