haskell-servant / haskell-servant/servant
Proper servant-server exception handling for warp/wai
- 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
Assessment
This issue has not been assessed yet.