From de0a44e9f9a321d97af895be520e4b14ff217d64 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Mon, 15 Jan 2024 10:24:10 +0100 Subject: [PATCH] fix(tracing-internal): Prefer fetch options headers over fetch init headers --- .../request/fetch-with-request/init.js | 10 +++++++ .../request/fetch-with-request/subject.js | 7 +++++ .../request/fetch-with-request/test.ts | 30 +++++++++++++++++++ packages/tracing-internal/src/common/fetch.ts | 3 +- 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/init.js create mode 100644 dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/subject.js create mode 100644 dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/test.ts diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/init.js b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/init.js new file mode 100644 index 000000000000..505fab06b330 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/init.js @@ -0,0 +1,10 @@ +import * as Sentry from '@sentry/browser'; +import { Integrations } from '@sentry/tracing'; + +window.Sentry = Sentry; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + integrations: [new Integrations.BrowserTracing({ tracingOrigins: ['http://example.com'] })], + tracesSampleRate: 1, +}); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/subject.js b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/subject.js new file mode 100644 index 000000000000..70a1992e9f8b --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/subject.js @@ -0,0 +1,7 @@ +const request = new Request('http://example.com/api/test/', { + headers: { foo: '11' }, +}); + +fetch(request, { + headers: { bar: '22' }, +}); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/test.ts new file mode 100644 index 000000000000..eb2f354dba4a --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/test.ts @@ -0,0 +1,30 @@ +import { expect } from '@playwright/test'; + +import { sentryTest } from '../../../../utils/fixtures'; +import { shouldSkipTracingTest } from '../../../../utils/helpers'; + +sentryTest( + 'instrumentation should pass on headers from fetch options instead of init request, if set', + async ({ getLocalTestPath, page }) => { + if (shouldSkipTracingTest()) { + sentryTest.skip(); + } + + await page.route('**/api/test/', async route => { + const req = route.request(); + const headers = await req.allHeaders(); + + // headers.bar was set in fetch options (and should be sent) + expect(headers.bar).toBe('22'); + // headers.foo was set in init request object (and should be ignored) + expect(headers.foo).toBeUndefined(); + + return route.fulfill({ + status: 200, + body: 'ok', + }); + }); + + await getLocalTestPath({ testDir: __dirname }); + }, +); diff --git a/packages/tracing-internal/src/common/fetch.ts b/packages/tracing-internal/src/common/fetch.ts index a6f7d68ac920..e0a8e2ed9fa3 100644 --- a/packages/tracing-internal/src/common/fetch.ts +++ b/packages/tracing-internal/src/common/fetch.ts @@ -149,7 +149,8 @@ export function addTracingHeadersToFetchRequest( const sentryBaggageHeader = dynamicSamplingContextToSentryBaggageHeader(dynamicSamplingContext); const headers = - typeof Request !== 'undefined' && isInstanceOf(request, Request) ? (request as Request).headers : options.headers; + options.headers || + (typeof Request !== 'undefined' && isInstanceOf(request, Request) ? (request as Request).headers : undefined); if (!headers) { return { 'sentry-trace': sentryTraceHeader, baggage: sentryBaggageHeader };