try:
conn.request(self.method, url, headers=self.headers, body=self.post_data)
resp = conn.getresponse()
- except Exception, e:
+ except Exception as e:
raise TweepError('Failed to send request: %s' % e)
-
+
+ if self.wait_on_rate_limit:
+ rem_calls = resp.getheader('x-rate-limit-remaining')
+ if rem_calls is not None:
+ self._remaining_calls = int(rem_calls)
+ elif isinstance(self._remaining_calls, int):
+ self._remaining_calls -= 1
+ reset_time = resp.getheader('x-rate-limit-reset')
+ if reset_time is not None:
+ self._reset_time = int(reset_time)
+ if rem_calls == 0 and (resp.status == 429 or resp.status == 420): # if ran out of calls before waiting switching retry last call
+ continue
+
+ retry_delay = self.retry_delay
# Exit request loop if non-retry error code
- if self.retry_errors:
- if resp.status not in self.retry_errors: break
- else:
- if resp.status == 200: break
+ if resp.status == 200:
+ break
+ elif (resp.status == 429 or resp.status == 420) and self.wait_on_rate_limit:
+ if 'retry-after' in resp.msg:
+ retry_delay = float(resp.msg['retry-after'])
+ elif self.retry_errors and resp.status not in self.retry_errors:
+ break
# Sleep before retrying request again
- time.sleep(self.retry_delay)
+ time.sleep(retry_delay)
retries_performed += 1
# If an error was returned, throw an exception