on master help sign in
fixing a test failures of h2spec.

changing initial window size (for streams).

commitcf54bc020d622b62ec660b0b54052ab30733cbba authorKazu Yamamoto <kazu@iij.ad.jp> dateWed 1 Feb 2017, 14:17 (10 years ago) parent12cc6b2
2 files changed+11−2
warp/Network/Wai/Handler/Warp/HTTP2/Receiver.hs+5−1 warp/Network/Wai/Handler/Warp/HTTP2/Types.hs+6−1
warp/Network/Wai/Handler/Warp/HTTP2/Receiver.hs+5−1
@@ -197,14 +197,18 @@ initialFrame = settingsFrame id [(SettingsMaxConcurrentStreams,maxConcurrency)]
197197----------------------------------------------------------------
198198
199199control :: FrameTypeId -> FrameHeader -> ByteString -> Context -> IO Bool
200−control FrameSettings header@FrameHeader{flags} bs Context{http2settings, controlQ,firstSettings} = do
200+control FrameSettings header@FrameHeader{flags} bs Context{http2settings, controlQ, firstSettings, streamTable} = do
201201 SettingsFrame alist <- guardIt $ decodeSettingsFrame header bs
202202 case checkSettingsList alist of
203203 Just x -> E.throwIO x
204204 Nothing -> return ()
205205 -- HTTP/2 Setting from a browser
206206 unless (testAck flags) $ do
207+ oldws <- initialWindowSize <$> readIORef http2settings
207208 modifyIORef' http2settings $ \old -> updateSettings old alist
209+ newws <- initialWindowSize <$> readIORef http2settings
210+ let diff = newws - oldws
211+ when (diff /= 0) $ updateAllStreamWindow (+ diff) streamTable
208212 let !frame = settingsFrame setAck []
209213 sent <- readIORef firstSettings
210214 let !setframe
warp/Network/Wai/Handler/Warp/HTTP2/Types.hs+6−1
@@ -11,7 +11,7 @@ import Control.Applicative ((<$>),(<*>))
1111import Control.Concurrent (forkIO)
1212import Control.Concurrent.STM
1313import Control.Exception (SomeException, bracket)
14−import Control.Monad (void)
14+import Control.Monad (void, forM_)
1515import Data.ByteString (ByteString)
1616import qualified Data.ByteString as BS
1717import Data.IntMap.Strict (IntMap, IntMap)
@@ -256,6 +256,11 @@ remove (StreamTable ref) k = atomicModifyIORef' ref $ \m ->
256256search :: StreamTable -> M.Key -> IO (Maybe Stream)
257257search (StreamTable ref) k = M.lookup k <$> readIORef ref
258258
259+updateAllStreamWindow :: (WindowSize -> WindowSize) -> StreamTable -> IO ()
260+updateAllStreamWindow adst (StreamTable ref) = do
261+ strms <- M.elems <$> readIORef ref
262+ forM_ strms $ \strm -> atomically $ modifyTVar (streamWindow strm) adst
263+
259264{-# INLINE forkAndEnqueueWhenReady #-}
260265forkAndEnqueueWhenReady :: IO () -> PriorityTree Output -> Output -> Manager -> IO ()
261266forkAndEnqueueWhenReady wait outQ out mgr = bracket setup teardown $ \_ ->