on master help sign in
concatenating initial HTTP/2 settings.
commitfb850ff2108af40dfafbbbe6bf091e00a5423bfd authorKazu Yamamoto <kazu@iij.ad.jp> dateFri 18 Dec 2015, 15:18 (11 years ago) parent3dab0f0
3 files changed+10−6
warp/Network/Wai/Handler/Warp/HTTP2.hs−4 warp/Network/Wai/Handler/Warp/HTTP2/Receiver.hs+8−2 warp/Network/Wai/Handler/Warp/HTTP2/Types.hs+2
warp/Network/Wai/Handler/Warp/HTTP2.hs−4
@@ -22,16 +22,12 @@ import Network.Wai.Handler.Warp.Types
2222
2323----------------------------------------------------------------
2424
25−initialFrame :: ByteString
26−initialFrame = settingsFrame id [(SettingsMaxConcurrentStreams,recommendedConcurrency)]
27−
2825http2 :: Connection -> InternalInfo -> SockAddr -> Transport -> S.Settings -> (BufSize -> IO ByteString) -> Application -> IO ()
2926http2 conn ii addr transport settings readN app = do
3027 checkTLS
3128 ok <- checkPreface
3229 when ok $ do
3330 ctx <- newContext
34− enqueueOutputControl (outputQ ctx) $ OFrame initialFrame
3531 -- Workers, worker manager and timer manager
3632 mgr <- start settings
3733 let responder = response ii settings ctx mgr
warp/Network/Wai/Handler/Warp/HTTP2/Receiver.hs+8−2
@@ -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} =
warp/Network/Wai/Handler/Warp/HTTP2/Types.hs+2
@@ -75,6 +75,7 @@ data BodyInfo = OneshotWithBody
7575-- | The context for HTTP/2 connection.
7676data Context = Context {
7777 http2settings :: !(IORef Settings)
78+ , firstSettings :: !(IORef Bool)
7879 , streamTable :: !StreamTable
7980 , concurrency :: !(IORef Int)
8081 , priorityTreeSize :: !(IORef Int)
@@ -95,6 +96,7 @@ data Context = Context {
9596
9697newContext :: IO Context
9798newContext = Context <$> newIORef defaultSettings
99+ <*> newIORef False
98100 <*> newStreamTable
99101 <*> newIORef 0
100102 <*> newIORef 0