on master help sign in
Slightly nicer exception displays yesodweb/yesod#695
commit7872a8b1817a137957083f2b5cce32d776021788 authorMichael Snoyman <michael@snoyman.com> dateWed 19 Mar 2014, 13:28 (13 years ago) parent7a5f956
3 files changed+20−4
warp/Network/Wai/Handler/Warp/Timeout.hs+10−2 warp/Network/Wai/Handler/Warp/Types.hs+9−1 warp/warp.cabal+1−1
warp/Network/Wai/Handler/Warp/Timeout.hs+10−2
@@ -1,5 +1,6 @@
11{-# LANGUAGE CPP #-}
22{-# LANGUAGE BangPatterns #-}
3+{-# LANGUAGE DeriveDataTypeable #-}
34{-# LANGUAGE UnboxedTuples, MagicHash #-}
45
56-- |
@@ -46,13 +47,14 @@ import GHC.Conc (ThreadId(..))
4647import GHC.Exts (mkWeak#)
4748import GHC.IO (IO (IO))
4849#endif
49−import Control.Concurrent (threadDelay, myThreadId, killThread)
50+import Control.Concurrent (threadDelay, myThreadId)
5051import qualified Control.Exception as E
5152import GHC.Weak (Weak (..))
5253import Network.Wai.Handler.Warp.IORef (IORef)
5354import qualified Network.Wai.Handler.Warp.IORef as I
5455import Network.Wai.Handler.Warp.Thread
5556import System.Mem.Weak (deRefWeak)
57+import Data.Typeable (Typeable)
5658
5759----------------------------------------------------------------
5860
@@ -130,7 +132,13 @@ registerKillThread m = do
130132-- deRefWeak checks if ThreadId referenced by the weak reference
131133-- exists. If exists, it means that the thread is alive.
132134killIfExist :: Weak ThreadId -> TimeoutAction
133−killIfExist wtid = deRefWeak wtid >>= maybe (return ()) killThread
135+killIfExist wtid = deRefWeak wtid >>= maybe (return ()) (flip E.throwTo TimeoutThread)
136+
137+data TimeoutThread = TimeoutThread
138+ deriving Typeable
139+instance E.Exception TimeoutThread
140+instance Show TimeoutThread where
141+ show TimeoutThread = "Thread killed by Warp's timeout reaper"
134142
135143#if !MIN_VERSION_base(4,6,0)
136144mkWeakThreadId :: ThreadId -> IO (Weak ThreadId)
warp/Network/Wai/Handler/Warp/Types.hs+9−1
@@ -45,7 +45,15 @@ data InvalidRequest = NotEnoughLines [String]
4545 | IncompleteHeaders
4646 | ConnectionClosedByPeer
4747 | OverLargeHeader
48− deriving (Eq, Show, Typeable)
48+ deriving (Eq, Typeable)
49+
50+instance Show InvalidRequest where
51+ show (NotEnoughLines xs) = "Warp: Incomplete request headers, received: " ++ show xs
52+ show (BadFirstLine s) = "Warp: Invalid first line of request: " ++ show s
53+ show NonHttp = "Warp: Request line specified a non-HTTP request"
54+ show IncompleteHeaders = "Warp: Request headers did not finish transmission"
55+ show ConnectionClosedByPeer = "Warp: Client closed connection prematurely"
56+ show OverLargeHeader = "Warp: Request headers too large, possible memory attack detected. Closing connection."
4957
5058instance Exception InvalidRequest
5159
warp/warp.cabal+1−1
@@ -1,5 +1,5 @@
11Name: warp
2−Version: 2.1.1.2
2+Version: 2.1.1.3
33Synopsis: A fast, light-weight web server for WAI applications.
44License: MIT
55License-file: LICENSE