snapframework / snap

Top-level package for the official Snap Framework libraries, includes the snaplets API as well as infrastructure for sessions, auth, and templates.
http://snapframework.com/
BSD 3-Clause "New" or "Revised" License
455 stars 68 forks source link

Could you please add catchFinishWith for Handlers? #203

Open CristhianMotoche opened 6 years ago

CristhianMotoche commented 6 years ago

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

mightybyte commented 6 years ago

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.

CristhianMotoche commented 6 years ago

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