packages feed

http-exchange-instantiations-0.1.0.0: app-http-insecure/Main.hs

{-# 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