diff options
author | Max Wittig <max.wittig@siemens.com> | 2018-04-16 10:42:21 +0200 |
---|---|---|
committer | Max Wittig <max.wittig@siemens.com> | 2018-04-18 09:01:21 +0200 |
commit | 2abf9abacf834da797f2edf6866e12886d642b9d (patch) | |
tree | b2532f3f7484e4af64bafb7a6592d2ce785b6834 | |
parent | 25ed8e73f352b7f542a418c4ca2c802e3d90d06f (diff) | |
download | gitlab-2abf9abacf834da797f2edf6866e12886d642b9d.tar.gz |
feat: obey the rate limit
done by using the retry-after header
Fixes #166
-rw-r--r-- | gitlab/__init__.py | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/gitlab/__init__.py b/gitlab/__init__.py index 1658c39..b8a6e30 100644 --- a/gitlab/__init__.py +++ b/gitlab/__init__.py @@ -23,6 +23,7 @@ import inspect import itertools import json import re +import time import warnings import requests @@ -698,24 +699,35 @@ class Gitlab(object): prepped.url = sanitized_url(prepped.url) settings = self.session.merge_environment_settings( prepped.url, {}, streamed, verify, None) - result = self.session.send(prepped, timeout=timeout, **settings) - if 200 <= result.status_code < 300: - return result + # obey the rate limit by default + obey_rate_limit = kwargs.get("obey_rate_limit", True) - try: - error_message = result.json()['message'] - except (KeyError, ValueError, TypeError): - error_message = result.content - - if result.status_code == 401: - raise GitlabAuthenticationError(response_code=result.status_code, - error_message=error_message, - response_body=result.content) - - raise GitlabHttpError(response_code=result.status_code, - error_message=error_message, - response_body=result.content) + while True: + result = self.session.send(prepped, timeout=timeout, **settings) + + if 200 <= result.status_code < 300: + return result + + if 429 == result.status_code and obey_rate_limit: + wait_time = int(result.headers["Retry-After"]) + time.sleep(wait_time) + continue + + try: + error_message = result.json()['message'] + except (KeyError, ValueError, TypeError): + error_message = result.content + + if result.status_code == 401: + raise GitlabAuthenticationError( + response_code=result.status_code, + error_message=error_message, + response_body=result.content) + + raise GitlabHttpError(response_code=result.status_code, + error_message=error_message, + response_body=result.content) def http_get(self, path, query_data={}, streamed=False, **kwargs): """Make a GET request to the Gitlab server. |