From 0818cada45e01371ff5b60e34d2648278e199fc4 Mon Sep 17 00:00:00 2001 From: Christian Fetzer Date: Thu, 25 May 2023 21:09:55 +0200 Subject: [PATCH] kasserver: Respect flood delay Every API call contains a field 'KasFloodDelay' in the result. Wait this amount of seconds before attempting the next request. Fix #9. Supersede #10. --- kasserver/__init__.py | 10 ++++------ tests/test_kasserver.py | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/kasserver/__init__.py b/kasserver/__init__.py index 86d55c5..f66dfe3 100644 --- a/kasserver/__init__.py +++ b/kasserver/__init__.py @@ -41,14 +41,13 @@ class KasServer: """Manage domains hosted on All-Inkl.com through the KAS server API""" - FLOOD_TIMEOUT = 1 - def __init__(self): wsdl_file = os.path.join( os.path.dirname(os.path.realpath(__file__)), "KasApi.wsdl" ) self._client = zeep.Client(wsdl_file) self._get_credentials() + self._flood_timeout = 0 def _get_credentials(self): self._username = os.environ.get("KASSERVER_USER", None) @@ -76,15 +75,14 @@ def _request(self, request, params): } def _send_request(request): + time.sleep(self._flood_timeout) try: result = self._client.service.KasApi(json.dumps(request)) - time.sleep(KasServer.FLOOD_TIMEOUT) + self._flood_timeout = result[1]["value"]["item"][0]["value"] return result except zeep.exceptions.Fault as exc: if exc.message == "flood_protection": - timeout = ( - math.ceil(float(exc.detail.text)) + KasServer.FLOOD_TIMEOUT - ) + timeout = math.ceil(float(exc.detail.text)) LOGGER.warning("Hit flood protection, retrying in %ds", timeout) time.sleep(timeout) return _send_request(request) diff --git a/tests/test_kasserver.py b/tests/test_kasserver.py index b7be822..e82e925 100644 --- a/tests/test_kasserver.py +++ b/tests/test_kasserver.py @@ -90,7 +90,7 @@ class TestKasServer: "key": "Response", "value": { "item": [ - {}, + {"key": "KasFloodDelay", "value": 0}, {}, { "key": "ReturnInfo",