-- based on code from http://darcs.haskell.org/http/test/get.hs import Data.Char (intToDigit) import Network.HTTP import Network.URI import Network.Stream (ConnError) import System.Environment (getArgs) import System.Exit (exitFailure) import System.IO (hPutStrLn, stderr, openFile, IOMode(..), hPutStr, hClose) import Data.Maybe (isNothing) import VotesUtil voteYear = 2005 voteGetDir = "http://clerk.house.gov/evs/" ++ (show voteYear) ++ "/" maxVoteNum = 671 -- TODO - figure this out -- maxVoteNum = 543 -- TODO - figure this out -- maxVoteNum = 175 -- TODO - figure this out getDestFilename :: Int -> String getDestFilename num = fileNameFromVoteIndex (VoteIndex voteYear num) getTargetFilename :: Int -> String getTargetFilename num = voteGetDir ++ "roll" ++ (padString 3 "0" (show num)) ++ ".xml" getTargetURI :: Int -> Maybe URI getTargetURI num = parseURI (getTargetFilename num) getTargetFile :: Int -> IO () getTargetFile num = case getTargetURI num of Nothing -> err ("Could not parse URI for number " ++ (show num)) Just uri -> do text <- get uri writeFile (getDestFilename num) text downloadAll :: IO () downloadAll = sequence_ (map getTargetFile [1..maxVoteNum]) --downloadURI :: Int -> Maybe (IO Bool) --downloadURI num = let target = getTargetURI num -- in if (isNothing(target)) -- then Nothing -- else do blah <- map getTargetFile [1..maxVoteNum] -- return Just True main = do downloadAll --main = writeFile "samplefile.txt" "sampletext" --main = -- do -- args <- getArgs -- case args of -- [addr] -> case parseURI addr of -- Nothing -> err "Could not parse URI" -- Just uri -> do -- cont <- get uri -- putStr cont -- _ -> err "Usage: get " err :: String -> IO a err msg = do hPutStrLn stderr msg exitFailure get :: URI -> IO String get uri = do eresp <- simpleHTTP (request uri) resp <- handleE (err . show) eresp case rspCode resp of (2,0,0) -> return (rspBody resp) _ -> err (httpError resp) where showRspCode (a,b,c) = map intToDigit [a,b,c] httpError resp = showRspCode (rspCode resp) ++ " " ++ rspReason resp request :: URI -> Request String request uri = Request{ rqURI = uri, rqMethod = GET, rqHeaders = [], rqBody = "" } handleE :: Monad m => (ConnError -> m a) -> Either ConnError a -> m a handleE h (Left e) = h e handleE _ (Right v) = return v