diff --git a/src/server/services/proxyDebugTraceStore.test.ts b/src/server/services/proxyDebugTraceStore.test.ts index 8edadc6..5fe576f 100644 --- a/src/server/services/proxyDebugTraceStore.test.ts +++ b/src/server/services/proxyDebugTraceStore.test.ts @@ -2,6 +2,7 @@ import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'vitest'; import { mkdtempSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; +import { Response } from 'undici'; type DbModule = typeof import('../db/index.js'); type StoreModule = typeof import('./proxyDebugTraceStore.js'); @@ -183,4 +184,18 @@ describe('proxyDebugTraceStore', () => { expect(typeof bodyPayload.preview).toBe('string'); expect(bodyPayload.preview).toContain('"model": "gpt-5.4"'); }); + + it('normalizes undici response headers for proxy debug capture', () => { + const response = new Response('ok', { + headers: { + 'content-type': 'application/json', + 'x-trace-id': 'trace-123', + }, + }); + + expect(store.normalizeProxyDebugResponseHeaders(response.headers)).toEqual({ + 'content-type': 'application/json', + 'x-trace-id': 'trace-123', + }); + }); }); diff --git a/src/server/services/proxyDebugTraceStore.ts b/src/server/services/proxyDebugTraceStore.ts index c3fca8a..eafd4bd 100644 --- a/src/server/services/proxyDebugTraceStore.ts +++ b/src/server/services/proxyDebugTraceStore.ts @@ -70,8 +70,12 @@ function stringifyDebugValue(value: unknown, maxBytes: number): string | null { function normalizeHeadersValue(value: HeadersLike): Record | null { if (!value) return null; - if (typeof Headers !== 'undefined' && value instanceof Headers) { - return Object.fromEntries([...value.entries()].sort((left, right) => left[0].localeCompare(right[0]))); + const headerEntries = value as { entries?: unknown; get?: unknown }; + if (typeof headerEntries.get === 'function' && typeof headerEntries.entries === 'function') { + return Object.fromEntries( + [...headerEntries.entries.call(value) as Iterable<[string, string]>] + .sort((left, right) => left[0].localeCompare(right[0])), + ); } if (typeof value !== 'object' || Array.isArray(value)) {