| Index: rietveld.py
|
| diff --git a/rietveld.py b/rietveld.py
|
| index f2e95ff992c3e27ce89ca90b88a664730a950885..3a759b90e3f600f0b4fa7a97eacd533f709e3b12 100644
|
| --- a/rietveld.py
|
| +++ b/rietveld.py
|
| @@ -311,27 +311,43 @@ class Rietveld(object):
|
|
|
| def _send(self, request_path, **kwargs):
|
| """Sends a POST/GET to Rietveld. Returns the response body."""
|
| - maxtries = 5
|
| - for retry in xrange(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
|
| - except urllib2.HTTPError, e:
|
| - if retry >= (maxtries - 1):
|
| - raise
|
| - if e.code not in (500, 502, 503):
|
| - raise
|
| - except urllib2.URLError, e:
|
| - if retry >= (maxtries - 1):
|
| - raise
|
| - if not 'Name or service not known' in e.reason:
|
| - # Usually internal GAE flakiness.
|
| - raise
|
| - # If reaching this line, loop again. Uses a small backoff.
|
| - time.sleep(1+maxtries*2)
|
| + try:
|
| + # Sadly, upload.py calls ErrorExit() which does a sys.exit(1) on HTTP
|
| + # 500 in AbstractRpcServer.Send().
|
| + old_error_exit = upload.ErrorExit
|
| + def trap_http_500(msg):
|
| + """Converts an incorrect ErrorExit() call into a HTTPError exception."""
|
| + m = re.search(r'(50\d) Server Error', msg)
|
| + if m:
|
| + # Fake an HTTPError exception. Cheezy. :(
|
| + raise urllib2.HTTPError(
|
| + request_path, m.group(1), e.args[0], None, None)
|
| + old_error_exit(msg)
|
| + upload.ErrorExit = trap_http_500
|
| +
|
| + maxtries = 5
|
| + for retry in xrange(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
|
| + except urllib2.HTTPError, e:
|
| + if retry >= (maxtries - 1):
|
| + raise
|
| + if e.code not in (500, 502, 503):
|
| + raise
|
| + except urllib2.URLError, e:
|
| + if retry >= (maxtries - 1):
|
| + raise
|
| + if not 'Name or service not known' in e.reason:
|
| + # Usually internal GAE flakiness.
|
| + raise
|
| + # If reaching this line, loop again. Uses a small backoff.
|
| + time.sleep(1+maxtries*2)
|
| + finally:
|
| + upload.ErrorExit = old_error_exit
|
|
|
| # DEPRECATED.
|
| Send = get
|
|
|