packages feed

tmp-proc-0.5.0.0: test/Test/SimpleServer.hs

{-# LANGUAGE DataKinds         #-}
{-# LANGUAGE OverloadedStrings #-}
module Test.SimpleServer
  ( -- * functions
    statusOfGet
  , statusOfGet'

    -- * test constants
  , defaultTLSSettings
  )
where

import           Data.List                   (foldl')

import           Data.Text                   (Text)
import qualified Data.Text                   as Text

import qualified Network.Connection          as HC
import qualified Network.HTTP.Client         as HC
import           Network.HTTP.Client.TLS     (mkManagerSettings)
import           Network.HTTP.Req
import qualified Network.Wai.Handler.Warp    as Warp
import qualified Network.Wai.Handler.WarpTLS as Warp


-- | Determine the status from a Get on localhost.
statusOfGet :: Warp.Port -> Text -> IO Int
statusOfGet p path = runReq defaultHttpConfig $ do
  r <- req GET (localUrl path) NoReqBody ignoreResponse $ port p
  return $ responseStatusCode r


statusOfGet' :: Int -> Text -> IO Int
statusOfGet' p path = do
  manager <- mkSimpleTLSManager
  runReq (defaultHttpConfig { httpConfigAltManager = Just manager }) $ do
    r <- req GET (localHttpsUrl path) NoReqBody ignoreResponse $ port p
    return $ responseStatusCode r


localUrl :: Text -> Url 'Http
localUrl p = foldl' (/:) (http "localhost")
  $ Text.splitOn "/" $ Text.dropWhile (== '/') p


localHttpsUrl :: Text -> Url 'Https
localHttpsUrl p = foldl' (/:) (https "localhost")
  $ Text.splitOn "/" $ Text.dropWhile (== '/') p


defaultTLSSettings :: Warp.TLSSettings
defaultTLSSettings = Warp.tlsSettings "test_certs/certificate.pem" "test_certs/key.pem"


mkSimpleTLSManager :: IO HC.Manager
mkSimpleTLSManager = HC.newManager
  $ mkManagerSettings (HC.TLSSettingsSimple True False False) Nothing