File size: 895 Bytes
bdde028
af43a76
 
 
09fcee9
bdde028
af43a76
 
 
bdde028
 
 
 
af43a76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import os
import httpx
import logging
import asyncio
API_SECRET = os.getenv("API_SECRET")


logger = logging.getLogger(__name__)

def validate_secret(secret: str) -> bool:
    # Constant-time comparison to prevent timing attacks
    from hmac import compare_digest
    return compare_digest(secret, API_SECRET)


async def retry_request(func, *args, retries=3, delay=3, **kwargs):
    last_exc = None
    for attempt in range(retries):
        try:
            return await func(*args, **kwargs)
        except (httpx.HTTPStatusError, httpx.RequestError) as e:
            last_exc = e
            logger.warning(f"Request failed on attempt {attempt + 1}/{retries}: {e}")
            if attempt < retries - 1:
                await asyncio.sleep(delay)
            else:
                logger.error("Max retries reached.")
                raise last_exc
    if last_exc:
        raise last_exc