@@ -159,12 +159,7 @@ export function addTracingHeadersToFetchRequest(
159
159
if ( sentryBaggageHeader ) {
160
160
const prevBaggageHeader = newHeaders . get ( BAGGAGE_HEADER_NAME ) ;
161
161
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 ) ;
168
163
newHeaders . set (
169
164
BAGGAGE_HEADER_NAME ,
170
165
// 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(
180
175
181
176
return newHeaders as PolymorphicRequestHeaders ;
182
177
} 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 ] ) ;
184
197
185
198
if ( sentryBaggageHeader ) {
186
199
// 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(
191
204
return newHeaders as PolymorphicRequestHeaders ;
192
205
} else {
193
206
const existingBaggageHeader = 'baggage' in headers ? headers . baggage : undefined ;
194
- const newBaggageHeaders : string [ ] = [ ] ;
207
+ let newBaggageHeaders : string [ ] = [ ] ;
195
208
196
209
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 === '' ) ;
198
215
} else if ( existingBaggageHeader ) {
199
- newBaggageHeaders . push ( existingBaggageHeader ) ;
216
+ newBaggageHeaders . push ( stripBaggageHeaderOfSentryBaggageValues ( existingBaggageHeader ) ) ;
200
217
}
201
218
202
219
if ( sentryBaggageHeader ) {
@@ -238,3 +255,13 @@ function endSpan(span: Span, handlerData: HandlerDataFetch): void {
238
255
}
239
256
span . end ( ) ;
240
257
}
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