@@ -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