module LaunchDarkly.Server.Config.HttpConfiguration
    ( HttpConfiguration(..)
    , prepareRequest
    )
    where

import Network.HTTP.Client (Manager, ResponseTimeout, Request, requestHeaders, responseTimeout, setRequestIgnoreStatus, parseRequest)
import Network.HTTP.Types  (Header)
import Control.Monad.Catch (MonadThrow)

data HttpConfiguration = HttpConfiguration 
    { HttpConfiguration -> [Header]
defaultRequestHeaders :: ![Header]
    , HttpConfiguration -> ResponseTimeout
defaultRequestTimeout :: !ResponseTimeout
    , HttpConfiguration -> Manager
tlsManager :: !Manager
    }

prepareRequest :: (MonadThrow m) => HttpConfiguration -> String -> m Request
prepareRequest :: forall (m :: * -> *).
MonadThrow m =>
HttpConfiguration -> String -> m Request
prepareRequest HttpConfiguration
config String
uri = do
    Request
baseReq <- forall (m :: * -> *). MonadThrow m => String -> m Request
parseRequest String
uri
    forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ Request -> Request
setRequestIgnoreStatus forall a b. (a -> b) -> a -> b
$ Request
baseReq 
        { requestHeaders :: [Header]
requestHeaders       = HttpConfiguration -> [Header]
defaultRequestHeaders HttpConfiguration
config forall a. Semigroup a => a -> a -> a
<> Request -> [Header]
requestHeaders Request
baseReq 
        , responseTimeout :: ResponseTimeout
responseTimeout      = HttpConfiguration -> ResponseTimeout
defaultRequestTimeout HttpConfiguration
config 
        }