3
3
from json import dumps
4
4
5
5
import requests
6
+ from requests .adapters import HTTPAdapter
6
7
7
8
try :
8
9
from oauthlib .oauth1 .rfc5849 import SIGNATURE_RSA_SHA512 as SIGNATURE_RSA
11
12
from requests import HTTPError
12
13
from requests_oauthlib import OAuth1 , OAuth2
13
14
from six .moves .urllib .parse import urlencode
15
+ from urllib3 .util import Retry
14
16
15
17
from atlassian .request_utils import get_default_logger
16
18
@@ -61,7 +63,44 @@ def __init__(
61
63
proxies = None ,
62
64
token = None ,
63
65
cert = None ,
66
+ backoff_and_retry = False ,
67
+ retry_status_codes = [413 , 429 , 503 ],
68
+ max_backoff_seconds = 1800 ,
69
+ max_backoff_retries = 1000 ,
64
70
):
71
+ """
72
+ init function for the AtlassianRestAPI object.
73
+
74
+ :param url: The url to be used in the request.
75
+ :param username: Username. Defaults to None.
76
+ :param password: Password. Defaults to None.
77
+ :param timeout: Request timeout. Defaults to 75.
78
+ :param api_root: Root for the api requests. Defaults to "rest/api".
79
+ :param api_version: Version of the API to use. Defaults to "latest".
80
+ :param verify_ssl: Turn on / off SSL verification. Defaults to True.
81
+ :param session: Pass an existing Python requests session object. Defaults to None.
82
+ :param oauth: oauth. Defaults to None.
83
+ :param oauth2: oauth2. Defaults to None.
84
+ :param cookies: Cookies to send with the request. Defaults to None.
85
+ :param advanced_mode: Return results in advanced mode. Defaults to None.
86
+ :param kerberos: Kerberos. Defaults to None.
87
+ :param cloud: Specify if using Atlassian Cloud. Defaults to False.
88
+ :param proxies: Specify proxies to use. Defaults to None.
89
+ :param token: Atlassian / Jira auth token. Defaults to None.
90
+ :param cert: Client-side certificate to use. Defaults to None.
91
+ :param backoff_and_retry: Enable exponential backoff and retry.
92
+ This will retry the request if there is a predefined failure. Primarily
93
+ designed for Atlassian Cloud where API limits are commonly hit if doing
94
+ operations on many issues, and the limits require a cooling off period.
95
+ The wait period before the next request increases exponentially with each
96
+ failed retry. Defaults to False.
97
+ :param retry_status_codes: Errors to match, passed as a list of HTTP
98
+ response codes. Defaults to [413, 429, 503].
99
+ :param max_backoff_seconds: Max backoff seconds. When backing off, requests won't
100
+ wait any longer than this. Defaults to 1800.
101
+ :param max_backoff_retries: Maximum number of retries to try before
102
+ continuing. Defaults to 1000.
103
+ """
65
104
self .url = url
66
105
self .username = username
67
106
self .password = password
@@ -78,6 +117,18 @@ def __init__(
78
117
self ._session = requests .Session ()
79
118
else :
80
119
self ._session = session
120
+ if backoff_and_retry :
121
+ # Note: we only retry on status and not on any of the
122
+ # other supported reasons
123
+ retries = Retry (
124
+ total = None ,
125
+ status = max_backoff_retries ,
126
+ allowed_methods = None ,
127
+ status_forcelist = retry_status_codes ,
128
+ backoff_factor = 1 ,
129
+ backoff_jitter = 1 ,
130
+ backoff_max = max_backoff_seconds )
131
+ self ._session .mount (self .url , HTTPAdapter (max_retries = retries ))
81
132
if username and password :
82
133
self ._create_basic_session (username , password )
83
134
elif token is not None :
0 commit comments