on master help sign in
making use of SETTINGS_HEADER_TABLE_SIZE for HPACK encoding.
83bec55Kazu Yamamoto
warp/Network/Wai/Handler/Warp/HTTP2/Receiver.hs+1−1
@@ -186,7 +186,7 @@ control FrameSettings header@FrameHeader{flags} bs Context{http2settings, output
186 unless (testAck flags) $ do
186 unless (testAck flags) $ do
187 modifyIORef http2settings $ \old -> updateSettings old alist
187 modifyIORef http2settings $ \old -> updateSettings old alist
188 let frame = settingsFrame setAck []
188 let frame = settingsFrame setAck []
189− enqueueControl outputQ 0 $ OFrame frame
189+ enqueueControl outputQ 0 $ OSettings frame alist
190 return True
190 return True
191
191
192control FramePing FrameHeader{flags} bs Context{outputQ} =
192control FramePing FrameHeader{flags} bs Context{outputQ} =
warp/Network/Wai/Handler/Warp/HTTP2/Sender.hs+10−1
@@ -13,6 +13,7 @@ import Control.Monad (unless, void, when)
13import qualified Data.ByteString as BS
13import qualified Data.ByteString as BS
14import qualified Data.ByteString.Builder.Extra as B
14import qualified Data.ByteString.Builder.Extra as B
15import Foreign.Ptr
15import Foreign.Ptr
16+import Network.HPACK (setLimitForEncoding)
16import Network.HTTP2
17import Network.HTTP2
17import Network.HTTP2.Priority
18import Network.HTTP2.Priority
18import Network.Wai
19import Network.Wai
@@ -68,7 +69,7 @@ getWindowSize connWindow strmWindow = do
68 return $ min cw sw
69 return $ min cw sw
69
70
70frameSender :: Context -> Connection -> InternalInfo -> S.Settings -> IO ()
71frameSender :: Context -> Connection -> InternalInfo -> S.Settings -> IO ()
71−frameSender ctx@Context{outputQ,connectionWindow}
72+frameSender ctx@Context{outputQ,connectionWindow,encodeDynamicTable}
72 conn@Connection{connWriteBuffer,connBufferSize,connSendAll}
73 conn@Connection{connWriteBuffer,connBufferSize,connSendAll}
73 ii settings = go `E.catch` ignore
74 ii settings = go `E.catch` ignore
74 where
75 where
@@ -92,6 +93,14 @@ frameSender ctx@Context{outputQ,connectionWindow}
92 switch (OFrame frame) _ = do
93 switch (OFrame frame) _ = do
93 connSendAll frame
94 connSendAll frame
94 loop
95 loop
96+ switch (OSettings frame alist) _ = do
97+ connSendAll frame
98+ case lookup SettingsHeaderTableSize alist of
99+ Nothing -> return ()
100+ Just siz -> do
101+ dyntbl <- readIORef encodeDynamicTable
102+ setLimitForEncoding siz dyntbl
103+ loop
95 switch (OResponse strm rsp aux) pre = do
104 switch (OResponse strm rsp aux) pre = do
96 writeIORef (streamPrecedence strm) pre
105 writeIORef (streamPrecedence strm) pre
97 unlessClosed ctx conn strm $ do
106 unlessClosed ctx conn strm $ do
warp/Network/Wai/Handler/Warp/HTTP2/Types.hs+1
@@ -62,6 +62,7 @@ data Next = Next BytesFilled (Control DynaNext)
62data Output = OFinish
62data Output = OFinish
63 | OGoaway ByteString
63 | OGoaway ByteString
64 | OFrame ByteString
64 | OFrame ByteString
65+ | OSettings ByteString SettingsList
65 | OResponse Stream Response Aux
66 | OResponse Stream Response Aux
66 | ONext Stream DynaNext
67 | ONext Stream DynaNext
67
68