on master help sign in
using BodyInfo.
commitb393adb736dbf16d6900874146fa2003c5047f50 authorKazu Yamamoto <kazu@iij.ad.jp> dateThu 17 Dec 2015, 14:35 (11 years ago) parent3f9681e
3 files changed+18−14
warp/Network/Wai/Handler/Warp/HTTP2/Sender.hs+8−7 warp/Network/Wai/Handler/Warp/HTTP2/Types.hs+4−3 warp/Network/Wai/Handler/Warp/HTTP2/Worker.hs+6−4
warp/Network/Wai/Handler/Warp/HTTP2/Sender.hs+8−7
@@ -104,7 +104,7 @@ frameSender ctx@Context{outputQ,connectionWindow,encodeDynamicTable}
104104 dyntbl <- readIORef encodeDynamicTable
105105 setLimitForEncoding siz dyntbl
106106 loop
107− switch out@(OResponse strm rsp aux) pre = do
107+ switch out@(OResponse strm rsp binfo) pre = do
108108 writeIORef (streamPrecedence strm) pre
109109 unlessClosed ctx conn strm $ do
110110 cws <- getConnectionWindowSizeWhenReady ctx
@@ -115,13 +115,14 @@ frameSender ctx@Context{outputQ,connectionWindow,encodeDynamicTable}
115115 let !lim = min cws sws
116116 -- Header frame and Continuation frame
117117 let sid = streamNumber strm
118− endOfStream = case aux of
119− Persist{} -> False
120− Oneshot hb -> not hb
118+ endOfStream = case binfo of
119+ Persist{} -> False
120+ OneshotWithBody -> False
121+ OneshotWithoutBody -> True
121122 len <- headerContinue sid rsp endOfStream
122123 let total = len + frameHeaderLength
123− case aux of
124− Oneshot True -> do -- hasBody
124+ case binfo of
125+ OneshotWithBody -> do
125126 -- Data frame payload
126127 (off, _) <- sendHeadersIfNecessary total
127128 let payloadOff = off + frameHeaderLength
@@ -129,7 +130,7 @@ frameSender ctx@Context{outputQ,connectionWindow,encodeDynamicTable}
129130 fillResponseBodyGetNext conn ii payloadOff lim rsp
130131 fillDataHeaderSend strm total datPayloadLen mnext
131132 maybeEnqueueNext strm mnext
132− Oneshot False -> do
133+ OneshotWithoutBody -> do
133134 -- "closed" must be before "connSendAll". If not,
134135 -- the context would be switched to the receiver,
135136 -- resulting the inconsistency of concurrency.
warp/Network/Wai/Handler/Warp/HTTP2/Types.hs+4−3
@@ -59,7 +59,7 @@ data Output = OFinish
5959 | OGoaway !ByteString
6060 | OFrame !ByteString
6161 | OSettings !ByteString !SettingsList
62− | OResponse !Stream !Response !Aux
62+ | OResponse !Stream !Response !BodyInfo
6363 | ONext !Stream !DynaNext
6464
6565outputStream :: Output -> Stream
@@ -73,8 +73,9 @@ data Sequence = SFinish
7373 | SFlush
7474 | SBuilder Builder
7575
76−data Aux = Oneshot Bool
77− | Persist (TBQueue Sequence)
76+data BodyInfo = OneshotWithBody
77+ | OneshotWithoutBody
78+ | Persist (TBQueue Sequence)
7879
7980----------------------------------------------------------------
8081
warp/Network/Wai/Handler/Warp/HTTP2/Worker.hs+6−4
@@ -67,13 +67,15 @@ response ii settings Context{outputQ} mgr tconf th strm req rsp
6767 !hs0 = responseHeaders rsp
6868 !logger = S.settingsLogger settings req
6969
70− responseNoBody s hs = responseBuilderBody s hs mempty
70+ responseNoBody s hs = responseBuilderCore s hs mempty OneshotWithoutBody
7171
72− responseBuilderBody s hs bdy = do
72+ responseBuilderBody s hs bdy = responseBuilderCore s hs bdy OneshotWithBody
73+
74+ responseBuilderCore s hs bdy binfo = do
7375 logger s Nothing
7476 setThreadContinue tconf True
7577 let rsp' = ResponseBuilder s hs bdy
76− out = OResponse strm rsp' (Oneshot True)
78+ out = OResponse strm rsp' binfo
7779 enqueueOutput outputQ out
7880 return ResponseReceived
7981
@@ -93,7 +95,7 @@ response ii settings Context{outputQ} mgr tconf th strm req rsp
9395 logger s (filePartByteCount <$> mpart)
9496 setThreadContinue tconf True
9597 let rsp' = ResponseFile s hs path mpart
96− out = OResponse strm rsp' (Oneshot True)
98+ out = OResponse strm rsp' OneshotWithBody
9799 enqueueOutput outputQ out
98100 return ResponseReceived
99101