// Generic proxy header hygiene for the platform-side /api/vault forwarder. The platform knows nothing // about Vaultwarden — it only forwards faithfully to the officer-vault sidecar (loopback). Bodies are // never touched; we only drop hop-by-hop headers and redact token-shaped query strings from logs. const HOP_BY_HOP = new Set([ 'connection', 'keep-alive', 'proxy-authenticate', 'proxy-authorization', 'te', 'trailer', 'transfer-encoding', 'upgrade', 'host', ]); /** Copy headers, dropping only hop-by-hop / proxy-* ones. Authorization + device headers pass through. */ export function stripHopByHop(src: Headers): Headers { const out = new Headers(); src.forEach((value, key) => { const k = key.toLowerCase(); if (HOP_BY_HOP.has(k) || k.startsWith('proxy-')) return; out.set(key, value); }); return out; } const REDACT = /([?&](access_token|refresh_token|code|token)=)[^&]*/gi; export const redactPath = (pathAndQuery: string): string => pathAndQuery.replace(REDACT, '$1');