Skip to content

Commit 98086ed

Browse files
Merge pull request #13 from gofynd/FPCO-30582-retry-middleware--main
ID:FPCO-30582;DONE:100;HOURS:4; Add retry method for server unavailib…
2 parents 49edb6e + 9dee4ad commit 98086ed

File tree

3 files changed

+32
-2
lines changed

3 files changed

+32
-2
lines changed

fdk_extension/extension.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from fdk_client.application.ApplicationClient import ApplicationClient
99
from fdk_client.common.utils import get_headers_with_signature
1010
from fdk_client.common.aiohttp_helper import AiohttpHelper
11+
from .utilities.aiohttp_retry import retry_middleware
1112

1213
from . import __version__
1314
from .constants import ONLINE_ACCESS_MODE, OFFLINE_ACCESS_MODE, FYND_CLUSTER
@@ -208,7 +209,7 @@ async def get_extension_details(self) -> dict:
208209
headers=headers,
209210
exclude_headers=list(headers.keys())
210211
)
211-
response = await AiohttpHelper().aiohttp_request(request_type="GET", url=url, headers=headers)
212+
response = await retry_middleware(AiohttpHelper().aiohttp_request, request_type="GET", url=url, headers=headers)
212213
if response["status_code"] == 200:
213214
return response["json"]
214215
else:
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import asyncio
2+
3+
async def retry_middleware(handler, *args, **kwargs):
4+
initial_delay = 30
5+
delay = initial_delay
6+
max_retries = float('inf') # Retry forever
7+
allowed_codes = (502, 503, 504)
8+
9+
attempt = 0
10+
while True:
11+
attempt += 1
12+
try:
13+
# Call the handler to execute the actual request
14+
response = await handler(*args, **kwargs)
15+
status_code = response.get('status_code')
16+
if status_code in allowed_codes:
17+
if attempt <= 3:
18+
delay = initial_delay
19+
else:
20+
delay = (attempt - 3) * 60 # Increase delay after initial retries
21+
print(f"RetryInterceptor: Retrying request after {delay} seconds. Attempt: {attempt} Code: {status_code}")
22+
await asyncio.sleep(delay)
23+
else:
24+
return response
25+
except Exception as e:
26+
raise Exception(e)
27+
28+
raise Exception(f"Failed to request after {max_retries} retries")

fdk_extension/webhook.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from .exceptions import FdkWebhookProcessError
1414
from .exceptions import FdkWebhookRegistrationError
1515
from .utilities.logger import get_logger
16+
from .utilities.aiohttp_retry import retry_middleware
1617

1718
from fdk_client.common.aiohttp_helper import AiohttpHelper
1819
from fdk_client.common.utils import get_headers_with_signature
@@ -344,7 +345,7 @@ async def get_event_config(self, handler_config: dict) -> dict:
344345
body=data,
345346
exclude_headers=list(headers.keys())
346347
)
347-
response = await AiohttpHelper().aiohttp_request(request_type="POST", url=url, data=data, headers=headers)
348+
response = await retry_middleware(AiohttpHelper().aiohttp_request, request_type="POST", url=url, data=data, headers=headers)
348349
response_data: dict = response["json"]
349350
event_config["event_configs"] = response_data.get("event_configs")
350351
logger.debug(f"Webhook events config received: {ujson.dumps(response_data)}")

0 commit comments

Comments
 (0)