"""Rate limiting configuration for HTTP endpoints."""
from slowapi import Limiter
from slowapi.util import get_remote_address
from slowapi.errors import RateLimitExceeded
from starlette.requests import Request
from starlette.responses import JSONResponse
import structlog
logger = structlog.get_logger(__name__)
# Create rate limiter instance
limiter = Limiter(
key_func=get_remote_address,
default_limits=["100/minute", "1000/hour"],
storage_uri="memory://",
)
def rate_limit_exceeded_handler(request: Request, exc: RateLimitExceeded) -> JSONResponse:
"""Custom handler for rate limit exceeded errors."""
logger.warning(
"Rate limit exceeded",
remote_addr=get_remote_address(request),
path=request.url.path,
)
return JSONResponse(
status_code=429,
content={
"error": "Rate limit exceeded",
"message": "Too many requests. Please try again later.",
"retry_after": exc.detail,
},
headers={"Retry-After": str(exc.detail)},
)