Spaces:
Sleeping
Sleeping
| 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 | |