Index: rietveld.py |
diff --git a/rietveld.py b/rietveld.py |
index 97dae6d083912203c27f48ef9f48478639cd9878..d78c0171d468f789ca5be44b3aea1434cd4dbed8 100644 |
--- a/rietveld.py |
+++ b/rietveld.py |
@@ -481,14 +481,14 @@ class OAuthRpcServer(object): |
"OAuth2 support requires it.") |
logging.error("Installing pyopenssl will probably solve this issue.") |
raise RuntimeError('No OpenSSL support') |
- creds = oa2client.SignedJwtAssertionCredentials( |
+ self.creds = oa2client.SignedJwtAssertionCredentials( |
client_email, |
client_private_key, |
'https://www.googleapis.com/auth/userinfo.email', |
private_key_password=private_key_password, |
user_agent=user_agent) |
- self._http = creds.authorize(httplib2.Http(timeout=timeout)) |
+ self._http = self.creds.authorize(httplib2.Http(timeout=timeout)) |
def Send(self, |
request_path, |
@@ -525,17 +525,30 @@ class OAuthRpcServer(object): |
if kwargs: |
url += "?" + urllib.urlencode(kwargs) |
- ret = self._http.request(url, |
- method=method, |
- body=payload, |
- headers=headers) |
- |
- if (method == 'GET' |
- and not ret[0]['content-location'].startswith(self.host)): |
- upload.logging.warning('Redirection to host %s detected: ' |
- 'login may have failed/expired.' |
- % urlparse.urlparse( |
- ret[0]['content-location']).netloc) |
+ # This weird loop is there to detect when the OAuth2 token has expired. |
+ # This is specific to appengine *and* rietveld. It relies on the |
+ # assumption that a 302 is triggered only by an expired OAuth2 token. This |
+ # prevents any usage of redirections in pages accessed this way. |
+ |
+ # This variable is used to make sure the following loop runs only twice. |
+ redirect_caught = False |
+ while True: |
+ try: |
+ ret = self._http.request(url, |
+ method=method, |
+ body=payload, |
+ headers=headers, |
+ redirections=0) |
+ except httplib2.RedirectLimit: |
+ if redirect_caught or method != 'GET': |
+ logging.error('Redirection detected after logging in. Giving up.') |
+ raise |
+ redirect_caught = True |
+ logging.debug('Redirection detected. Trying to log in again...') |
+ self.creds.access_token = None |
+ continue |
+ break |
+ |
return ret[1] |
finally: |