on master help sign in
moving length stuff from Stream to OpenState.
commit7559404fa1c9fc3573dcf3422e28a4fa0d330103 authorKazu Yamamoto <kazu@iij.ad.jp> dateWed 22 Jun 2016, 16:41 (10 years ago) parentdc5a2fe
2 files changed+16−19
warp/Network/Wai/Handler/Warp/HTTP2/Receiver.hs+9−10 warp/Network/Wai/Handler/Warp/HTTP2/Types.hs+7−9
warp/Network/Wai/Handler/Warp/HTTP2/Receiver.hs+9−10
@@ -100,7 +100,7 @@ frameReceiver ctx mkreq recvN = loop 0 `E.catch` sendGoaway
100100 control ftyp header pl ctx
101101 | otherwise = do
102102 checkContinued
103− !strm@Stream{streamState,streamContentLength,streamPrecedence} <- getStream
103+ !strm@Stream{streamState,streamPrecedence} <- getStream
104104 pl <- recvN payloadLength
105105 state <- readIORef streamState
106106 state' <- stream ftyp header pl ctx state strm
@@ -117,10 +117,10 @@ frameReceiver ctx mkreq recvN = loop 0 `E.catch` sendGoaway
117117 Open (HasBody tbl@(_,reqvt) pri) -> do
118118 resetContinued
119119 q <- newTQueueIO
120+ let !mcl = readInt <$> getHeaderValue tokenContentLength reqvt
120121 writeIORef streamPrecedence $ toPrecedence pri
121− writeIORef streamState (Open (Body q))
122− let mcl = readInt <$> getHeaderValue tokenContentLength reqvt
123− writeIORef streamContentLength mcl
122+ bodyLength <- newIORef 0
123+ writeIORef streamState $ Open (Body q mcl bodyLength)
124124 readQ <- newReadBody q
125125 bodySource <- mkSource readQ
126126 let (!req, !ii) = mkreq tbl (readSource bodySource)
@@ -257,7 +257,7 @@ stream FrameHeaders header@FrameHeader{flags} bs ctx (Open JustOpened) Stream{st
257257 let !siz = BS.length frag
258258 return $ Open $ Continued [frag] siz 1 endOfStream pri
259259
260−stream FrameHeaders header@FrameHeader{flags} bs _ (Open (Body q)) _ = do
260+stream FrameHeaders header@FrameHeader{flags} bs _ (Open (Body q _ _)) _ = do
261261 -- trailer is not supported.
262262 -- let's read and ignore it.
263263 HeadersFrame _ _ <- guardIt $ decodeHeadersFrame header bs
@@ -272,13 +272,13 @@ stream FrameHeaders header@FrameHeader{flags} bs _ (Open (Body q)) _ = do
272272stream FrameData
273273 header@FrameHeader{flags,payloadLength,streamId}
274274 bs
275− Context{controlQ} s@(Open (Body q))
276− Stream{streamNumber,streamBodyLength,streamContentLength} = do
275+ Context{controlQ} s@(Open (Body q mcl bodyLength))
276+ Stream{streamNumber} = do
277277 DataFrame body <- guardIt $ decodeDataFrame header bs
278278 let !endOfStream = testEndStream flags
279− len0 <- readIORef streamBodyLength
279+ len0 <- readIORef bodyLength
280280 let !len = len0 + payloadLength
281− writeIORef streamBodyLength len
281+ writeIORef bodyLength len
282282 when (payloadLength /= 0) $ do
283283 let !frame1 = windowUpdateFrame 0 payloadLength
284284 !frame2 = windowUpdateFrame streamNumber payloadLength
@@ -286,7 +286,6 @@ stream FrameData
286286 enqueueControl controlQ $ CFrame frame
287287 atomically $ writeTQueue q body
288288 if endOfStream then do
289− mcl <- readIORef streamContentLength
290289 case mcl of
291290 Nothing -> return ()
292291 Just cl -> when (cl /= len) $ E.throwIO $ StreamError ProtocolError streamId
warp/Network/Wai/Handler/Warp/HTTP2/Types.hs+7−9
@@ -149,6 +149,9 @@ data OpenState =
149149 | NoBody (TokenHeaderList,ValueTable) !Priority
150150 | HasBody (TokenHeaderList,ValueTable) !Priority
151151 | Body !(TQueue ByteString)
152+ !(Maybe Int) -- received Content-Length
153+ -- compared the body length for error checking
154+ !(IORef Int) -- actual body length
152155
153156data ClosedCode = Finished
154157 | Killed
@@ -187,13 +190,10 @@ instance Show StreamState where
187190----------------------------------------------------------------
188191
189192data Stream = Stream {
190− streamNumber :: !StreamId
191− , streamState :: !(IORef StreamState)
192− -- Next two fields are for error checking.
193− , streamContentLength :: !(IORef (Maybe Int))
194− , streamBodyLength :: !(IORef Int)
195− , streamWindow :: !(TVar WindowSize)
196− , streamPrecedence :: !(IORef Precedence)
193+ streamNumber :: !StreamId
194+ , streamState :: !(IORef StreamState)
195+ , streamWindow :: !(TVar WindowSize)
196+ , streamPrecedence :: !(IORef Precedence)
197197 }
198198
199199instance Show Stream where
@@ -201,8 +201,6 @@ instance Show Stream where
201201
202202newStream :: StreamId -> WindowSize -> IO Stream
203203newStream sid win = Stream sid <$> newIORef Idle
204− <*> newIORef Nothing
205− <*> newIORef 0
206204 <*> newTVarIO win
207205 <*> newIORef defaultPrecedence
208206