Spaces:
Running
Running
File size: 949 Bytes
07a91a1 | 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 32 33 34 | """Simple API key and in-memory rate limiting."""
from __future__ import annotations
import time
from collections import defaultdict, deque
from fastapi import Header, HTTPException
from src.config import settings
_request_windows: dict[str, deque[float]] = defaultdict(deque)
def verify_api_key(x_api_key: str = Header(default="")):
"""Enforce API key when configured."""
if settings.api_key and x_api_key != settings.api_key:
raise HTTPException(status_code=401, detail="Invalid API key")
def check_rate_limit(client_id: str) -> None:
"""Allow at most N requests per minute for each client id."""
now = time.time()
window_start = now - 60
q = _request_windows[client_id]
while q and q[0] < window_start:
q.popleft()
if len(q) >= settings.rate_limit_per_minute:
raise HTTPException(status_code=429, detail="Rate limit exceeded")
q.append(now)
|