| Index: rietveld.py
|
| diff --git a/rietveld.py b/rietveld.py
|
| index 9adc9c5ca1346a99c79552dc62ae77c17c576871..22168f572709de041fb17d18020c590ea2cadb44 100644
|
| --- a/rietveld.py
|
| +++ b/rietveld.py
|
| @@ -21,6 +21,7 @@ import logging
|
| import re
|
| import socket
|
| import ssl
|
| +import StringIO
|
| import sys
|
| import time
|
| import urllib
|
| @@ -409,23 +410,20 @@ class Rietveld(object):
|
| if m:
|
| # Fake an HTTPError exception. Cheezy. :(
|
| raise urllib2.HTTPError(
|
| - request_path, int(m.group(1)), msg, None, None)
|
| + request_path, int(m.group(1)), msg, None, StringIO.StringIO())
|
| old_error_exit(msg)
|
| upload.ErrorExit = trap_http_500
|
|
|
| for retry in xrange(self._maxtries):
|
| try:
|
| logging.debug('%s' % request_path)
|
| - result = self.rpc_server.Send(request_path, **kwargs)
|
| - # Sometimes GAE returns a HTTP 200 but with HTTP 500 as the content.
|
| - # How nice.
|
| - return result
|
| + return self.rpc_server.Send(request_path, **kwargs)
|
| except urllib2.HTTPError, e:
|
| if retry >= (self._maxtries - 1):
|
| raise
|
| - flake_codes = [500, 502, 503]
|
| + flake_codes = {500, 502, 503}
|
| if retry_on_404:
|
| - flake_codes.append(404)
|
| + flake_codes.add(404)
|
| if e.code not in flake_codes:
|
| raise
|
| except urllib2.URLError, e:
|
| @@ -440,10 +438,10 @@ class Rietveld(object):
|
| # The reason can be a string or another exception, e.g.,
|
| # socket.error or whatever else.
|
| reason_as_str = str(e.reason)
|
| - for retry_anyway in [
|
| + for retry_anyway in (
|
| 'Name or service not known',
|
| 'EOF occurred in violation of protocol',
|
| - 'timed out']:
|
| + 'timed out'):
|
| if retry_anyway in reason_as_str:
|
| return True
|
| return False # Assume permanent otherwise.
|
| @@ -528,6 +526,11 @@ class OAuthRpcServer(object):
|
| payload: request is a POST if not None, GET otherwise
|
| timeout: in seconds
|
| extra_headers: (dict)
|
| +
|
| + Returns: the HTTP response body as a string
|
| +
|
| + Raises:
|
| + urllib2.HTTPError
|
| """
|
| # This method signature should match upload.py:AbstractRpcServer.Send()
|
| method = 'GET'
|
| @@ -543,7 +546,6 @@ class OAuthRpcServer(object):
|
| try:
|
| if timeout:
|
| self._http.timeout = timeout
|
| - # TODO(pgervais) implement some kind of retry mechanism (see upload.py).
|
| url = self.host + request_path
|
| if kwargs:
|
| url += "?" + urllib.urlencode(kwargs)
|
| @@ -572,6 +574,11 @@ class OAuthRpcServer(object):
|
| continue
|
| break
|
|
|
| + if ret[0].status >= 300:
|
| + raise urllib2.HTTPError(
|
| + request_path, int(ret[0]['status']), ret[1], None,
|
| + StringIO.StringIO())
|
| +
|
| return ret[1]
|
|
|
| finally:
|
|
|