Skip to content

Commit c88fee9

Browse files
committed
Prevent duplicate Server-Timing header entries in Cloudflare
1 parent 411d6f6 commit c88fee9

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

packages/remix/src/server/serverTimingTracePropagation.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ export function injectServerTimingHeaderValue(response: Response, serverTimingVa
6363
const headers = new Headers(response.headers);
6464
const existing = headers.get('Server-Timing');
6565

66+
// Avoid duplicate entries when manually injected in entry.server.tsx
67+
if (existing?.includes('sentry-trace')) {
68+
return response;
69+
}
70+
6671
headers.set('Server-Timing', existing ? `${existing}, ${serverTimingValue}` : serverTimingValue);
6772

6873
return new Response(response.body, {

packages/remix/test/server/serverTimingTracePropagation.test.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,5 +127,23 @@ describe('serverTimingTracePropagation', () => {
127127

128128
expect(result.headers.get('Server-Timing')).toBe('cache;dur=100, sentry-trace;desc="test"');
129129
});
130+
131+
it('skips injection when sentry-trace already exists in Server-Timing header', () => {
132+
const mockResponse = new Response('test body', {
133+
status: 200,
134+
headers: new Headers({
135+
'Server-Timing': 'sentry-trace;desc="existing-trace", baggage;desc="existing-baggage"',
136+
}),
137+
});
138+
139+
const result = injectServerTimingHeaderValue(
140+
mockResponse,
141+
'sentry-trace;desc="new-trace", baggage;desc="new-baggage"',
142+
);
143+
144+
expect(result.headers.get('Server-Timing')).toBe(
145+
'sentry-trace;desc="existing-trace", baggage;desc="existing-baggage"',
146+
);
147+
});
130148
});
131149
});

0 commit comments

Comments
 (0)