snapframework/snap

Could you please add catchFinishWith for Handlers?

CristhianMotoche opened this issue · 2 comments

I want to integrate rollbar with my Snap web application. I want to log every user error or server error. I want to wrap all the routes using wrapSite.

In my Site.hs:

app :: SnapletInit App App
app = do
   ...
   wrapSite logIntoRollbar
   ...

In my case wrapSite expects a (Handler App App () -> Handler App App ()). Currently, my logIntoRollbar is something like this:

import Control.Exception.Lifted

logIntoRollbar :: Handler App App () -> Handler App App ()
logIntoRollbar handler = 
  bracket (handler >> getResponse) (checkAndSendRespToRollbar) finishWith

However, if during thehandler execution a badReq or a serverError occurs then any other code beyond that won't be executed, due to the finishEarly.

The catchFinishWith seems to solve this issue but it works in the Snap monad. It expects a Snap a and return a Snap (Either Response a).

I'd like to know if you add a catchFinishWithHandler :: Handler v k a -> Handler v k (Either Response a). I think it should be similar to bracketHandler which is a wrapper of bracketSnap

Sorry for the delay on this. I've been really busy. I agree that this seems like a useful thing. Unfortunately I don't have time to look at this right now. If you put together a pull request adding this, I'll be much more likely to get to it.

Hi @mightybyte . Sure thing! I'll be taking a look. Thanks for the answer!