imm-1.1.0.0: src/lib/Imm/HTTP/Simple.hs
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
-- | Simple HTTP client interpreter.
-- For more information, please consult "Network.HTTP.Client".
module Imm.HTTP.Simple (defaultManager, mkCoHttpClient, module Reexport) where
-- {{{ Imports
import Imm.HTTP
import Imm.Prelude
import Imm.Pretty
import Data.CaseInsensitive
import Network.Connection as Reexport
import Network.HTTP.Client as Reexport
import Network.HTTP.Client.TLS as Reexport
import URI.ByteString
-- }}}
-- | Interpreter for 'HttpClientF'
mkCoHttpClient :: (MonadIO m, MonadCatch m) => Manager -> CoHttpClientF m Manager
mkCoHttpClient manager = CoHttpClientF coGet where
coGet uri = handleAny (\e -> return (Left e, manager)) $ do
result <- httpGet manager uri
return (Right result, manager)
-- | Default manager uses TLS and no proxy
defaultManager :: IO Manager
defaultManager = newManager $ mkManagerSettings (TLSSettingsSimple False False False) Nothing
-- | Perform an HTTP GET request and return the response body
httpGet :: (MonadIO m, MonadThrow m)
=> Manager -> URI -> m LByteString
httpGet manager uri = do
request <- makeRequest uri
responseBody <$> io (httpLbs request manager)
-- codec' <- reader $ view (config.codec)
-- return $ response $=+ decode codec'
parseRequest' :: (MonadThrow m) => URI -> m Request
parseRequest' = parseRequest . show . prettyURI
-- | Build an HTTP request for given URI
makeRequest :: (MonadIO m, MonadThrow m) => URI -> m Request
makeRequest uri = do
req <- parseRequest' uri
return $ req { requestHeaders = [
(mk "User-Agent", "Mozilla/4.0"),
(mk "Accept", "*/*")]}