|
16 | 16 | import logging |
17 | 17 | import requests |
18 | 18 |
|
| 19 | +from math import ceil |
| 20 | +from time import sleep |
| 21 | + |
19 | 22 | from bigcommerce.exception import * |
20 | 23 |
|
21 | 24 | log = logging.getLogger("bigcommerce.connection") |
@@ -183,12 +186,14 @@ class OAuthConnection(Connection): |
183 | 186 | The verify_payload method is also provided for authenticating signed payloads passed to an application's load url. |
184 | 187 | """ |
185 | 188 |
|
186 | | - def __init__(self, client_id, store_hash, access_token=None, host='api.bigcommerce.com', api_path='/stores/{}/v2/{}'): |
| 189 | + def __init__(self, client_id, store_hash, access_token=None, host='api.bigcommerce.com', |
| 190 | + api_path='/stores/{}/v2/{}', rate_limiting_management=None): |
187 | 191 | self.client_id = client_id |
188 | 192 | self.store_hash = store_hash |
189 | 193 | self.host = host |
190 | 194 | self.api_path = api_path |
191 | 195 | self.timeout = 7.0 # can attach to session? |
| 196 | + self.rate_limiting_management = rate_limiting_management |
192 | 197 |
|
193 | 198 | self._session = requests.Session() |
194 | 199 | self._session.headers = {"Accept": "application/json", |
@@ -250,8 +255,20 @@ def _handle_response(self, url, res, suppress_empty=True): |
250 | 255 | """ |
251 | 256 | result = Connection._handle_response(self, url, res, suppress_empty) |
252 | 257 | if 'X-Rate-Limit-Time-Reset-Ms' in res.headers: |
253 | | - self.rate_limit = dict(ms_until_reset=res.headers['X-Rate-Limit-Time-Reset-Ms'], |
254 | | - window_size_ms=res.headers['X-Rate-Limit-Time-Window-Ms'], |
255 | | - requests_remaining=res.headers['X-Rate-Limit-Requests-Left'], |
256 | | - requests_quota=res.headers['X-Rate-Limit-Requests-Quota']) |
| 258 | + self.rate_limit = dict(ms_until_reset=int(res.headers['X-Rate-Limit-Time-Reset-Ms']), |
| 259 | + window_size_ms=int(res.headers['X-Rate-Limit-Time-Window-Ms']), |
| 260 | + requests_remaining=int(res.headers['X-Rate-Limit-Requests-Left']), |
| 261 | + requests_quota=int(res.headers['X-Rate-Limit-Requests-Quota'])) |
| 262 | + if self.rate_limiting_management: |
| 263 | + if self.rate_limiting_management['min_requests_remaining'] >= self.rate_limit['requests_remaining']: |
| 264 | + if self.rate_limiting_management['wait']: |
| 265 | + sleep(ceil(float(self.rate_limit['ms_until_reset']) / 1000)) |
| 266 | + if self.rate_limiting_management.get('callback_function'): |
| 267 | + callback = self.rate_limiting_management['callback_function'] |
| 268 | + args_dict = self.rate_limiting_management.get('callback_args') |
| 269 | + if args_dict: |
| 270 | + callback(args_dict) |
| 271 | + else: |
| 272 | + callback() |
| 273 | + |
257 | 274 | return result |
0 commit comments