mirror of
https://github.com/discourse/discourse.git
synced 2024-12-04 16:53:39 +08:00
32 lines
1.0 KiB
Ruby
32 lines
1.0 KiB
Ruby
|
# since all the rescue from clauses are not caught by the application controller for matches
|
||
|
# we need to handle certain exceptions here
|
||
|
module Middleware
|
||
|
class DiscoursePublicExceptions < ::ActionDispatch::PublicExceptions
|
||
|
|
||
|
def initialize(path)
|
||
|
super
|
||
|
end
|
||
|
|
||
|
def call(env)
|
||
|
# this is so so gnarly
|
||
|
# sometimes we leak out exceptions prior to creating a controller instance
|
||
|
# this can happen if we have an exception in a route constraint in some cases
|
||
|
# this code re-dispatches the exception to our application controller so we can
|
||
|
# properly translate the exception to a page
|
||
|
exception = env["action_dispatch.exception"]
|
||
|
response = ActionDispatch::Response.new
|
||
|
|
||
|
if exception
|
||
|
fake_controller = ApplicationController.new
|
||
|
fake_controller.response = response
|
||
|
|
||
|
if ApplicationController.rescue_with_handler(exception, object: fake_controller)
|
||
|
return [response.status, response.headers, response.body]
|
||
|
end
|
||
|
end
|
||
|
super
|
||
|
end
|
||
|
|
||
|
end
|
||
|
end
|