]> gitweb.michael.orlitzky.com - dead/halcyon.git/blobdiff - src/Twitter/Http.hs
Use a more flexible curl function to make HTTP requests.
[dead/halcyon.git] / src / Twitter / Http.hs
index d7135cec3b058b4c93093fafd572612625354666..14b03825a4d924663c8fd9ff4d17d56b1b9f56c0 100644 (file)
@@ -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