{-| Module : HTTPWrapper Description : Requests a URL and returns the response body Copyright : License : GPL-3 Maintainer : hahn@geoinfo.tuwien.ac.at Stability : experimental This module handles HTTP requests using the simpleHTTP function. It deals with the most exceptions. -} module HTTPWrapper (download) where import Control.Exception as E (SomeException, try) import Data.ByteString.Char8 as Bs (ByteString, pack) import Network.HTTP as HTTP (getRequest, simpleHTTP) import Network.HTTP.Base as Base import Network.HTTP.Headers as Headers import Network.Stream as Stream -- | requests the url with the parameter List via GET, -- returns an error message or the body as a ByteString download :: String -- ^ URL to request -> [(String,String)] -- ^ parameter list attached to the request URL e.g: [("p1","test"),("p2","today")] -> IO (Either String ByteString) -- ^ Left includes the error with a message, Right the response body download url requestParameter =do putStrLn requestURL downloadURL requestURL where requestURL = url ++ (Base.urlEncodeVars requestParameter) -- | function requests the URL and returns with a Error and a Message or with the body as ByteString -- can deal with redirects, see RealWorldHaskell for a description downloadURL :: String -> IO (Either String ByteString) -- downloadURL url = do result <- E.try (HTTP.simpleHTTP (HTTP.getRequest url)) :: IO (Either E.SomeException (Stream.Result (Response String))) case result of Left x -> return $ Left ("Problem with simpleHTTP :"++show x) Right resp -> case resp of Left x -> case x of Stream.ErrorReset ->return $ Left "ErrorReset: " Stream.ErrorClosed ->return $ Left "ErrorClosed: " Stream.ErrorParse y -> return $ Left ("ErrorClosed: "++show y) Stream.ErrorMisc y -> return $ Left ("ErrorClosed: "++show y) Right r -> case rspCode r of (2,_,_) -> return $ Right (Bs.pack $ rspBody r) (3,_,_) -> case findHeader Headers.HdrLocation r of --redirect Nothing -> return $ Left (show r) Just redirecturl -> downloadURL redirecturl _ -> return $ Left ("unknown Problem occurred")