summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Wittig <max.wittig@siemens.com>2018-04-16 10:42:21 +0200
committerMax Wittig <max.wittig@siemens.com>2018-04-18 09:01:21 +0200
commit2abf9abacf834da797f2edf6866e12886d642b9d (patch)
treeb2532f3f7484e4af64bafb7a6592d2ce785b6834
parent25ed8e73f352b7f542a418c4ca2c802e3d90d06f (diff)
downloadgitlab-2abf9abacf834da797f2edf6866e12886d642b9d.tar.gz
feat: obey the rate limit
done by using the retry-after header Fixes #166
-rw-r--r--gitlab/__init__.py44
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.