@@ -172,10 +172,13 @@ frameReceiver ctx mkreq recvN = loop 0 `E.catch` sendGoaway
173 consume = void . recvN
173 consume = void . recvN
175+initialFrame :: ByteString
176+initialFrame = settingsFrame id [(SettingsMaxConcurrentStreams,recommendedConcurrency)]
175----------------------------------------------------------------
178----------------------------------------------------------------
177control :: FrameTypeId -> FrameHeader -> ByteString -> Context -> IO Bool
180control :: 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
179 SettingsFrame alist <- guardIt $ decodeSettingsFrame header bs
182 SettingsFrame alist <- guardIt $ decodeSettingsFrame header bs
180 case checkSettingsList alist of
183 case checkSettingsList alist of
181 Just x -> E.throwIO x
184 Just x -> E.throwIO x
@@ -183,7 +186,10 @@ control FrameSettings header@FrameHeader{flags} bs Context{http2settings, output
183 unless (testAck flags) $ do
186 unless (testAck flags) $ do
184 modifyIORef' http2settings $ \old -> updateSettings old alist
187 modifyIORef' http2settings $ \old -> updateSettings old alist
185 let !frame = settingsFrame setAck []
188 let !frame = settingsFrame setAck []
189+ sent <- readIORef firstSettings
190+ let !frame' = if sent then frame else BS.append initialFrame frame
191+ unless sent $ writeIORef firstSettings True
186− enqueueOutputControl outputQ $ OSettings frame alist
192+ enqueueOutputControl outputQ $ OSettings frame' alist
187 return True
193 return True
189control FramePing FrameHeader{flags} bs Context{outputQ} =
195control FramePing FrameHeader{flags} bs Context{outputQ} =