+ def _handle_response_with_retry(self, req, uri, arg_data, _timeout=None):
+ while True:
+ try:
+ return self._handle_response(req, uri, arg_data, _timeout)
+ except TwitterHTTPError as e:
+ if e.e.code == 429:
+ # API rate limit reached
+ reset = int(e.e.headers.get('X-Rate-Limit-Reset', time() + 30))
+ delay = int(reset - time() + 2) # add some extra margin
+ print("API rate limit reached; waiting for %ds..." % delay, file=sys.stderr)
+ elif e.e.code in (502, 503, 504):
+ delay = 30
+ print("Service unavailable; waiting for %ds..." % delay, file=sys.stderr)
+ else:
+ raise
+ sleep(delay)
+