]> jfr.im git - z_archive/twitter.git/blobdiff - twitter/api.py
API defaults to version 1.1
[z_archive/twitter.git] / twitter / api.py
index 236fb6b72176b3c09e30e3db1ceed862631930ae..8c7b08a325d0df7a16974c198e9572330037d99d 100644 (file)
@@ -5,10 +5,16 @@ except ImportError:
     import urllib2 as urllib_request
     import urllib2 as urllib_error
 
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from io import BytesIO as StringIO
+
 from twitter.twitter_globals import POST_ACTIONS
 from twitter.auth import NoAuth
 
 import re
+import gzip
 
 try:
     import json
@@ -35,7 +41,12 @@ class TwitterHTTPError(TwitterError):
         self.uri = uri
         self.format = format
         self.uriparts = uriparts
-        self.response_data = self.e.fp.read()
+        if self.e.headers['Content-Encoding'] == 'gzip':
+            buf = StringIO(self.e.fp.read())
+            f = gzip.GzipFile(fileobj=buf)
+            self.response_data = f.read()
+        else:
+            self.response_data = self.e.fp.read()
 
     def __str__(self):
         fmt = ("." + self.format) if self.format else ""
@@ -53,7 +64,7 @@ class TwitterResponse(object):
 
     `headers` gives you access to the response headers as an
     httplib.HTTPHeaders instance. You can do
-    `response.headers.getheader('h')` to retrieve a header.
+    `response.headers.get('h')` to retrieve a header.
     """
     def __init__(self, headers):
         self.headers = headers
@@ -63,14 +74,14 @@ class TwitterResponse(object):
         """
         Remaining requests in the current rate-limit.
         """
-        return int(self.headers.getheader('X-RateLimit-Remaining'))
+        return int(self.headers.get('X-RateLimit-Remaining', "0"))
 
     @property
     def rate_limit_reset(self):
         """
         Time in UTC epoch seconds when the rate limit will reset.
         """
-        return int(self.headers.getheader('X-RateLimit-Reset'))
+        return int(self.headers.get('X-RateLimit-Reset', "0"))
 
 
 def wrap_response(response, headers):
@@ -153,7 +164,7 @@ class TwitterCall(object):
         uriBase = "http%s://%s/%s%s%s" %(
                     secure_str, self.domain, uri, dot, self.format)
 
-        headers = {}
+        headers = {'Accept-Encoding': 'gzip'}
         if self.auth:
             headers.update(self.auth.generate_headers())
             arg_data = self.auth.encode_params(uriBase, method, kwargs)
@@ -169,12 +180,22 @@ class TwitterCall(object):
     def _handle_response(self, req, uri, arg_data):
         try:
             handle = urllib_request.urlopen(req)
+            if handle.headers['Content-Type'] in ['image/jpeg', 'image/png']:
+                return handle
+            elif handle.info().get('Content-Encoding') == 'gzip':
+                # Handle gzip decompression
+                buf = StringIO(handle.read())
+                f = gzip.GzipFile(fileobj=buf)
+                data = f.read()
+            else:
+                data = handle.read()
+
             if "json" == self.format:
-                res = json.loads(handle.read().decode('utf8'))
+                res = json.loads(data.decode('utf8'))
                 return wrap_response(res, handle.headers)
             else:
                 return wrap_response(
-                    handle.read().decode('utf8'), handle.headers)
+                    data.decode('utf8'), handle.headers)
         except urllib_error.HTTPError as e:
             if (e.code == 304):
                 return []
@@ -295,7 +316,7 @@ class Twitter(TwitterCall):
 
         if api_version is _DEFAULT:
             if domain == 'api.twitter.com':
-                api_version = '1'
+                api_version = '1.1'
             else:
                 api_version = None