packages feed

morley-client-0.1.0: src/Morley/Client/RPC/HttpClient.hs

-- SPDX-FileCopyrightText: 2020 Tocqueville Group
--
-- SPDX-License-Identifier: LicenseRef-MIT-TQ

module Morley.Client.RPC.HttpClient
  ( newClientEnv
  ) where

import Network.HTTP.Client (ManagerSettings(..), Request(..), defaultManagerSettings, newManager)
import Network.HTTP.Client.TLS (tlsManagerSettings)
import Servant.Client (BaseUrl(..), ClientEnv, Scheme(..), mkClientEnv)

-- | Make servant client environment from morley client config.
--
-- Note: Creating a new servant manager is a relatively expensive
-- operation, so this function is not supposed to be called often.
newClientEnv :: BaseUrl -> IO ClientEnv
newClientEnv endpointUrl = do
  manager' <- newManager $ case baseUrlScheme endpointUrl of
    Http  -> defaultManagerSettings{ managerModifyRequest = fixRequest }
    Https -> tlsManagerSettings{ managerModifyRequest = fixRequest }
  return $ mkClientEnv manager' endpointUrl

-- | Add header, required by the Tezos RPC interface
fixRequest :: Request -> IO Request
fixRequest req = return $
  req { requestHeaders = ("Content-Type", "application/json") :
        filter (("Content-Type" /=) . fst) (requestHeaders req)
      }