shin / src /free_claude_code /api /admin_cache.py
LastNoob's picture
Prevent the admin UI from being served from cache (#1160)
98786ea unverified
Raw
History Blame Contribute Delete
1.55 kB
"""Admin response cache policy."""
from fastapi import Response
from starlette.datastructures import MutableHeaders
from starlette.types import ASGIApp, Message, Receive, Scope, Send
_ADMIN_CACHE_CONTROL = "no-store"
class AdminNoStoreMiddleware:
"""Prevent browsers from retaining responses from the admin surface."""
def __init__(self, app: ASGIApp) -> None:
self._app = app
async def __call__(
self,
scope: Scope,
receive: Receive,
send: Send,
) -> None:
path = scope.get("path", "")
if scope["type"] != "http" or not _is_admin_path(path):
await self._app(scope, receive, send)
return
async def send_without_cache(message: Message) -> None:
if message["type"] == "http.response.start":
message = dict(message)
raw_headers = list(message.get("headers", ()))
_set_no_store(MutableHeaders(raw=raw_headers))
message["headers"] = raw_headers
await send(message)
await self._app(scope, receive, send_without_cache)
def attach_admin_no_store(response: Response, *, path: str) -> None:
"""Attach the policy when an outer server-error boundary bypasses middleware."""
if _is_admin_path(path):
_set_no_store(response.headers)
def _is_admin_path(path: str) -> bool:
return path == "/admin" or path.startswith("/admin/")
def _set_no_store(headers: MutableHeaders) -> None:
headers["Cache-Control"] = _ADMIN_CACHE_CONTROL