Skip to content

Commit c9e8f38

Browse files
author
Luca Forstner
committed
Override values for all the different variants of passing headers
1 parent 1ad1b53 commit c9e8f38

File tree

1 file changed

+37
-10
lines changed

1 file changed

+37
-10
lines changed

packages/core/src/fetch.ts

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -159,12 +159,7 @@ export function addTracingHeadersToFetchRequest(
159159
if (sentryBaggageHeader) {
160160
const prevBaggageHeader = newHeaders.get(BAGGAGE_HEADER_NAME);
161161
if (prevBaggageHeader) {
162-
const prevHeaderStrippedFromSentryBaggage = sentryBaggageHeader
163-
.split(',')
164-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
165-
.filter(baggageEntry => !baggageEntry.split('=')[0]!.startsWith(SENTRY_BAGGAGE_KEY_PREFIX))
166-
.join(',');
167-
162+
const prevHeaderStrippedFromSentryBaggage = stripBaggageHeaderOfSentryBaggageValues(prevBaggageHeader);
168163
newHeaders.set(
169164
BAGGAGE_HEADER_NAME,
170165
// If there are non-sentry entries (i.e. if the stripped string is non-empty/truthy) combine the stripped header and sentry baggage header
@@ -180,7 +175,25 @@ export function addTracingHeadersToFetchRequest(
180175

181176
return newHeaders as PolymorphicRequestHeaders;
182177
} else if (Array.isArray(headers)) {
183-
const newHeaders = [...headers, ['sentry-trace', sentryTraceHeader]];
178+
const newHeaders = headers
179+
.filter(header => {
180+
// Remove any existing sentry-trace headers
181+
return !(Array.isArray(header) && header[0] === 'sentry-trace');
182+
})
183+
.map(header => {
184+
if (Array.isArray(header) && header[0] === BAGGAGE_HEADER_NAME) {
185+
return [
186+
BAGGAGE_HEADER_NAME,
187+
...header.map(headerValue =>
188+
typeof headerValue === 'string' ? stripBaggageHeaderOfSentryBaggageValues(headerValue) : headerValue,
189+
),
190+
];
191+
} else {
192+
return header;
193+
}
194+
})
195+
// Attach the new sentry-trace header
196+
.concat(['sentry-trace', sentryTraceHeader]);
184197

185198
if (sentryBaggageHeader) {
186199
// If there are multiple entries with the same key, the browser will merge the values into a single request header.
@@ -191,12 +204,16 @@ export function addTracingHeadersToFetchRequest(
191204
return newHeaders as PolymorphicRequestHeaders;
192205
} else {
193206
const existingBaggageHeader = 'baggage' in headers ? headers.baggage : undefined;
194-
const newBaggageHeaders: string[] = [];
207+
let newBaggageHeaders: string[] = [];
195208

196209
if (Array.isArray(existingBaggageHeader)) {
197-
newBaggageHeaders.push(...existingBaggageHeader);
210+
newBaggageHeaders = existingBaggageHeader
211+
.map(headerItem =>
212+
typeof headerItem === 'string' ? stripBaggageHeaderOfSentryBaggageValues(headerItem) : headerItem,
213+
)
214+
.filter(headerItem => headerItem === '');
198215
} else if (existingBaggageHeader) {
199-
newBaggageHeaders.push(existingBaggageHeader);
216+
newBaggageHeaders.push(stripBaggageHeaderOfSentryBaggageValues(existingBaggageHeader));
200217
}
201218

202219
if (sentryBaggageHeader) {
@@ -238,3 +255,13 @@ function endSpan(span: Span, handlerData: HandlerDataFetch): void {
238255
}
239256
span.end();
240257
}
258+
259+
function stripBaggageHeaderOfSentryBaggageValues(baggageHeader: string): string {
260+
return (
261+
baggageHeader
262+
.split(',')
263+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
264+
.filter(baggageEntry => !baggageEntry.split('=')[0]!.startsWith(SENTRY_BAGGAGE_KEY_PREFIX))
265+
.join(',')
266+
);
267+
}

0 commit comments

Comments
 (0)