@@ -50,6 +50,8 @@ import Servant.API.ResponseHeaders (Headers, getResponse, GetHeaders,
5050 getHeaders)
5151import Servant.Common.Text (FromText, fromText)
5252
53+import Servant.Server.Internal.ServantErr
54+
5355data ReqBodyState = Uncalled
5456 | Called !B.ByteString
5557 | Done !B.ByteString
@@ -180,7 +182,7 @@ class HasServer layout where
180182 route :: Proxy layout -> Server' layout -> RoutingApplication
181183
182184type Server layout = Server' (Canonicalize layout)
183−type Server' layout = ServerT' layout (EitherT (Int, String) IO)
185+type Server' layout = ServerT' layout (EitherT ServantErr IO)
184186type ServerT layout m = ServerT' (Canonicalize layout) m
185187
186188-- * Instances
@@ -266,10 +268,8 @@ instance HasServer Delete where
266268 | pathIsEmpty request && requestMethod request == methodDelete = do
267269 e <- runEitherT action
268270 respond $ succeedWith $ case e of
269− Right () ->
270− responseLBS status204 [] ""
271− Left (status, message) ->
272− responseLBS (mkStatus status (cs message)) [] (cs message)
271+ Right () -> responseLBS status204 [] ""
272+ Left err -> responseServantErr err
273273 | pathIsEmpty request && requestMethod request /= methodDelete =
274274 respond $ failWith WrongMethod
275275 | otherwise = respond $ failWith NotFound
@@ -305,8 +305,7 @@ instance
305305 Nothing -> failWith UnsupportedMediaType
306306 Just (contentT, body) -> succeedWith $
307307 responseLBS ok200 [ ("Content-Type" , cs contentT)] body
308− Left (status, message) -> succeedWith $
309− responseLBS (mkStatus status (cs message)) [] (cs message)
308+ Left err -> succeedWith $ responseServantErr err
310309 | pathIsEmpty request && requestMethod request /= methodGet =
311310 respond $ failWith WrongMethod
312311 | otherwise = respond $ failWith NotFound
@@ -325,8 +324,7 @@ instance
325324 e <- runEitherT action
326325 respond . succeedWith $ case e of
327326 Right () -> responseLBS noContent204 [] ""
328− Left (status, message) ->
329− responseLBS (mkStatus status (cs message)) [] (cs message)
327+ Left err -> responseServantErr err
330328 | pathIsEmpty request && requestMethod request /= methodGet =
331329 respond $ failWith WrongMethod
332330 | otherwise = respond $ failWith NotFound
@@ -352,8 +350,7 @@ instance
352350 Nothing -> failWith UnsupportedMediaType
353351 Just (contentT, body) -> succeedWith $
354352 responseLBS ok200 ( ("Content-Type" , cs contentT) : headers) body
355− Left (status, message) -> succeedWith $
356− responseLBS (mkStatus status (cs message)) [] (cs message)
353+ Left err -> succeedWith $ responseServantErr err
357354 | pathIsEmpty request && requestMethod request /= methodGet =
358355 respond $ failWith WrongMethod
359356 | otherwise = respond $ failWith NotFound
@@ -422,8 +419,7 @@ instance
422419 Nothing -> failWith UnsupportedMediaType
423420 Just (contentT, body) -> succeedWith $
424421 responseLBS status201 [ ("Content-Type" , cs contentT)] body
425− Left (status, message) -> succeedWith $
426− responseLBS (mkStatus status (cs message)) [] (cs message)
422+ Left err -> succeedWith $ responseServantErr err
427423 | pathIsEmpty request && requestMethod request /= methodPost =
428424 respond $ failWith WrongMethod
429425 | otherwise = respond $ failWith NotFound
@@ -441,8 +437,7 @@ instance
441437 e <- runEitherT action
442438 respond . succeedWith $ case e of
443439 Right () -> responseLBS noContent204 [] ""
444− Left (status, message) ->
445− responseLBS (mkStatus status (cs message)) [] (cs message)
440+ Left err -> responseServantErr err
446441 | pathIsEmpty request && requestMethod request /= methodPost =
447442 respond $ failWith WrongMethod
448443 | otherwise = respond $ failWith NotFound
@@ -468,8 +463,7 @@ instance
468463 Nothing -> failWith UnsupportedMediaType
469464 Just (contentT, body) -> succeedWith $
470465 responseLBS status201 ( ("Content-Type" , cs contentT) : headers) body
471− Left (status, message) -> succeedWith $
472− responseLBS (mkStatus status (cs message)) [] (cs message)
466+ Left err -> succeedWith $ responseServantErr err
473467 | pathIsEmpty request && requestMethod request /= methodPost =
474468 respond $ failWith WrongMethod
475469 | otherwise = respond $ failWith NotFound
@@ -505,8 +499,7 @@ instance
505499 Nothing -> failWith UnsupportedMediaType
506500 Just (contentT, body) -> succeedWith $
507501 responseLBS status200 [ ("Content-Type" , cs contentT)] body
508− Left (status, message) -> succeedWith $
509− responseLBS (mkStatus status (cs message)) [] (cs message)
502+ Left err -> succeedWith $ responseServantErr err
510503 | pathIsEmpty request && requestMethod request /= methodPut =
511504 respond $ failWith WrongMethod
512505 | otherwise = respond $ failWith NotFound
@@ -524,8 +517,7 @@ instance
524517 e <- runEitherT action
525518 respond . succeedWith $ case e of
526519 Right () -> responseLBS noContent204 [] ""
527− Left (status, message) ->
528− responseLBS (mkStatus status (cs message)) [] (cs message)
520+ Left err -> responseServantErr err
529521 | pathIsEmpty request && requestMethod request /= methodPut =
530522 respond $ failWith WrongMethod
531523 | otherwise = respond $ failWith NotFound
@@ -551,8 +543,7 @@ instance
551543 Nothing -> failWith UnsupportedMediaType
552544 Just (contentT, body) -> succeedWith $
553545 responseLBS status200 ( ("Content-Type" , cs contentT) : headers) body
554− Left (status, message) -> succeedWith $
555− responseLBS (mkStatus status (cs message)) [] (cs message)
546+ Left err -> succeedWith $ responseServantErr err
556547 | pathIsEmpty request && requestMethod request /= methodPut =
557548 respond $ failWith WrongMethod
558549 | otherwise = respond $ failWith NotFound
@@ -586,8 +577,7 @@ instance
586577 Nothing -> failWith UnsupportedMediaType
587578 Just (contentT, body) -> succeedWith $
588579 responseLBS status200 [ ("Content-Type" , cs contentT)] body
589− Left (status, message) -> succeedWith $
590− responseLBS (mkStatus status (cs message)) [] (cs message)
580+ Left err -> succeedWith $ responseServantErr err
591581 | pathIsEmpty request && requestMethod request /= methodPatch =
592582 respond $ failWith WrongMethod
593583 | otherwise = respond $ failWith NotFound
@@ -605,8 +595,7 @@ instance
605595 e <- runEitherT action
606596 respond . succeedWith $ case e of
607597 Right () -> responseLBS noContent204 [] ""
608− Left (status, message) ->
609− responseLBS (mkStatus status (cs message)) [] (cs message)
598+ Left err -> responseServantErr err
610599 | pathIsEmpty request && requestMethod request /= methodPatch =
611600 respond $ failWith WrongMethod
612601 | otherwise = respond $ failWith NotFound
@@ -632,8 +621,7 @@ instance
632621 Nothing -> failWith UnsupportedMediaType
633622 Just (contentT, body) -> succeedWith $
634623 responseLBS status200 ( ("Content-Type" , cs contentT) : headers) body
635− Left (status, message) -> succeedWith $
636− responseLBS (mkStatus status (cs message)) [] (cs message)
624+ Left err -> succeedWith $ responseServantErr err
637625 | pathIsEmpty request && requestMethod request /= methodPatch =
638626 respond $ failWith WrongMethod
639627 | otherwise = respond $ failWith NotFound