on master help sign in
reducing the number of send.
commit3b6204187c8ee4de0bd10cb4e747ade8b0ec3eb4 authorKazu Yamamoto <kazu@iij.ad.jp> dateTue 8 Mar 2016, 08:57 (11 years ago) parent2ccbf91
3 files changed+27−15
warp/Network/Wai/Handler/Warp/HTTP2/Receiver.hs+4−2 warp/Network/Wai/Handler/Warp/HTTP2/Sender.hs+19−10 warp/Network/Wai/Handler/Warp/HTTP2/Types.hs+4−3
warp/Network/Wai/Handler/Warp/HTTP2/Receiver.hs+4−2
@@ -187,9 +187,11 @@ control FrameSettings header@FrameHeader{flags} bs Context{http2settings, contro
187187 modifyIORef' http2settings $ \old -> updateSettings old alist
188188 let !frame = settingsFrame setAck []
189189 sent <- readIORef firstSettings
190− let !frame' = if sent then frame else BS.append initialFrame frame
190+ let !setframe
191+ | sent = CSettings frame alist
192+ | otherwise = CSettings0 initialFrame frame alist
191193 unless sent $ writeIORef firstSettings True
192− enqueueControl controlQ $ CSettings frame' alist
194+ enqueueControl controlQ setframe
193195 return True
194196
195197control FramePing FrameHeader{flags} bs Context{controlQ} =
warp/Network/Wai/Handler/Warp/HTTP2/Sender.hs+19−10
@@ -84,8 +84,8 @@ frameSender ctx@Context{outputQ,controlQ,connectionWindow,encodeDynamicTable}
8484 case x of
8585 C ctl -> do
8686 when (off /= 0) $ flushN off
87− cont <- control ctl
88− when cont $ loop 0
87+ off' <- control ctl off
88+ when (off' >= 0) $ loop off'
8989 O (_,pre,out) -> do
9090 let strm = outputStream out
9191 writeIORef (streamPrecedence strm) pre
@@ -96,15 +96,24 @@ frameSender ctx@Context{outputQ,controlQ,connectionWindow,encodeDynamicTable}
9696 | otherwise -> loop off'
9797 Flush -> flushN off >> loop 0
9898
99− control CFinish = return False
100− control (CGoaway frame) = connSendAll frame >> return False
101− control (CFrame frame) = connSendAll frame >> return True
102− control (CSettings frame alist) = do
99+ control CFinish _ = return (-1)
100+ control (CGoaway frame) _ = connSendAll frame >> return (-1)
101+ control (CFrame frame) _ = connSendAll frame >> return 0
102+ control (CSettings frame alist) _ = do
103103 connSendAll frame
104− case lookup SettingsHeaderTableSize alist of
105− Nothing -> return ()
106− Just siz -> setLimitForEncoding siz encodeDynamicTable
107− return True
104+ setLimit alist
105+ return 0
106+ control (CSettings0 frame1 frame2 alist) off = do -- off == 0, just in case
107+ let !buf = connWriteBuffer `plusPtr` off
108+ !off' = off + BS.length frame1 + BS.length frame2
109+ buf' <- copy buf frame1
110+ void $ copy buf' frame2
111+ setLimit alist
112+ return off'
113+
114+ setLimit alist = case lookup SettingsHeaderTableSize alist of
115+ Nothing -> return ()
116+ Just siz -> setLimitForEncoding siz encodeDynamicTable
108117
109118 output (ONext strm curr mtbq) off0 lim = do
110119 -- Data frame payload
warp/Network/Wai/Handler/Warp/HTTP2/Types.hs+4−3
@@ -81,9 +81,10 @@ outputMaybeTBQueue (ORspn _ _ _) = Nothing
8181outputMaybeTBQueue (ONext _ _ mtbq) = mtbq
8282
8383data Control = CFinish
84− | CGoaway !ByteString
85− | CFrame !ByteString
86− | CSettings !ByteString !SettingsList
84+ | CGoaway !ByteString
85+ | CFrame !ByteString
86+ | CSettings !ByteString !SettingsList
87+ | CSettings0 !ByteString !ByteString !SettingsList
8788
8889----------------------------------------------------------------
8990