{-# OPTIONS_GHC -cpp #-}
module HTTP(copyUrl,fetchUrl,postUrl,exists) where
#ifdef HAVE_HTTP
import Network.HTTP
import Network.URI
import Darcs.Global ( debugMessage )
#endif
copyUrl :: String -> String -> a -> IO ()
copyUrl url file _cache = fetchUrl url >>= writeFile file
exists :: Bool
fetchUrl :: String -> IO String
postUrl
:: String -- ^ url
-> String -- ^ body
-> String -- ^ mime type
-> IO () -- ^ result
#ifdef HAVE_HTTP
headers :: [Header]
headers = [Header HdrUserAgent $ "darcs-HTTP/" ++ PACKAGE_VERSION]
exists = True
fetchUrl url = case parseURI url of
Nothing -> fail $ "Invalid URI: " ++ url
Just uri -> do debugMessage $ "Fetching over HTTP: "++url
resp <- simpleHTTP $ Request { rqURI = uri,
rqMethod = GET,
rqHeaders = headers,
rqBody = "" }
case resp of
Right res@Response { rspCode = (2,0,0) } -> return (rspBody res)
Right Response { rspCode = (x,y,z) } ->
fail $ "HTTP " ++ show x ++ show y ++ show z ++ " error getting " ++ show uri
Left err -> fail $ show err
postUrl url body mime = case parseURI url of
Nothing -> fail $ "Invalid URI: " ++ url
Just uri -> do debugMessage $ "Posting to HTTP: "++url
resp <- simpleHTTP $ Request { rqURI = uri,
rqMethod = POST,
rqHeaders = headers ++ [Header HdrContentType mime,
Header HdrAccept "text/plain",
Header HdrContentLength
(show $ length body) ],
rqBody = body }
case resp of
Right res@Response { rspCode = (2,y,z) } -> do
putStrLn $ "Success 2" ++ show y ++ show z
putStrLn (rspBody res)
return ()
Right res@Response { rspCode = (x,y,z) } -> do
putStrLn $ rspBody res
fail $ "HTTP " ++ show x ++ show y ++ show z ++ " error posting to " ++ show uri
Left err -> fail $ show err
#else
exists = False
fetchUrl _ = fail "Network.HTTP does not exist"
postUrl _ _ _ = fail "Cannot use http POST because darcs was not compiled with Network.HTTP."
#endif