-- | A wrapper around Network.HTTP to present a simpler interface for
-- requesting pages via HTTP
module Network.Browser.Simple (download) where

import Network.URI
import Network.HTTP
import Network.Browser
import Network.HTTP.Encoding
import Data.ByteString.Lazy

-- | Requests a web page specified by the URI, including optional
-- cookies. Returns the contents of the page as a @String@ and new
-- cookies. Follows redirects, decodes the response body, if
-- possible. Can fail if decoding is impossible.
download :: URI -> [Cookie] -> IO (String, [Cookie])
download uri cookies = 
  browse $ do setAllowRedirects True
              setUserAgent "Mozilla/5.0 (compatible; jespresso/1.0)"
              setCookies cookies
              (_, rsp) <- request (defaultGETRequest_ uri :: Request ByteString)
              cks <- getCookies
              return (rsp, cks)
  >>= \(rsp, cks) -> case decodeBody rsp of
               Left msg  -> fail $ show msg
               Right res -> return (decodedBody res, cks)