Chromium Code Reviews| Index: rietveld.py |
| diff --git a/rietveld.py b/rietveld.py |
| index 97dae6d083912203c27f48ef9f48478639cd9878..c3c8c5f8005b646604a72846738cdd5172308dcd 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,28 @@ 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 |
|
ghost stip (do not use)
2014/04/18 22:02:11
nit: that
|
| + # prevents any usage of redirections in pages accessed this way. |
|
ghost stip (do not use)
2014/04/18 22:02:11
Add a comment that the redirect_caught check means
|
| + 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: |