|
1 | 1 | /* eslint-disable max-lines */ |
2 | 2 | import { getCurrentHub, hasTracingEnabled } from '@sentry/core'; |
3 | | -import type { Span } from '@sentry/types'; |
| 3 | +import type { DynamicSamplingContext, Span } from '@sentry/types'; |
4 | 4 | import { |
5 | 5 | addInstrumentationHandler, |
6 | | - addTracingHeadersToFetchRequest, |
7 | 6 | BAGGAGE_HEADER_NAME, |
8 | 7 | dynamicSamplingContextToSentryBaggageHeader, |
| 8 | + isInstanceOf, |
9 | 9 | stringMatchesSomePattern, |
10 | 10 | } from '@sentry/utils'; |
11 | 11 |
|
@@ -210,6 +210,81 @@ export function fetchCallback( |
210 | 210 | } |
211 | 211 | } |
212 | 212 |
|
| 213 | +type PolymorphicRequestHeaders = |
| 214 | + | Record<string, string | undefined> |
| 215 | + | Array<[string, string]> |
| 216 | + // the below is not preicsely the Header type used in Request, but it'll pass duck-typing |
| 217 | + | { |
| 218 | + // eslint-disable-next-line @typescript-eslint/no-explicit-any |
| 219 | + [key: string]: any; |
| 220 | + append: (key: string, value: string) => void; |
| 221 | + get: (key: string) => string; |
| 222 | + }; |
| 223 | + |
| 224 | +export function addTracingHeadersToFetchRequest( |
| 225 | + request: string | Request, |
| 226 | + dynamicSamplingContext: Partial<DynamicSamplingContext>, |
| 227 | + span: Span, |
| 228 | + options: { |
| 229 | + headers?: |
| 230 | + | { |
| 231 | + [key: string]: string[] | string | undefined; |
| 232 | + } |
| 233 | + | Request['headers']; |
| 234 | + }, |
| 235 | +): PolymorphicRequestHeaders { |
| 236 | + const sentryBaggageHeader = dynamicSamplingContextToSentryBaggageHeader(dynamicSamplingContext); |
| 237 | + const sentryTraceHeader = span.toTraceparent(); |
| 238 | + |
| 239 | + const headers = |
| 240 | + typeof Request !== 'undefined' && isInstanceOf(request, Request) ? (request as Request).headers : options.headers; |
| 241 | + |
| 242 | + if (!headers) { |
| 243 | + return { 'sentry-trace': sentryTraceHeader, baggage: sentryBaggageHeader }; |
| 244 | + } else if (typeof Headers !== 'undefined' && isInstanceOf(headers, Headers)) { |
| 245 | + const newHeaders = new Headers(headers as Headers); |
| 246 | + |
| 247 | + newHeaders.append('sentry-trace', sentryTraceHeader); |
| 248 | + |
| 249 | + if (sentryBaggageHeader) { |
| 250 | + // If the same header is appended miultiple times the browser will merge the values into a single request header. |
| 251 | + // Its therefore safe to simply push a "baggage" entry, even though there might already be another baggage header. |
| 252 | + newHeaders.append(BAGGAGE_HEADER_NAME, sentryBaggageHeader); |
| 253 | + } |
| 254 | + |
| 255 | + return newHeaders as PolymorphicRequestHeaders; |
| 256 | + } else if (Array.isArray(headers)) { |
| 257 | + const newHeaders = [...headers, ['sentry-trace', sentryTraceHeader]]; |
| 258 | + |
| 259 | + if (sentryBaggageHeader) { |
| 260 | + // If there are multiple entries with the same key, the browser will merge the values into a single request header. |
| 261 | + // Its therefore safe to simply push a "baggage" entry, even though there might already be another baggage header. |
| 262 | + newHeaders.push([BAGGAGE_HEADER_NAME, sentryBaggageHeader]); |
| 263 | + } |
| 264 | + |
| 265 | + return newHeaders; |
| 266 | + } else { |
| 267 | + const existingBaggageHeader = 'baggage' in headers ? headers.baggage : undefined; |
| 268 | + const newBaggageHeaders: string[] = []; |
| 269 | + |
| 270 | + if (Array.isArray(existingBaggageHeader)) { |
| 271 | + newBaggageHeaders.push(...existingBaggageHeader); |
| 272 | + } else if (existingBaggageHeader) { |
| 273 | + newBaggageHeaders.push(existingBaggageHeader); |
| 274 | + } |
| 275 | + |
| 276 | + if (sentryBaggageHeader) { |
| 277 | + newBaggageHeaders.push(sentryBaggageHeader); |
| 278 | + } |
| 279 | + |
| 280 | + return { |
| 281 | + ...(headers as Exclude<typeof headers, Headers>), |
| 282 | + 'sentry-trace': sentryTraceHeader, |
| 283 | + baggage: newBaggageHeaders.length > 0 ? newBaggageHeaders.join(',') : undefined, |
| 284 | + }; |
| 285 | + } |
| 286 | +} |
| 287 | + |
213 | 288 | /** |
214 | 289 | * Create and track xhr request spans |
215 | 290 | */ |
|
0 commit comments