Skip to content

Commit

Permalink
Merge pull request #972 from mitar/http-retry
Browse files Browse the repository at this point in the history
Retry transient HTTP errors
  • Loading branch information
max-wittig committed Dec 13, 2019
2 parents 3e2d694 + 59fe271 commit 36bbd37
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 1 deletion.
18 changes: 18 additions & 0 deletions docs/api-usage.rst
Expand Up @@ -348,3 +348,21 @@ throttled, you can set this parameter to -1. This parameter is ignored if
.. warning::

You will get an Exception, if you then go over the rate limit of your GitLab instance.

Transient errors
----------------

GitLab server can sometimes return a transient HTTP error.
python-gitlab can automatically retry in such case, when
``retry_transient_errors`` argument is set to ``True``. When enabled,
HTTP error codes 500 (Internal Server Error), 502 (502 Bad Gateway),
503 (Service Unavailable), and 504 (Gateway Timeout) are retried. By
default an exception is raised for these errors.

.. code-block:: python
import gitlab
import requests
gl = gitlab.gitlab(url, token, api_version=4)
gl.projects.list(all=True, retry_transient_errors=True)
6 changes: 5 additions & 1 deletion gitlab/__init__.py
Expand Up @@ -518,6 +518,8 @@ def http_request(

# obey the rate limit by default
obey_rate_limit = kwargs.get("obey_rate_limit", True)
# do not retry transient errors by default
retry_transient_errors = kwargs.get("retry_transient_errors", False)

# set max_retries to 10 by default, disable by setting it to -1
max_retries = kwargs.get("max_retries", 10)
Expand All @@ -531,7 +533,9 @@ def http_request(
if 200 <= result.status_code < 300:
return result

if 429 == result.status_code and obey_rate_limit:
if (429 == result.status_code and obey_rate_limit) or (
result.status_code in [500, 502, 503, 504] and retry_transient_errors
):
if max_retries == -1 or cur_retries < max_retries:
wait_time = 2 ** cur_retries * 0.1
if "Retry-After" in result.headers:
Expand Down

0 comments on commit 36bbd37

Please sign in to comment.