Source code for fluxlit.security.headers

"""Optional security headers middleware for FastAPI apps."""

from __future__ import annotations

from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint
from starlette.requests import Request
from starlette.responses import Response


[docs] class SecurityHeadersMiddleware(BaseHTTPMiddleware): """Add baseline security headers (opt-in via :class:`~fluxlit.config.FluxlitSettings`)."""
[docs] async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response: response = await call_next(request) response.headers.setdefault("X-Content-Type-Options", "nosniff") response.headers.setdefault("X-Frame-Options", "SAMEORIGIN") response.headers.setdefault("Referrer-Policy", "strict-origin-when-cross-origin") xf = request.headers.get("x-forwarded-proto", request.url.scheme) proto = xf.split(",")[0].strip().lower() if proto == "https": response.headers.setdefault( "Strict-Transport-Security", "max-age=63072000; includeSubDomains", ) return response
__all__ = ["SecurityHeadersMiddleware"]