from __future__ import annotations import uuid import structlog from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint from starlette.requests import Request from starlette.responses import Response class RequestIDMiddleware(BaseHTTPMiddleware): async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response: request_id = request.headers.get("X-Request-ID", str(uuid.uuid4())) structlog.contextvars.bind_contextvars(request_id=request_id) response = await call_next(request) response.headers["X-Request-ID"] = request_id return response