X-Git-Url: http://gitweb.michael.orlitzky.com/?p=dead%2Fhalcyon.git;a=blobdiff_plain;f=src%2FTwitter%2FHttp.hs;h=14b03825a4d924663c8fd9ff4d17d56b1b9f56c0;hp=d7135cec3b058b4c93093fafd572612625354666;hb=bfe49b970e83f1d422d57ece7cebdfe7a56b817c;hpb=69b8af30f49aaad0f5c051998d2556b9ec291df7 diff --git a/src/Twitter/Http.hs b/src/Twitter/Http.hs index d7135ce..14b0382 100644 --- a/src/Twitter/Http.hs +++ b/src/Twitter/Http.hs @@ -17,6 +17,12 @@ user_timeline_url username = "&include_rts=true", "&count=10" ] +status_url :: Integer -> String +status_url status_id = + concat [ "http://api.twitter.com/1/statuses/show/", + (show status_id), + ".xml" ] + -- |Given username's last status id, constructs the API URL for -- username's new statuses. Essentially, 'user_timeline_url' with a -- "since_id" parameter tacked on. @@ -26,6 +32,13 @@ user_new_statuses_url username last_status_id = "&since_id=" ++ (show last_status_id) ] +get_status :: Integer -> IO (Maybe String) +get_status status_id = do + let uri = (status_url status_id) + status <- (http_get uri) + return status + + -- |Return's username's timeline, or 'Nothing' if there was an error. get_user_timeline :: String -> IO (Maybe String) get_user_timeline username = do @@ -34,8 +47,8 @@ get_user_timeline username = do return timeline --- Returns the XML representing all of username's statuses that are --- newer than last_status_id. +-- | Returns the XML representing all of username's statuses that are +-- newer than last_status_id. get_user_new_statuses :: String -> Integer -> IO (Maybe String) get_user_new_statuses username last_status_id = do let uri = (user_new_statuses_url username last_status_id) @@ -43,14 +56,37 @@ get_user_new_statuses username last_status_id = do return new_statuses --- |Uses the CURL API to retrieve uri. Returns 'Nothing' if there was --- an error. +-- | Options that will be passed to every curl request. +curl_options :: [CurlOption] +curl_options = + [ CurlTimeout 45, + -- The Global cache is not thread-friendly. + CurlDNSUseGlobalCache False, + -- And we don't want to use a DNS cache anyway. + CurlDNSCacheTimeout 0 ] + + +-- | Uses the CURL API to retrieve uri. Returns 'Nothing' if there was +-- an error. http_get :: String -> IO (Maybe String) -http_get uri = withCurlDo $ do - resp <- curlGetString uri [CurlTimeout 45] - - case resp of - (CurlOK, body) -> return (Just body) - (code, _) -> do - hPutStrLn stderr ("HTTP Error: " ++ (show code)) - return Nothing +http_get uri = + withCurlDo $ do + -- Create a Curl instance. + curl <- initialize + + -- Perform the request, and get back a CurlResponse object. + -- The cast is needed to specify how we would like our headers + -- and body returned (Strings). + resp <- do_curl_ curl uri curl_options :: IO CurlResponse + + -- Pull out the response code as a CurlCode. + let code = respCurlCode resp + + case code of + CurlOK -> return $ Just (respBody resp) + error_code -> do + hPutStrLn stderr ("HTTP Error: " ++ (show error_code)) + -- If an error occurred, we want to dump as much information as + -- possible. If this becomes a problem, we can use respGetInfo to + -- query the response object for more information + return Nothing