on master help sign in
fixing HTTP/2's timeout handler.
commit65874cd5c4dd1c2bd0dfc63fbe104e77ed67cd64 authorKazu Yamamoto <kazu@iij.ad.jp> dateThu 26 Apr 2018, 09:44 (8 years ago) parent1d382df
2 files changed+9−6
warp/Network/Wai/Handler/Warp/HTTP2/Request.hs+3−5 warp/Network/Wai/Handler/Warp/HTTP2/Worker.hs+6−1
warp/Network/Wai/Handler/Warp/HTTP2/Request.hs+3−5
@@ -24,9 +24,8 @@ import System.IO.Unsafe (unsafePerformIO)
2424import Network.Wai.Handler.Warp.HTTP2.Types
2525import Network.Wai.Handler.Warp.HashMap (hashByteString)
2626import Network.Wai.Handler.Warp.Imports
27−import Network.Wai.Handler.Warp.Request (pauseTimeoutKey, getFileInfoKey)
27+import Network.Wai.Handler.Warp.Request (getFileInfoKey)
2828import qualified Network.Wai.Handler.Warp.Settings as S (Settings, settingsNoParsePath)
29−import qualified Network.Wai.Handler.Warp.Timeout as Timeout
3029import Network.Wai.Handler.Warp.Types
3130
3231type MkReq = (TokenHeaderList,ValueTable) -> (Maybe Int,IO ByteString) -> IO (Request,InternalInfo)
@@ -79,10 +78,9 @@ mkRequest' ii1 settings addr ref (reqths,reqvt) (bodylen,body) = return (req,ii)
7978 !path = H.extractPath unparsedPath
8079 !rawPath = if S.settingsNoParsePath settings then unparsedPath else path
8180 !h = hashByteString rawPath
81+ -- timeout handler must be overwritten with worker's one.
8282 !ii = toInternalInfo ii1 h
83− !th = threadHandle ii -- th must be overwritten with worker's one.
84− !vaultValue = Vault.insert pauseTimeoutKey (Timeout.pause th)
85− $ Vault.insert getFileInfoKey (getFileInfo ii)
83+ !vaultValue = Vault.insert getFileInfoKey (getFileInfo ii)
8684 $ Vault.insert getHTTP2DataKey (readIORef ref)
8785 $ Vault.insert setHTTP2DataKey (writeIORef ref)
8886 $ Vault.insert modifyHTTP2DataKey (modifyIORef' ref)
warp/Network/Wai/Handler/Warp/HTTP2/Worker.hs+6−1
@@ -16,12 +16,14 @@ import Control.Exception (SomeException(..), AsyncException(..))
1616import qualified Control.Exception as E
1717import Data.ByteString.Builder (byteString)
1818import Data.IORef
19+import qualified Data.Vault.Lazy as Vault
1920import Network.HPACK
2021import Network.HPACK.Token
2122import qualified Network.HTTP.Types as H
2223import Network.HTTP2
2324import Network.HTTP2.Priority
2425import Network.Wai
26+import qualified Network.Wai.Handler.Warp.Timeout as Timeout
2527import Network.Wai.Internal (Response(..), ResponseReceived(..), ResponseReceived(..))
2628
2729import Network.Wai.Handler.Warp.FileInfoCache
@@ -31,6 +33,7 @@ import Network.Wai.Handler.Warp.HTTP2.Manager
3133import Network.Wai.Handler.Warp.HTTP2.Request
3234import Network.Wai.Handler.Warp.HTTP2.Types
3335import Network.Wai.Handler.Warp.Imports hiding (insert)
36+import Network.Wai.Handler.Warp.Request (pauseTimeoutKey)
3437import qualified Network.Wai.Handler.Warp.Response as R
3538import qualified Network.Wai.Handler.Warp.Settings as S
3639import qualified Network.Wai.Handler.Warp.Timeout as T
@@ -244,7 +247,9 @@ worker ctx@Context{inputQ,controlQ} set app responder tm = do
244247 T.resume th
245248 T.tickle th
246249 let ii' = ii { threadHandle = th }
247− app req $ responder ii' reqvt tcont strm req
250+ vaultValue = Vault.insert pauseTimeoutKey (Timeout.pause th) $ vault req
251+ req' = req { vault = vaultValue }
252+ app req' $ responder ii' reqvt tcont strm req'
248253 cont1 <- case ex of
249254 Right ResponseReceived -> return True
250255 Left e@(SomeException _)