File tree Expand file tree Collapse file tree 2 files changed +14
-10
lines changed
servant-server/src/Servant/Server Expand file tree Collapse file tree 2 files changed +14
-10
lines changed Original file line number Diff line number Diff line change @@ -23,6 +23,7 @@ module Servant.Server.Internal
23
23
, module Servant.Server.Internal.ServantErr
24
24
) where
25
25
26
+ import Control.Exception (finally )
26
27
import Control.Monad.Trans (liftIO )
27
28
import qualified Data.ByteString as B
28
29
import qualified Data.ByteString.Char8 as BC8
@@ -400,11 +401,13 @@ instance HasServer Raw context where
400
401
type ServerT Raw m = Application
401
402
402
403
route Proxy _ rawApplication = RawRouter $ \ env request respond -> do
403
- (r, _) <- runDelayed rawApplication env request
404
- case r of
405
- Route app -> app request (respond . Route )
406
- Fail a -> respond $ Fail a
407
- FailFatal e -> respond $ FailFatal e
404
+ (r, cleanup) <- runDelayed rawApplication env request
405
+ go r request respond `finally` cleanup
406
+
407
+ where go r request respond = case r of
408
+ Route app -> app request (respond . Route )
409
+ Fail a -> respond $ Fail a
410
+ FailFatal e -> respond $ FailFatal e
408
411
409
412
-- | If you use 'ReqBody' in one of the endpoints for your API,
410
413
-- this automatically requires your server-side handler to be a function
Original file line number Diff line number Diff line change 9
9
{-# LANGUAGE TupleSections #-}
10
10
module Servant.Server.Internal.RoutingApplication where
11
11
12
+ import Control.Exception (bracket )
12
13
import Control.Monad (ap , liftM )
13
14
import Control.Monad.Trans (MonadIO (.. ))
14
15
import Control.Monad.Trans.Except (runExceptT )
@@ -272,11 +273,11 @@ runAction :: Delayed env (Handler a)
272
273
-> (RouteResult Response -> IO r )
273
274
-> (a -> RouteResult Response )
274
275
-> IO r
275
- runAction action env req respond k = do
276
- (routeResult, cleanup) <- runDelayed action env req
277
- resp <- go routeResult
278
- cleanup
279
- respond resp
276
+ runAction action env req respond k =
277
+ bracket ( runDelayed action env req)
278
+ snd
279
+ ( \ (res, _) -> go res >>= respond)
280
+
280
281
where
281
282
go (Fail e) = return $ Fail e
282
283
go (FailFatal e) = return $ FailFatal e
You can’t perform that action at this time.
0 commit comments