http2-client-0.1.0.0: src/Network/HTTP2/Client/Helpers.hs
module Network.HTTP2.Client.Helpers where
import Data.Time.Clock (UTCTime, getCurrentTime)
import qualified Network.HTTP2 as HTTP2
import qualified Network.HPACK as HPACK
import Data.ByteString (ByteString)
import Control.Concurrent (threadDelay)
import Control.Concurrent.Async (race)
import Network.HTTP2.Client
type PingReply = (UTCTime, UTCTime, Either () (HTTP2.FrameHeader, HTTP2.FramePayload))
ping :: Int -> ByteString -> Http2Client -> IO PingReply
ping timeout msg conn = do
t0 <- getCurrentTime
waitPing <- _ping conn msg
pingReply <- race (threadDelay timeout) waitPing
t1 <- getCurrentTime
return $ (t0, t1, pingReply)
type StreamResult = (Either HTTP2.ErrorCode HPACK.HeaderList, [Either HTTP2.ErrorCode ByteString])
waitStream :: Http2Stream -> IncomingFlowControl -> IO StreamResult
waitStream stream streamFlowControl = do
(_,_,hdrs) <- _waitHeaders stream
dataFrames <- moredata []
return (hdrs, reverse dataFrames)
where
moredata xs = do
(fh, x) <- _waitData stream
if HTTP2.testEndStream (HTTP2.flags fh)
then
return (x:xs)
else do
_ <- _updateWindow $ streamFlowControl
moredata (x:xs)