Skip to content

Commit 4882f7f

Browse files
iulian03Iulian Masar
and
Iulian Masar
authored
updated the way rate limits are set (#387)
Co-authored-by: Iulian Masar <iulian.masar@codegile.com>
1 parent 49b5008 commit 4882f7f

File tree

3 files changed

+48
-54
lines changed

3 files changed

+48
-54
lines changed

mangopay/api.py

Lines changed: 46 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,19 @@
22
from __future__ import print_function
33
from __future__ import unicode_literals
44

5-
import requests
6-
import time
75
import logging
8-
import six
9-
import copy
10-
import mangopay
11-
from mangopay.ratelimit import RateLimit
6+
import time
127

8+
import requests
9+
import six
10+
from requests.exceptions import ConnectionError, Timeout
1311

12+
import mangopay
1413
from mangopay.auth import AuthorizationTokenManager
14+
from mangopay.ratelimit import RateLimit
1515
from .exceptions import APIError, DecodeError
1616
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
2018

2119
try:
2220
import urllib.parse as urlrequest
@@ -34,8 +32,8 @@
3432
requests_session = requests.Session()
3533
rate_limits = None
3634

37-
class APIRequest(object):
3835

36+
class APIRequest(object):
3937

4038
def __init__(self, client_id=None, apikey=None, api_url=None, api_sandbox_url=None, sandbox=None,
4139
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
181179
else:
182180
self._create_decodeerror(result, url=url)
183181

184-
def init_rate_limits(self):
185-
rate_limits = [RateLimit(15), RateLimit(30), RateLimit(60), RateLimit(24 * 60)]
186-
return rate_limits
187-
188182
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")
222221

223222
def _absolute_url(self, url, encoded_params):
224223
pattern = '%s%s%s'

mangopay/ratelimit.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
class RateLimit:
2-
32
interval_minutes = 0
43
calls_made = 0
54
calls_remaining = 0
65
reset_time_millis = 0
7-
8-
def __init__(self, interval_minutes):
9-
self.interval_minutes = interval_minutes
10-

tests/test_rate_limit.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from tests.test_base import BaseTest, BaseTestLive
21
from mangopay.api import APIRequest as api
2+
from tests.test_base import BaseTest, BaseTestLive
33

44

55
class RateLimit(BaseTest):
@@ -11,4 +11,4 @@ def test_rate_limits_update(self):
1111

1212
rate_limits = apis.get_rate_limits()
1313
self.assertIsNotNone(rate_limits)
14-
self.assertTrue(len(rate_limits) == 4)
14+
self.assertTrue(len(rate_limits) > 0)

0 commit comments

Comments
 (0)