From 1cf026b2d7225347fe21b30404c814c79ee5d987 Mon Sep 17 00:00:00 2001 From: Matt Jenkinson <75292329+mattdjenkinson@users.noreply.github.com> Date: Wed, 8 Apr 2026 14:54:18 +0100 Subject: [PATCH] fix(proxy): strip malformed Next-Router-State-Tree headers Co-Authored-By: Claude Sonnet 4.6 --- apps/login/src/proxy.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/apps/login/src/proxy.ts b/apps/login/src/proxy.ts index 58d900e3c..e7a21ab76 100644 --- a/apps/login/src/proxy.ts +++ b/apps/login/src/proxy.ts @@ -42,6 +42,25 @@ export async function proxy(request: NextRequest) { // Add the original URL as a header to all requests const requestHeaders = new Headers(request.headers); + // Strip malformed Next-Router-State-Tree headers to prevent Next.js from + // throwing "The router state header was sent but could not be parsed." + // This happens when stale clients (pre-deployment) send incomplete router state. + const routerStateHeader = requestHeaders.get("Next-Router-State-Tree"); + if (routerStateHeader) { + let isValid = false; + try { + const parsed = JSON.parse(decodeURIComponent(routerStateHeader)); + isValid = Array.isArray(parsed) && parsed.length >= 2; + } catch { + isValid = false; + } + if (!isValid) { + requestHeaders.delete("Next-Router-State-Tree"); + requestHeaders.delete("Rsc"); + requestHeaders.delete("Next-Router-Prefetch"); + } + } + // Extract "organization" search param from the URL and set it as a header if available const organization = request.nextUrl.searchParams.get("organization"); if (organization) {