packages feed

http3-0.0.9: util/ClientX.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE Strict #-}
{-# LANGUAGE StrictData #-}

module ClientX where

import Control.Concurrent
import Control.Monad
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as C8
import Network.HTTP.Types
import Network.QUIC
import qualified UnliftIO.Exception as E

import qualified Network.HQ.Client as HQ
import qualified Network.HTTP3.Client as H3

data Aux = Aux
    { auxPath :: String
    , auxAuthority :: String
    , auxDebug :: String -> IO ()
    , auxShow :: ByteString -> IO ()
    , auxCheckClose :: IO Bool
    }

type Cli = Aux -> Connection -> IO ()

clientHQ :: Int -> Cli
clientHQ n = clientX n HQ.run

clientH3 :: Int -> Cli
clientH3 n = clientX n H3.run

clientX
    :: Int
    -> (Connection -> H3.ClientConfig -> H3.Config -> H3.Client () -> IO ())
    -> Cli
clientX n0 run Aux{..} conn = E.bracket H3.allocSimpleConfig H3.freeSimpleConfig $ \conf -> run conn cliconf conf client
  where
    req =
        H3.requestNoBody
            methodGet
            (C8.pack auxPath)
            [("User-Agent", "HaskellQuic/0.0.0")]
    cliconf =
        H3.ClientConfig
            { scheme = "https"
            , authority = auxAuthority
            }
    client sendRequest _aux = loop n0
      where
        loop 0 = return ()
        loop n = do
            () <- sendRequest req $ \rsp -> do
                auxDebug "GET"
                auxShow "------------------------"
                consume rsp
                auxShow "------------------------"
            when (n /= 1) $ do
                threadDelay 100000
                loop (n - 1)
    consume rsp = do
        bs <- H3.getResponseBodyChunk rsp
        if bs == ""
            then do
                auxDebug "Fin received"
            else do
                auxShow bs
                auxDebug $ show (C8.length bs) ++ " bytes received"
                consume rsp