on master help sign in
Use Maybe Trailers rather than Bool to signal end-of-stream
161b6ddAndrew Pritchard
warp/Network/Wai/Handler/Warp/HTTP2/Sender.hs+20−19
@@ -16,6 +16,7 @@ import Foreign.Ptr
16import Network.HTTP2
16import Network.HTTP2
17import Network.HTTP2.Priority
17import Network.HTTP2.Priority
18import Network.Wai
18import Network.Wai
19+import Network.Wai.HTTP2 (Trailers)
19import Network.Wai.Handler.Warp.Buffer
20import Network.Wai.Handler.Warp.Buffer
20import Network.Wai.Handler.Warp.HTTP2.EncodeFrame
21import Network.Wai.Handler.Warp.HTTP2.EncodeFrame
21import Network.Wai.Handler.Warp.HTTP2.HPACK
22import Network.Wai.Handler.Warp.HTTP2.HPACK
@@ -340,22 +341,22 @@ nextForBuilder buf siz len (B.Chunk bs writer)
340----------------------------------------------------------------
341----------------------------------------------------------------
341
342
342runStreamBuilder :: Buffer -> BufSize -> TBQueue Sequence
343runStreamBuilder :: Buffer -> BufSize -> TBQueue Sequence
343− -> IO (Leftover, Bool, BytesFilled)
344+ -> IO (Leftover, Maybe Trailers, BytesFilled)
344runStreamBuilder buf0 room0 sq = loop buf0 room0 0
345runStreamBuilder buf0 room0 sq = loop buf0 room0 0
345 where
346 where
346 loop !buf !room !total = do
347 loop !buf !room !total = do
347 mbuilder <- atomically $ tryReadTBQueue sq
348 mbuilder <- atomically $ tryReadTBQueue sq
348 case mbuilder of
349 case mbuilder of
349− Nothing -> return (LZero, True, total)
350+ Nothing -> return (LZero, Nothing, total)
350 Just (SBuilder builder) -> do
351 Just (SBuilder builder) -> do
351 (len, signal) <- B.runBuilder builder buf room
352 (len, signal) <- B.runBuilder builder buf room
352 let !total' = total + len
353 let !total' = total + len
353 case signal of
354 case signal of
354 B.Done -> loop (buf `plusPtr` len) (room - len) total'
355 B.Done -> loop (buf `plusPtr` len) (room - len) total'
355− B.More _ writer -> return (LOne writer, True, total')
356+ B.More _ writer -> return (LOne writer, Nothing, total')
356− B.Chunk bs writer -> return (LTwo bs writer, True, total')
357+ B.Chunk bs writer -> return (LTwo bs writer, Nothing, total')
357− Just SFlush -> return (LZero, True, total)
358+ Just SFlush -> return (LZero, Nothing, total)
358− Just SFinish -> return (LZero, False, total)
359+ Just SFinish -> return (LZero, Just [], total)
359
360
360fillBufStream :: Buffer -> BufSize -> Leftover -> TBQueue Sequence -> TVar Sync -> Stream -> DynaNext
361fillBufStream :: Buffer -> BufSize -> Leftover -> TBQueue Sequence -> TVar Sync -> Stream -> DynaNext
361fillBufStream buf0 siz0 leftover0 sq tvar strm lim0 = do
362fillBufStream buf0 siz0 leftover0 sq tvar strm lim0 = do
@@ -363,8 +364,8 @@ fillBufStream buf0 siz0 leftover0 sq tvar strm lim0 = do
363 room0 = min (siz0 - frameHeaderLength) lim0
364 room0 = min (siz0 - frameHeaderLength) lim0
364 case leftover0 of
365 case leftover0 of
365 LZero -> do
366 LZero -> do
366− (leftover, cont, len) <- runStreamBuilder payloadBuf room0 sq
367+ (leftover, end, len) <- runStreamBuilder payloadBuf room0 sq
367− getNext leftover cont len
368+ getNext leftover end len
368 LOne writer -> write writer payloadBuf room0 0
369 LOne writer -> write writer payloadBuf room0 0
369 LTwo bs writer
370 LTwo bs writer
370 | BS.length bs <= room0 -> do
371 | BS.length bs <= room0 -> do
@@ -374,34 +375,34 @@ fillBufStream buf0 siz0 leftover0 sq tvar strm lim0 = do
374 | otherwise -> do
375 | otherwise -> do
375 let (bs1,bs2) = BS.splitAt room0 bs
376 let (bs1,bs2) = BS.splitAt room0 bs
376 void $ copy payloadBuf bs1
377 void $ copy payloadBuf bs1
377− getNext (LTwo bs2 writer) True room0
378+ getNext (LTwo bs2 writer) Nothing room0
378 where
379 where
379 getNext = nextForStream buf0 siz0 sq tvar strm
380 getNext = nextForStream buf0 siz0 sq tvar strm
380 write writer1 buf room sofar = do
381 write writer1 buf room sofar = do
381 (len, signal) <- writer1 buf room
382 (len, signal) <- writer1 buf room
382 case signal of
383 case signal of
383 B.Done -> do
384 B.Done -> do
384− (leftover, cont, extra) <- runStreamBuilder (buf `plusPtr` len) (room - len) sq
385+ (leftover, end, extra) <- runStreamBuilder (buf `plusPtr` len) (room - len) sq
385 let !total = sofar + len + extra
386 let !total = sofar + len + extra
386− getNext leftover cont total
387+ getNext leftover end total
387 B.More _ writer -> do
388 B.More _ writer -> do
388 let !total = sofar + len
389 let !total = sofar + len
389− getNext (LOne writer) True total
390+ getNext (LOne writer) Nothing total
390 B.Chunk bs writer -> do
391 B.Chunk bs writer -> do
391 let !total = sofar + len
392 let !total = sofar + len
392− getNext (LTwo bs writer) True total
393+ getNext (LTwo bs writer) Nothing total
393
394
394nextForStream :: Buffer -> BufSize -> TBQueue Sequence -> TVar Sync -> Stream
395nextForStream :: Buffer -> BufSize -> TBQueue Sequence -> TVar Sync -> Stream
395− -> Leftover -> Bool -> BytesFilled
396+ -> Leftover -> Maybe Trailers -> BytesFilled
396 -> IO Next
397 -> IO Next
397−nextForStream _ _ _ tvar _ _ False len = do
398+nextForStream _ _ _ tvar _ _ (Just trailers) len = do
398− atomically $ writeTVar tvar $ SyncFinish []
399+ atomically $ writeTVar tvar $ SyncFinish trailers
399− return $ Next len CFinish
400+ return $ Next len CNone
400−nextForStream buf siz sq tvar strm LZero True len = do
401+nextForStream buf siz sq tvar strm LZero Nothing len = do
401 let out = ONext strm (fillBufStream buf siz LZero sq tvar strm)
402 let out = ONext strm (fillBufStream buf siz LZero sq tvar strm)
402 atomically $ writeTVar tvar $ SyncNext out
403 atomically $ writeTVar tvar $ SyncNext out
403 return $ Next len CNone
404 return $ Next len CNone
404−nextForStream buf siz sq tvar strm leftover True len =
405+nextForStream buf siz sq tvar strm leftover Nothing len =
405 return $ Next len (CNext (fillBufStream buf siz leftover sq tvar strm))
406 return $ Next len (CNext (fillBufStream buf siz leftover sq tvar strm))
406
407
407----------------------------------------------------------------
408----------------------------------------------------------------