on master help sign in
Use Maybe Trailers rather than Bool to signal end-of-stream
commit161b6dd5edf1751e9f099fdb08790196df49ccbc authorAndrew Pritchard <awpr@google.com> dateFri 24 Jul 2015, 23:29 (11 years ago) parentcabea22
1 file changed+20−19
warp/Network/Wai/Handler/Warp/HTTP2/Sender.hs+20−19
warp/Network/Wai/Handler/Warp/HTTP2/Sender.hs+20−19
@@ -16,6 +16,7 @@ import Foreign.Ptr
1616import Network.HTTP2
1717import Network.HTTP2.Priority
1818import Network.Wai
19+import Network.Wai.HTTP2 (Trailers)
1920import Network.Wai.Handler.Warp.Buffer
2021import Network.Wai.Handler.Warp.HTTP2.EncodeFrame
2122import Network.Wai.Handler.Warp.HTTP2.HPACK
@@ -340,22 +341,22 @@ nextForBuilder buf siz len (B.Chunk bs writer)
340341----------------------------------------------------------------
341342
342343runStreamBuilder :: Buffer -> BufSize -> TBQueue Sequence
343− -> IO (Leftover, Bool, BytesFilled)
344+ -> IO (Leftover, Maybe Trailers, BytesFilled)
344345runStreamBuilder buf0 room0 sq = loop buf0 room0 0
345346 where
346347 loop !buf !room !total = do
347348 mbuilder <- atomically $ tryReadTBQueue sq
348349 case mbuilder of
349− Nothing -> return (LZero, True, total)
350+ Nothing -> return (LZero, Nothing, total)
350351 Just (SBuilder builder) -> do
351352 (len, signal) <- B.runBuilder builder buf room
352353 let !total' = total + len
353354 case signal of
354355 B.Done -> loop (buf `plusPtr` len) (room - len) total'
355− B.More _ writer -> return (LOne writer, True, total')
356− B.Chunk bs writer -> return (LTwo bs writer, True, total')
357− Just SFlush -> return (LZero, True, total)
358− Just SFinish -> return (LZero, False, total)
356+ B.More _ writer -> return (LOne writer, Nothing, total')
357+ B.Chunk bs writer -> return (LTwo bs writer, Nothing, total')
358+ Just SFlush -> return (LZero, Nothing, total)
359+ Just SFinish -> return (LZero, Just [], total)
359360
360361fillBufStream :: Buffer -> BufSize -> Leftover -> TBQueue Sequence -> TVar Sync -> Stream -> DynaNext
361362fillBufStream buf0 siz0 leftover0 sq tvar strm lim0 = do
@@ -363,8 +364,8 @@ fillBufStream buf0 siz0 leftover0 sq tvar strm lim0 = do
363364 room0 = min (siz0 - frameHeaderLength) lim0
364365 case leftover0 of
365366 LZero -> do
366− (leftover, cont, len) <- runStreamBuilder payloadBuf room0 sq
367− getNext leftover cont len
367+ (leftover, end, len) <- runStreamBuilder payloadBuf room0 sq
368+ getNext leftover end len
368369 LOne writer -> write writer payloadBuf room0 0
369370 LTwo bs writer
370371 | BS.length bs <= room0 -> do
@@ -374,34 +375,34 @@ fillBufStream buf0 siz0 leftover0 sq tvar strm lim0 = do
374375 | otherwise -> do
375376 let (bs1,bs2) = BS.splitAt room0 bs
376377 void $ copy payloadBuf bs1
377− getNext (LTwo bs2 writer) True room0
378+ getNext (LTwo bs2 writer) Nothing room0
378379 where
379380 getNext = nextForStream buf0 siz0 sq tvar strm
380381 write writer1 buf room sofar = do
381382 (len, signal) <- writer1 buf room
382383 case signal of
383384 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
385386 let !total = sofar + len + extra
386− getNext leftover cont total
387+ getNext leftover end total
387388 B.More _ writer -> do
388389 let !total = sofar + len
389− getNext (LOne writer) True total
390+ getNext (LOne writer) Nothing total
390391 B.Chunk bs writer -> do
391392 let !total = sofar + len
392− getNext (LTwo bs writer) True total
393+ getNext (LTwo bs writer) Nothing total
393394
394395nextForStream :: Buffer -> BufSize -> TBQueue Sequence -> TVar Sync -> Stream
395− -> Leftover -> Bool -> BytesFilled
396+ -> Leftover -> Maybe Trailers -> BytesFilled
396397 -> IO Next
397−nextForStream _ _ _ tvar _ _ False len = do
398− atomically $ writeTVar tvar $ SyncFinish []
399− return $ Next len CFinish
400−nextForStream buf siz sq tvar strm LZero True len = do
398+nextForStream _ _ _ tvar _ _ (Just trailers) len = do
399+ atomically $ writeTVar tvar $ SyncFinish trailers
400+ return $ Next len CNone
401+nextForStream buf siz sq tvar strm LZero Nothing len = do
401402 let out = ONext strm (fillBufStream buf siz LZero sq tvar strm)
402403 atomically $ writeTVar tvar $ SyncNext out
403404 return $ Next len CNone
404−nextForStream buf siz sq tvar strm leftover True len =
405+nextForStream buf siz sq tvar strm leftover Nothing len =
405406 return $ Next len (CNext (fillBufStream buf siz leftover sq tvar strm))
406407
407408----------------------------------------------------------------