on master help sign in
Forward trailers from SyncFinish to the output queue
commitcabea2203e7443873df90f7c076b4c55c2fdfbd5 authorAndrew Pritchard <awpr@google.com> dateFri 24 Jul 2015, 23:26 (11 years ago) parentb068ab3
3 files changed+14−14
warp/Network/Wai/Handler/Warp/HTTP2/Sender.hs+3−3 warp/Network/Wai/Handler/Warp/HTTP2/Types.hs+1−1 warp/Network/Wai/Handler/Warp/HTTP2/Worker.hs+10−10
warp/Network/Wai/Handler/Warp/HTTP2/Sender.hs+3−3
@@ -140,13 +140,13 @@ frameSender ctx@Context{outputQ,connectionWindow}
140140 fillDataHeaderSend strm 0 datPayloadLen mnext
141141 maybeEnqueueNext strm mnext
142142 loop
143− switch (OTrailers strm []) _ = do
143+ switch (OTrailers strm []) = do
144144 let flag = setEndStream defaultFlags
145145 fillFrameHeader FrameData 0 (streamNumber strm) flag connWriteBuffer
146146 closed ctx strm Finished
147147 flushN frameHeaderLength
148148 loop
149− switch (OTrailers strm trailers) _ = do
149+ switch (OTrailers strm trailers) = do
150150 -- Trailers always indicate the end of a stream; send them in
151151 -- consecutive header+continuation frames and end the stream.
152152 builder <- hpackEncodeTrailers ctx trailers
@@ -395,7 +395,7 @@ nextForStream :: Buffer -> BufSize -> TBQueue Sequence -> TVar Sync -> Stream
395395 -> Leftover -> Bool -> BytesFilled
396396 -> IO Next
397397nextForStream _ _ _ tvar _ _ False len = do
398− atomically $ writeTVar tvar SyncFinish
398+ atomically $ writeTVar tvar $ SyncFinish []
399399 return $ Next len CFinish
400400nextForStream buf siz sq tvar strm LZero True len = do
401401 let out = ONext strm (fillBufStream buf siz LZero sq tvar strm)
warp/Network/Wai/Handler/Warp/HTTP2/Types.hs+1−1
@@ -86,7 +86,7 @@ data Sequence = SFinish
8686 | SBuilder Builder
8787
8888data Sync = SyncNone
89− | SyncFinish
89+ | SyncFinish Trailers
9090 | SyncNext Output
9191
9292data Aux = Oneshot Bool
warp/Network/Wai/Handler/Warp/HTTP2/Worker.hs+10−10
@@ -64,7 +64,7 @@ response Context{outputQ} mgr tconf th strm req rsp = do
6464 -- Since we must not enqueue an empty queue to the priority
6565 -- queue, we spawn a thread to ensure that the designated
6666 -- queue is not empty.
67− void $ forkIO $ waiter tvar sq outputQ
67+ void $ forkIO $ waiter tvar sq strm outputQ
6868 atomically $ writeTVar tvar (SyncNext out)
6969 let push b = do
7070 atomically $ writeTBQueue sq (SBuilder b)
@@ -130,27 +130,27 @@ worker ctx@Context{inputQ,outputQ} set tm app responder = do
130130 Just e -> S.settingsOnException set (Just req) e
131131 clearStreamInfo sinfo
132132
133−waiter :: TVar Sync -> TBQueue Sequence -> PriorityTree Output -> IO ()
134−waiter tvar sq outQ = do
133+waiter :: TVar Sync -> TBQueue Sequence -> Stream -> PriorityTree Output -> IO ()
134+waiter tvar sq strm outQ = do
135135 -- waiting for actions other than SyncNone
136136 mx <- atomically $ do
137137 mout <- readTVar tvar
138138 case mout of
139− SyncNone -> retry
140− SyncNext out -> do
139+ SyncNone -> retry
140+ SyncNext out -> do
141141 writeTVar tvar SyncNone
142− return $ Just out
143− SyncFinish -> return Nothing
142+ return $ Right out
143+ SyncFinish trailers -> return $ Left trailers
144144 case mx of
145− Nothing -> return ()
146− Just out -> do
145+ Left trailers -> enqueueWhenWindowIsOpen outQ (OTrailers strm trailers)
146+ Right out -> do
147147 -- ensuring that the streaming queue is not empty.
148148 atomically $ do
149149 isEmpty <- isEmptyTBQueue sq
150150 when isEmpty retry
151151 -- ensuring that stream window is greater than 0.
152152 enqueueWhenWindowIsOpen outQ out
153− waiter tvar sq outQ
153+ waiter tvar sq strm outQ
154154
155155----------------------------------------------------------------
156156