|
2 | 2 | from __future__ import print_function
|
3 | 3 | from __future__ import unicode_literals
|
4 | 4 |
|
5 |
| -import requests |
6 |
| -import time |
7 | 5 | import logging
|
8 |
| -import six |
9 |
| -import copy |
10 |
| -import mangopay |
11 |
| -from mangopay.ratelimit import RateLimit |
| 6 | +import time |
12 | 7 |
|
| 8 | +import requests |
| 9 | +import six |
| 10 | +from requests.exceptions import ConnectionError, Timeout |
13 | 11 |
|
| 12 | +import mangopay |
14 | 13 | from mangopay.auth import AuthorizationTokenManager
|
| 14 | +from mangopay.ratelimit import RateLimit |
15 | 15 | from .exceptions import APIError, DecodeError
|
16 | 16 | from .signals import request_finished, request_started, request_error
|
17 |
| -from .utils import reraise_as, truncatechars |
18 |
| - |
19 |
| -from requests.exceptions import ConnectionError, ConnectTimeout, Timeout |
| 17 | +from .utils import reraise_as |
20 | 18 |
|
21 | 19 | try:
|
22 | 20 | import urllib.parse as urlrequest
|
|
34 | 32 | requests_session = requests.Session()
|
35 | 33 | rate_limits = None
|
36 | 34 |
|
37 |
| -class APIRequest(object): |
38 | 35 |
|
| 36 | +class APIRequest(object): |
39 | 37 |
|
40 | 38 | def __init__(self, client_id=None, apikey=None, api_url=None, api_sandbox_url=None, sandbox=None,
|
41 | 39 | timeout=30.0, storage_strategy=None, proxies=None, uk_header_flag=False):
|
@@ -181,44 +179,45 @@ def custom_request(self, method, url, data=None, idempotency_key=None, oauth_req
|
181 | 179 | else:
|
182 | 180 | self._create_decodeerror(result, url=url)
|
183 | 181 |
|
184 |
| - def init_rate_limits(self): |
185 |
| - rate_limits = [RateLimit(15), RateLimit(30), RateLimit(60), RateLimit(24 * 60)] |
186 |
| - return rate_limits |
187 |
| - |
188 | 182 | def read_response_headers(self, headers):
|
189 |
| - update_rate_limits = None |
190 |
| - |
191 |
| - for k, v in headers.items(): |
192 |
| - lower_case_header = k.lower() |
193 |
| - if lower_case_header == "x-ratelimit-remaining": |
194 |
| - if update_rate_limits is None: |
195 |
| - update_rate_limits = self.init_rate_limits() |
196 |
| - calls_remaining = list(eval(v)) |
197 |
| - update_rate_limits[0].calls_remaining = int(calls_remaining[3]) |
198 |
| - update_rate_limits[1].calls_remaining = int(calls_remaining[2]) |
199 |
| - update_rate_limits[2].calls_remaining = int(calls_remaining[1]) |
200 |
| - update_rate_limits[3].calls_remaining = int(calls_remaining[0]) |
201 |
| - |
202 |
| - if lower_case_header == "x-ratelimit": |
203 |
| - if update_rate_limits is None: |
204 |
| - update_rate_limits = self.init_rate_limits() |
205 |
| - calls_made = list(eval(v)) |
206 |
| - update_rate_limits[0].calls_made = int(calls_made[3]) |
207 |
| - update_rate_limits[1].calls_made = int(calls_made[2]) |
208 |
| - update_rate_limits[2].calls_made = int(calls_made[1]) |
209 |
| - update_rate_limits[3].calls_made = int(calls_made[0]) |
210 |
| - |
211 |
| - if lower_case_header == "x-ratelimit-reset": |
212 |
| - if update_rate_limits is None: |
213 |
| - update_rate_limits = self.init_rate_limits() |
214 |
| - reset_times = list(eval(v)) |
215 |
| - update_rate_limits[0].reset_time_millis = int(reset_times[3]) |
216 |
| - update_rate_limits[1].reset_time_millis = int(reset_times[2]) |
217 |
| - update_rate_limits[2].reset_time_millis = int(reset_times[1]) |
218 |
| - update_rate_limits[3].reset_time_millis = int(reset_times[0]) |
219 |
| - |
220 |
| - if update_rate_limits is not None: |
221 |
| - self.set_rate_limit(update_rate_limits) |
| 183 | + rate_limit_reset = headers.get('x-ratelimit-reset') |
| 184 | + rate_limit_remaining = headers.get('x-ratelimit-remaining') |
| 185 | + rate_limit_made = headers.get('x-ratelimit') |
| 186 | + |
| 187 | + if rate_limit_reset is not None and rate_limit_remaining is not None and rate_limit_made is not None: |
| 188 | + rate_limit_reset = rate_limit_reset.split(',') |
| 189 | + rate_limit_remaining = rate_limit_remaining.split(',') |
| 190 | + rate_limit_made = rate_limit_made.split(',') |
| 191 | + |
| 192 | + if len(rate_limit_reset) == len(rate_limit_remaining) and len(rate_limit_reset) == len(rate_limit_made): |
| 193 | + current_time = int(time.time()) |
| 194 | + updated_rate_limits = [] |
| 195 | + |
| 196 | + for i, rlr in enumerate(rate_limit_reset): |
| 197 | + rate_limit = RateLimit() |
| 198 | + number_of_minutes = (int(rate_limit_reset[i].strip()) - current_time) / 60 |
| 199 | + |
| 200 | + if number_of_minutes <= 15: |
| 201 | + rate_limit.interval_minutes = 15 |
| 202 | + elif number_of_minutes <= 30: |
| 203 | + rate_limit.interval_minutes = 30 |
| 204 | + elif number_of_minutes <= 60: |
| 205 | + rate_limit.interval_minutes = 60 |
| 206 | + elif number_of_minutes <= 60 * 24: |
| 207 | + rate_limit.interval_minutes = 60 * 24 |
| 208 | + |
| 209 | + rate_limit.reset_time_millis = int(rate_limit_reset[i].strip()) |
| 210 | + rate_limit.calls_remaining = int(rate_limit_remaining[i].strip()) |
| 211 | + rate_limit.calls_made = int(rate_limit_made[i].strip()) |
| 212 | + updated_rate_limits.append(rate_limit) |
| 213 | + |
| 214 | + if len(updated_rate_limits) > 0: |
| 215 | + self.set_rate_limit(updated_rate_limits) |
| 216 | + |
| 217 | + else: |
| 218 | + logger.debug("Could not set rate limits: headers length should be the same") |
| 219 | + else: |
| 220 | + logger.debug("Could not set rate limits: missing headers") |
222 | 221 |
|
223 | 222 | def _absolute_url(self, url, encoded_params):
|
224 | 223 | pattern = '%s%s%s'
|
|
0 commit comments