Configuring proper sequence of Rack middlewares ...

kedar mhaswade
Tue, 06 Nov 2012 00:39:16 -0000

I am running into a situation where I can''t ensure the proper sequence
of
Rack middlewares. I have two middlewares in my Rails 3.0.9 stack:

1- ExceptionNotifier
2- ActionDispatch::ShowExceptions

The first one is a
gem<https://www.ruby-toolbox.com/projects/exception_notification>that
notifies me (via email) of any unhandled exception thrown by my app.
The second one is to handle the display of error pages. The call methods of
these two are straightforward. The first one calls its predecessor and
catches resulting exception, sends email and re-raises the same exception.
The second one just enhances already available functionality in Rails to
render properly formatted pages. The second one does not raise any
exception and thus renders the response and everything is all right.

In an initializer, I have a code <https://gist.github.com/4019271> (link
to
gist) that inserts the 1st one before the 2nd one.

But in reality, ActionDispatch::ShowException is always called first and
when I get an exceptional condition, the properly formatted error pages are
displayed, but email is never sent because the ExceptionNotifier is never
called.

Does that make sense? Anybody has any comment about how I can make it do
the right thing? (Call ExceptionNotifier first and ShowExceptions later).

Regards,
Kedar

PS: output of rake middleware with this setup:

use ActionDispatch::Static
use Rack::Lock
use ActiveSupport::Cache::Strategy::LocalCache
use Rack::Runtime
use Rails::Rack::Logger
*use ExceptionNotifier*
*use ActionDispatch::ShowExceptions*
use ActionDispatch::ShowExceptions
use ActionDispatch::RemoteIp
use Rack::Sendfile
use ActionDispatch::Callbacks
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ParamsParser
use Rack::MethodOverride
use ActionDispatch::Head
use ActionDispatch::BestStandardsSupport
use OAuth2::Provider::Rack::Middleware
use OmniAuth::Builder
run MyApp::Application.routes