"""HTTP cross-cutting concerns.""" from collections.abc import Awaitable, Callable from starlette.requests import Request from starlette.responses import Response TRACE_ID_HEADER = "X-Trace-ID" RequestHandler = Callable[[Request], Awaitable[Response]] async def attach_trace_id(request: Request, call_next: RequestHandler) -> Response: """Return the request trace identifier on both success and error responses.""" response = await call_next(request) context = getattr(request.state, "request_context", None) trace_id = getattr(context, "trace_id", None) or getattr(request.state, "trace_id", None) trace_id = trace_id or request.headers.get(TRACE_ID_HEADER) if trace_id: response.headers[TRACE_ID_HEADER] = str(trace_id) return response