content: {-# LANGUAGE OverloadedStrings #-}
  
  module HTTP3.Config (
      makeTestServerConfig,
      testClientConfig,
      testH3ClientConfig,
  ) where
  
  import Data.ByteString (ByteString)
  import qualified Data.List as L
  import qualified Network.HTTP3.Client as H3
  import Network.TLS (Credentials (..), credentialLoadX509)
  
  import Network.QUIC.Client
  import Network.QUIC.Internal
  
  makeTestServerConfig :: IO ServerConfig
  makeTestServerConfig = do
      cred <-
          either error id
              <$> credentialLoadX509 "test/servercert.pem" "test/serverkey.pem"
      let credentials = Credentials [cred]
      return
          testServerConfig
              { scCredentials = credentials
              , scALPN = Just chooseALPN
              }
  
  testServerConfig :: ServerConfig
  testServerConfig =
      defaultServerConfig
          { scAddresses = [("127.0.0.1", 8003)]
          }
  
  testClientConfig :: ClientConfig
  testClientConfig =
      defaultClientConfig
          { ccPortName = "8003"
          , ccValidate = False
          }
  
  chooseALPN :: Version -> [ByteString] -> IO ByteString
  chooseALPN _ver protos = return $ case mh3idx of
      Nothing -> case mhqidx of
          Nothing -> ""
          Just _ -> "hq"
      Just h3idx -> case mhqidx of
          Nothing -> "h3"
          Just hqidx -> if h3idx < hqidx then "h3" else "hq"
    where
      mh3idx = "h3" `L.elemIndex` protos
      mhqidx = "hq" `L.elemIndex` protos
  
  testH3ClientConfig :: H3.ClientConfig
  testH3ClientConfig = H3.defaultClientConfig{H3.authority = "127.0.0.1"}
  