|
1 | 1 | import type { Client, HandlerDataFetch, Scope, Span, SpanOrigin } from '@sentry/types';
|
2 | 2 | import {
|
3 | 3 | BAGGAGE_HEADER_NAME,
|
| 4 | + SENTRY_BAGGAGE_KEY_PREFIX, |
| 5 | + SENTRY_BAGGAGE_KEY_PREFIX_REGEX, |
4 | 6 | dynamicSamplingContextToSentryBaggageHeader,
|
5 | 7 | generateSentryTraceHeader,
|
6 | 8 | isInstanceOf,
|
| 9 | + parseBaggageHeader, |
7 | 10 | parseUrl,
|
8 | 11 | } from '@sentry/utils';
|
9 | 12 | import { getClient, getCurrentScope, getIsolationScope } from './currentScopes';
|
@@ -156,9 +159,23 @@ export function addTracingHeadersToFetchRequest(
|
156 | 159 | newHeaders.set('sentry-trace', sentryTraceHeader);
|
157 | 160 |
|
158 | 161 | if (sentryBaggageHeader) {
|
159 |
| - // If the same header is appended multiple times the browser will merge the values into a single request header. |
160 |
| - // Its therefore safe to simply push a "baggage" entry, even though there might already be another baggage header. |
161 |
| - newHeaders.append(BAGGAGE_HEADER_NAME, sentryBaggageHeader); |
| 162 | + const prevBaggageHeader = newHeaders.get(BAGGAGE_HEADER_NAME); |
| 163 | + if (prevBaggageHeader) { |
| 164 | + const prevHeaderStrippedFromSentryBaggage = sentryBaggageHeader |
| 165 | + .split(',') |
| 166 | + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion |
| 167 | + .filter(baggageEntry => !baggageEntry.split('=')[0]!.startsWith(SENTRY_BAGGAGE_KEY_PREFIX)) |
| 168 | + .join(','); |
| 169 | + |
| 170 | + const mergedHeaders = [sentryBaggageHeader]; |
| 171 | + if (prevHeaderStrippedFromSentryBaggage) { |
| 172 | + mergedHeaders.unshift(prevHeaderStrippedFromSentryBaggage); |
| 173 | + } |
| 174 | + |
| 175 | + newHeaders.set(BAGGAGE_HEADER_NAME, mergedHeaders.join(',')); |
| 176 | + } else { |
| 177 | + newHeaders.set(BAGGAGE_HEADER_NAME, sentryBaggageHeader); |
| 178 | + } |
162 | 179 | }
|
163 | 180 |
|
164 | 181 | return newHeaders as PolymorphicRequestHeaders;
|
|
0 commit comments