on master help sign in
using NamedFieldPuns according to #339.
commit02f4449f67b68bc686396afb8eed060c0a10c160 authorKazu Yamamoto <kazu@iij.ad.jp> dateWed 15 Jul 2015, 10:09 (11 years ago) parent7362b99
1 file changed+22−17
warp/Network/Wai/Handler/Warp/HTTP2/Receiver.hs+22−17
warp/Network/Wai/Handler/Warp/HTTP2/Receiver.hs+22−17
@@ -2,6 +2,7 @@
22{-# LANGUAGE RecordWildCards #-}
33{-# LANGUAGE BangPatterns #-}
44{-# LANGUAGE CPP #-}
5+{-# LANGUAGE NamedFieldPuns #-}
56
67module Network.Wai.Handler.Warp.HTTP2.Receiver (frameReceiver) where
78
@@ -48,9 +49,9 @@ frameReceiver ctx@Context{..} mkreq recvN =
4849 cont <- processStreamGuardingError $ decodeFrameHeader hd
4950 when cont loop
5051
51− processStreamGuardingError (_, FrameHeader{..})
52+ processStreamGuardingError (_, FrameHeader{streamId})
5253 | isResponse streamId = E.throwIO $ ConnectionError ProtocolError "stream id should be odd"
53− processStreamGuardingError (FrameUnknown _, FrameHeader{..}) = do
54+ processStreamGuardingError (FrameUnknown _, FrameHeader{payloadLength}) = do
5455 mx <- readIORef continued
5556 case mx of
5657 Nothing -> do
@@ -60,7 +61,7 @@ frameReceiver ctx@Context{..} mkreq recvN =
6061 Just _ -> E.throwIO $ ConnectionError ProtocolError "unknown frame"
6162 processStreamGuardingError (FramePushPromise, _) =
6263 E.throwIO $ ConnectionError ProtocolError "push promise is not allowed"
63− processStreamGuardingError typhdr@(ftyp, header@FrameHeader{..}) = do
64+ processStreamGuardingError typhdr@(ftyp, header@FrameHeader{payloadLength}) = do
6465 settings <- readIORef http2settings
6566 case checkFrameHeader settings typhdr of
6667 Left h2err -> case h2err of
@@ -78,13 +79,13 @@ frameReceiver ctx@Context{..} mkreq recvN =
7879 Left connErr -> E.throw connErr
7980 Right cont -> return cont
8081
81− controlOrStream ftyp header@FrameHeader{..}
82+ controlOrStream ftyp header@FrameHeader{streamId, payloadLength}
8283 | isControl streamId = do
8384 pl <- recvN payloadLength
8485 control ftyp header pl ctx
8586 | otherwise = do
8687 checkContinued
87− strm@Stream{..} <- getStream
88+ strm@Stream{streamState,streamContentLength} <- getStream
8889 pl <- recvN payloadLength
8990 state <- readIORef streamState
9091 state' <- stream ftyp header pl ctx state strm
@@ -159,7 +160,7 @@ frameReceiver ctx@Context{..} mkreq recvN =
159160----------------------------------------------------------------
160161
161162control :: FrameTypeId -> FrameHeader -> ByteString -> Context -> IO Bool
162−control FrameSettings header@FrameHeader{..} bs Context{..} = do
163+control FrameSettings header@FrameHeader{flags} bs Context{http2settings, outputQ} = do
163164 SettingsFrame alist <- guardIt $ decodeSettingsFrame header bs
164165 case checkSettingsList alist of
165166 Just x -> E.throwIO x
@@ -170,7 +171,7 @@ control FrameSettings header@FrameHeader{..} bs Context{..} = do
170171 enqueue outputQ (OFrame frame) highestPriority
171172 return True
172173
173−control FramePing FrameHeader{..} bs Context{..} =
174+control FramePing FrameHeader{flags} bs Context{outputQ} =
174175 if testAck flags then
175176 E.throwIO $ ConnectionError ProtocolError "the ack flag of this ping frame must not be set"
176177 else do
@@ -178,11 +179,11 @@ control FramePing FrameHeader{..} bs Context{..} =
178179 enqueue outputQ (OFrame frame) defaultPriority
179180 return True
180181
181−control FrameGoAway _ _ Context{..} = do
182+control FrameGoAway _ _ Context{outputQ} = do
182183 enqueue outputQ OFinish highestPriority
183184 return False
184185
185−control FrameWindowUpdate header@FrameHeader{..} bs Context{..} = do
186+control FrameWindowUpdate header bs Context{connectionWindow} = do
186187 WindowUpdateFrame n <- guardIt $ decodeWindowUpdateFrame header bs
187188 w <- (n +) <$> atomically (readTVar connectionWindow)
188189 when (isWindowOverflow w) $ E.throwIO $ ConnectionError FlowControlError "control window should be less than 2^31"
@@ -208,7 +209,7 @@ checkPriority p me
208209 dep = streamDependency p
209210
210211stream :: FrameTypeId -> FrameHeader -> ByteString -> Context -> StreamState -> Stream -> IO StreamState
211−stream FrameHeaders header@FrameHeader{..} bs ctx (Open JustOpened) Stream{..} = do
212+stream FrameHeaders header@FrameHeader{flags} bs ctx (Open JustOpened) Stream{streamNumber} = do
212213 HeadersFrame mp frag <- guardIt $ decodeHeadersFrame header bs
213214 pri <- case mp of
214215 Nothing -> return defaultPriority
@@ -227,7 +228,7 @@ stream FrameHeaders header@FrameHeader{..} bs ctx (Open JustOpened) Stream{..} =
227228 let !siz = BS.length frag
228229 return $ Open $ Continued [frag] siz 1 endOfStream pri
229230
230−stream FrameHeaders header@FrameHeader{..} bs _ s@(Open (Body q)) Stream{..} = do
231+stream FrameHeaders header@FrameHeader{flags} bs _ s@(Open (Body q)) _ = do
231232 -- trailer is not supported.
232233 -- let's read and ignore it.
233234 HeadersFrame _ _ <- guardIt $ decodeHeadersFrame header bs
@@ -238,7 +239,11 @@ stream FrameHeaders header@FrameHeader{..} bs _ s@(Open (Body q)) Stream{..} = d
238239 else
239240 return s
240241
241−stream FrameData header@FrameHeader{..} bs Context{..} s@(Open (Body q)) Stream{..} = do
242+stream FrameData
243+ header@FrameHeader{flags,payloadLength,streamId}
244+ bs
245+ Context{outputQ} s@(Open (Body q))
246+ Stream{streamNumber,streamBodyLength,streamContentLength} = do
242247 DataFrame body <- guardIt $ decodeDataFrame header bs
243248 let endOfStream = testEndStream flags
244249 len0 <- readIORef streamBodyLength
@@ -260,7 +265,7 @@ stream FrameData header@FrameHeader{..} bs Context{..} s@(Open (Body q)) Stream{
260265 else
261266 return s
262267
263−stream FrameContinuation FrameHeader{..} frag ctx (Open (Continued rfrags siz n endOfStream pri)) _ = do
268+stream FrameContinuation FrameHeader{flags} frag ctx (Open (Continued rfrags siz n endOfStream pri)) _ = do
264269 let endOfHeader = testEndHeader flags
265270 rfrags' = frag : rfrags
266271 siz' = siz + BS.length frag
@@ -281,7 +286,7 @@ stream FrameContinuation FrameHeader{..} frag ctx (Open (Continued rfrags siz n
281286
282287stream FrameContinuation _ _ _ _ _ = E.throwIO $ ConnectionError ProtocolError "continue frame cannot come here"
283288
284−stream FrameWindowUpdate header@FrameHeader{..} bs Context{..} s Stream{..} = do
289+stream FrameWindowUpdate header@FrameHeader{streamId} bs _ s Stream{streamWindow} = do
285290 WindowUpdateFrame n <- guardIt $ decodeWindowUpdateFrame header bs
286291 w <- (n +) <$> atomically (readTVar streamWindow)
287292 when (isWindowOverflow w) $
@@ -295,7 +300,7 @@ stream FrameRSTStream header bs ctx _ strm = do
295300 closed ctx strm cc
296301 return $ Closed cc -- will be written to streamState again
297302
298−stream FramePriority header bs Context{..} s Stream{..} = do
303+stream FramePriority header bs Context{outputQ} s Stream{streamNumber} = do
299304 PriorityFrame p <- guardIt $ decodePriorityFrame header bs
300305 checkPriority p streamNumber
301306 prepare outputQ streamNumber p
@@ -303,5 +308,5 @@ stream FramePriority header bs Context{..} s Stream{..} = do
303308
304309-- this ordering is important
305310stream _ _ _ _ (Open Continued{}) _ = E.throwIO $ ConnectionError ProtocolError "an illegal frame follows header/continuation frames"
306−stream FrameData FrameHeader{..} _ _ _ _ = E.throwIO $ StreamError StreamClosed streamId
307−stream _ FrameHeader{..} _ _ _ _ = E.throwIO $ StreamError ProtocolError streamId
311+stream FrameData FrameHeader{streamId} _ _ _ _ = E.throwIO $ StreamError StreamClosed streamId
312+stream _ FrameHeader{streamId} _ _ _ _ = E.throwIO $ StreamError ProtocolError streamId