from django.conf import settings from django.http import HttpRequest, HttpResponse from owslib import constants, context from owslib.ext.django.typing import GetResponseCallable CORRELATION_ID_HEADER_NAME: str = getattr( settings, "CORRELATION_ID_HEADER_NAME", constants.HEADER_CORRELATION_ID ) REQUEST_CONTEXT_LABEL_PROFILE: bool = getattr( settings, "REQUEST_CONTEXT_LABEL_PROFILE", False ) class CorrelationIdMiddleware: def __init__(self, get_response: GetResponseCallable) -> None: self.get_response = get_response def __call__(self, request: HttpRequest) -> HttpResponse: correlation_id = ( request.headers.get(CORRELATION_ID_HEADER_NAME) or context.correlation_id.get() or context.generate_correlation_id() ) token = context.correlation_id.set(correlation_id) try: return self.get_response(request) finally: context.correlation_id.reset(token) class CorrelationIdHeaderMiddleware: def __init__(self, get_response: GetResponseCallable) -> None: self.get_response = get_response def __call__(self, request: HttpRequest) -> HttpResponse: response = self.get_response(request) if correlation_id := context.correlation_id.get(): response.headers[CORRELATION_ID_HEADER_NAME] = correlation_id return response class RequestContextMiddleware: def __init__(self, get_response: GetResponseCallable) -> None: self.get_response = get_response def __call__(self, request: HttpRequest) -> HttpResponse: request_context = context.request_context_from_headers( request.headers, label_profile=REQUEST_CONTEXT_LABEL_PROFILE, ) token = context.request_context.set(request_context) try: return self.get_response(request) finally: context.request_context.reset(token)