content: -- | 'HttpConfig' is used in the 'Hreq.Client.Internal.HTTP.Hreq' Monad for HTTP client configuration
  --
  module Hreq.Client.Internal.Config
    ( -- * HttpConfig
      HttpConfig (..)
      -- * Status Range
    , StatusRange (..)
      -- * Helper function
    , createDefConfig
    ) where
  
  import Control.Concurrent.STM.TVar (TVar)
  import Control.Retry (RetryPolicy, retryPolicyDefault)
  import qualified Network.HTTP.Client as C
  import qualified Network.HTTP.Client.TLS as TLS
  
  import Hreq.Core.API (StatusCode)
  import Hreq.Core.Client
  
  -- | Valid Response status code range
  data StatusRange = StatusRange
    { statusUpper :: StatusCode
    , statusLower :: StatusCode
    }
  
  data HttpConfig = HttpConfig
    { httpBaseUrl     :: BaseUrl
    , httpStatuses    :: StatusRange
    , httpCookieJar   :: Maybe (TVar C.CookieJar)
    , httpRetryPolicy :: RetryPolicy
    , httpManager     :: C.Manager
    }
  
  -- | Function for creating a default 'HttpConfig'
  createDefConfig :: BaseUrl -> IO HttpConfig
  createDefConfig baseUrl@(BaseUrl scheme _ _ _) =
    HttpConfig baseUrl (StatusRange 200 300) Nothing retryPolicyDefault <$> manager
    where
      manager :: IO C.Manager
      manager = case scheme of
         Http  -> C.newManager C.defaultManagerSettings
         Https -> C.newManager TLS.tlsManagerSettings
  