diff --git a/packages/void/src/router/compile.ts b/packages/void/src/router/compile.ts index 966e01dca..cc935bafd 100644 --- a/packages/void/src/router/compile.ts +++ b/packages/void/src/router/compile.ts @@ -903,7 +903,8 @@ export function compileRouteTable( lines.push('function __voidAnnotateRouting(response, trace) {'); lines.push(' if (!__VOID_DEV_ROUTING || !response) return response;'); lines.push(' const headers = new Headers(response.headers);'); - lines.push(' headers.set("X-Void-Routing", trace);'); + // Guard the set: a non-ASCII trace value throws, and must not crash the dev response. + lines.push(' try { headers.set("X-Void-Routing", trace); } catch { return response; }'); lines.push( ' return new Response(response.body, { status: response.status, statusText: response.statusText, headers });', ); diff --git a/packages/void/test/unit/compile.test.ts b/packages/void/test/unit/compile.test.ts index 97d028f78..e174bcb0f 100644 --- a/packages/void/test/unit/compile.test.ts +++ b/packages/void/test/unit/compile.test.ts @@ -1800,6 +1800,14 @@ describe('X-Void-Routing dev trace header', () => { expect(code).toContain('try { c.res.headers.set("X-Void-Routing", "pass-through"); } catch {}'); }); + it('guards the __voidAnnotateRouting trace header set with try/catch', () => { + const code = compileWith({ dev: true }); + // A non-ASCII trace value throws on header set; the guard must swallow it. + expect(code).toContain( + 'try { headers.set("X-Void-Routing", trace); } catch { return response; }', + ); + }); + it('emits __VOID_DEV_ROUTING=false and strips origin fields in prod', () => { const code = compileWith({ dev: false }); expect(code).toContain('const __VOID_DEV_ROUTING = false;');