on master help sign in
making HTTP2Data and PushPromise backward-compatibility-safe.
commit85a25819e5e08728bcb414e9c6c71d96199f0e2f authorKazu Yamamoto <kazu@iij.ad.jp> dateThu 30 Jun 2016, 15:13 (10 years ago) parentcc3503d
3 files changed+27−15
warp/Network/Wai/Handler/Warp.hs+10−2 warp/Network/Wai/Handler/Warp/HTTP2/Types.hs+12−12 warp/Network/Wai/Handler/Warp/HTTP2/Worker.hs+5−1
warp/Network/Wai/Handler/Warp.hs+10−2
@@ -101,11 +101,19 @@ module Network.Wai.Handler.Warp (
101101 -- * Version
102102 , warpVersion
103103 -- * HTTP/2
104+ -- ** HTTP2 data
104105 , HTTP2Data
105− , PushPromise(..)
106− , http2data
106+ , http2dataPushPromise
107+ , defaultHTTP2Data
107108 , getHTTP2Data
108109 , setHTTP2Data
110+ -- ** Push promise
111+ , PushPromise
112+ , promisedPath
113+ , promisedFile
114+ , promisedResponseHeaders
115+ , promisedWeight
116+ , defaultPushPromise
109117 ) where
110118
111119import Control.Exception (SomeException, throwIO)
warp/Network/Wai/Handler/Warp/HTTP2/Types.hs+12−12
@@ -218,15 +218,12 @@ newStream sid win = Stream sid <$> newIORef Idle
218218 <*> newTVarIO win
219219 <*> newIORef defaultPrecedence
220220
221−newPushStream :: Context -> WindowSize -> IO Stream
222−newPushStream Context{serverStreamId} win = do
221+newPushStream :: Context -> WindowSize -> Precedence -> IO Stream
222+newPushStream Context{serverStreamId} win pre = do
223223 sid <- atomicModifyIORef' serverStreamId inc2
224224 Stream sid <$> newIORef Reserved
225225 <*> newTVarIO win
226− -- RFC 7540 defines this 16.
227− -- TODO: change this value according to
228− -- mime types.
229− <*> newIORef defaultPrecedence
226+ <*> newIORef pre
230227 where
231228 inc2 x = let !x' = x + 2 in (x', x')
232229
@@ -286,16 +283,19 @@ enqueueControl ctlQ ctl = atomically $ writeTQueue ctlQ ctl
286283
287284----------------------------------------------------------------
288285
289−newtype HTTP2Data = HTTP2Data [PushPromise]
286+newtype HTTP2Data = HTTP2Data {
287+ http2dataPushPromise :: [PushPromise]
288+ }
289+
290+defaultHTTP2Data :: HTTP2Data
291+defaultHTTP2Data = HTTP2Data []
290292
291293data PushPromise = PushPromise {
292294 promisedPath :: ByteString
293295 , promisedFile :: FilePath
294296 , promisedResponseHeaders :: H.ResponseHeaders
297+ , promisedWeight :: Weight
295298 }
296299
297−http2data :: [PushPromise] -> HTTP2Data
298−http2data pps = HTTP2Data pps
299−
300−http2dataPushPromise :: HTTP2Data -> [PushPromise]
301−http2dataPushPromise (HTTP2Data pps) = pps
300+defaultPushPromise :: PushPromise
301+defaultPushPromise = PushPromise "" "" [] 16
warp/Network/Wai/Handler/Warp/HTTP2/Worker.hs+5−1
@@ -24,6 +24,7 @@ import Control.Monad (when)
2424import Data.ByteString.Builder (byteString)
2525import qualified Network.HTTP.Types as H
2626import Network.HTTP2
27+import Network.HTTP2.Priority
2728import Network.HPACK
2829import Network.HPACK.Token
2930import Network.Wai
@@ -91,7 +92,10 @@ pushStream ctx@Context{http2settings,outputQ,streamTable}
9192 Left (_ex :: E.IOException) -> push tvar pps n
9293 Right (FileInfo _ size _ date) -> do
9394 ws <- initialWindowSize <$> readIORef http2settings
94− strm <- newPushStream ctx ws
95+ let !w = promisedWeight pp
96+ !pri = defaultPriority { weight = w }
97+ !pre = toPrecedence pri
98+ strm <- newPushStream ctx ws pre
9599 let !sid = streamNumber strm
96100 insert streamTable sid strm
97101 (ths0, vt) <- toHeaderTable (promisedResponseHeaders pp)