@@ -172,10 +172,13 @@ frameReceiver ctx mkreq recvN = loop 0 `E.catch` sendGoaway
172172
173173 consume = void . recvN
174174
175+initialFrame :: ByteString
176+initialFrame = settingsFrame id [(SettingsMaxConcurrentStreams,recommendedConcurrency)]
177+
175178----------------------------------------------------------------
176179
177180control :: FrameTypeId -> FrameHeader -> ByteString -> Context -> IO Bool
178−control FrameSettings header@FrameHeader{flags} bs Context{http2settings, outputQ} = do
181+control FrameSettings header@FrameHeader{flags} bs Context{http2settings, outputQ,firstSettings} = do
179182 SettingsFrame alist <- guardIt $ decodeSettingsFrame header bs
180183 case checkSettingsList alist of
181184 Just x -> E.throwIO x
@@ -183,7 +186,10 @@ control FrameSettings header@FrameHeader{flags} bs Context{http2settings, output
183186 unless (testAck flags) $ do
184187 modifyIORef' http2settings $ \old -> updateSettings old alist
185188 let !frame = settingsFrame setAck []
186− enqueueOutputControl outputQ $ OSettings frame alist
189+ sent <- readIORef firstSettings
190+ let !frame' = if sent then frame else BS.append initialFrame frame
191+ unless sent $ writeIORef firstSettings True
192+ enqueueOutputControl outputQ $ OSettings frame' alist
187193 return True
188194
189195control FramePing FrameHeader{flags} bs Context{outputQ} =