{-# language OverloadedStrings #-}
import Control.Exception (bracket,throwIO)
import Http.Exchange.Network (exchange)
import Http.Types (Request(..),RequestLine(..),Bodied(..),Header(Header))
import Text.Show.Pretty (pPrint)
import qualified Http.Headers as Headers
import qualified Network.Socket as N
main :: IO ()
main = do
let hints = N.defaultHints { N.addrSocketType = N.Stream }
minfo <- N.getAddrInfo (Just hints) (Just "ifconfig.me") (Just "80")
info <- case minfo of
info : _ -> pure info
[] -> fail "Impossible: getAddrInfo cannot return empty list"
bracket (N.openSocket info) N.close $ \sock -> do
N.connect sock (N.addrAddress info)
result <- exchange sock Bodied
{ metadata = Request
{ requestLine = RequestLine
{ method = "GET"
, path = "/ip"
}
, headers = Headers.fromList
[ Header "Host" "ifconfig.me"
, Header "Accept" "text/plain"
, Header "User-Agent" "curl/0.0.0"
]
}
, body = mempty
}
case result of
Left e -> throwIO e
Right resp -> pPrint resp