haskell-servant / haskell-servant/servant

Proper servant-server exception handling for warp/wai

Open
#1,192 8 comments 3 reactions 0 assignees View on GitHub
Dominant language
Haskell
Stars
2k
Forks
427
Avg merge
2d 23h
Merged PRs (30d)
5

Description

I spent some time reading through issue #309 and the associated discussions in yesodweb/wai#496 and PR #954 about how `servant-server` appears to incorrectly handle exceptions with respect to how `wai`/`warp` expects to operate.

The unfortunate side effect of this behavior is that any uncaught exceptions within a Servant application will _not_ be registered by any `wai` middleware as a 500 exception, which can seriously negatively impact user experience around automated logging, metrics tracking, etc.

As far as I can tell, the solution proposed in #309 around deeply evaluating `Response`s in `toApplication` before creating a `ResponseReceived` (to provide to `wai`) won't work for ensuring that any impure exceptions in thunks are caught (`Response` cannot have a valid `NFData` instance to the best of my knowledg).

The machinery for forcing evaluation, catching exceptions, and generating correct `wai` `Response`s would have to live somewhere else in Servant, probably using a similar combination of techniques as to what Yesod uses:

https://github.com/yesodweb/yesod/blob/6a7370a9e61ca48787c539842602b161c219e6ba/yesod-core/src/Yesod/Core/Internal/Run.hs#L43-L48

https://github.com/yesodweb/yesod/blob/6a7370a9e61ca48787c539842602b161c219e6ba/yesod-core/src/Yesod/Core/Internal/Run.hs#L50-L55

https://github.com/yesodweb/yesod/blob/6a7370a9e61ca48787c539842602b161c219e6ba/yesod-core/src/Yesod/Core/Internal/Run.hs#L104-L130

---

I'm opening a new issue since it seems as if the old ones have languished a bit, and the strategies for handling this problem outlined in them don't appear to actually address the core issue here.

Does anyone have thoughts on what a good architecture for this might look like?

Perhaps some pointers towards code paths within Servant that would allow us to implement the correct behavior, even just as an opt-in for users who want to ensure that middleware operates as-expected?

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.