diff --git a/packages/apm/test/span.test.ts b/packages/apm/test/span.test.ts index d7be6241aae2..eea2cb47b7cb 100644 --- a/packages/apm/test/span.test.ts +++ b/packages/apm/test/span.test.ts @@ -198,7 +198,9 @@ describe('Span', () => { spanOne.initFinishedSpans(); const childSpanOne = spanOne.child(); childSpanOne.finish(); - hub.configureScope((scope) => { scope.setSpan(spanOne) }) + hub.configureScope(scope => { + scope.setSpan(spanOne); + }); const spanTwo = new Span({ transaction: 'testTwo', sampled: false }, hub); spanTwo.initFinishedSpans(); diff --git a/packages/browser/src/transports/fetch.ts b/packages/browser/src/transports/fetch.ts index 501fc8e33deb..3d3a5831ea88 100644 --- a/packages/browser/src/transports/fetch.ts +++ b/packages/browser/src/transports/fetch.ts @@ -32,6 +32,10 @@ export class FetchTransport extends BaseTransport { referrerPolicy: (supportsReferrerPolicy() ? 'origin' : '') as ReferrerPolicy, }; + if (this.options.headers !== undefined) { + defaultOptions.headers = this.options.headers; + } + return this._buffer.add( new SyncPromise((resolve, reject) => { global diff --git a/packages/browser/src/transports/xhr.ts b/packages/browser/src/transports/xhr.ts index c2cd1d140af4..5ed705cff79c 100644 --- a/packages/browser/src/transports/xhr.ts +++ b/packages/browser/src/transports/xhr.ts @@ -46,6 +46,11 @@ export class XHRTransport extends BaseTransport { }; request.open('POST', this.url); + for (const header in this.options.headers) { + if (this.options.headers.hasOwnProperty(header)) { + request.setRequestHeader(header, this.options.headers[header]); + } + } request.send(JSON.stringify(event)); }), ); diff --git a/packages/browser/test/unit/transports/fetch.test.ts b/packages/browser/test/unit/transports/fetch.test.ts index 5a237f455945..05af0492dde7 100644 --- a/packages/browser/test/unit/transports/fetch.test.ts +++ b/packages/browser/test/unit/transports/fetch.test.ts @@ -129,5 +129,31 @@ describe('FetchTransport', () => { dateStub.restore(); }); + + it('passes in headers', async () => { + transport = new Transports.FetchTransport({ + dsn: testDsn, + headers: { + Authorization: 'Basic GVzdDp0ZXN0Cg==', + }, + }); + const response = { status: 200 }; + + fetch.returns(Promise.resolve(response)); + + const res = await transport.sendEvent(payload); + + expect(res.status).equal(Status.Success); + expect( + fetch.calledWith(transportUrl, { + body: JSON.stringify(payload), + headers: { + Authorization: 'Basic GVzdDp0ZXN0Cg==', + }, + method: 'POST', + referrerPolicy: 'origin', + }), + ).equal(true); + }); }); }); diff --git a/packages/browser/test/unit/transports/xhr.test.ts b/packages/browser/test/unit/transports/xhr.test.ts index 603925208a84..6162ed68926f 100644 --- a/packages/browser/test/unit/transports/xhr.test.ts +++ b/packages/browser/test/unit/transports/xhr.test.ts @@ -102,5 +102,23 @@ describe('XHRTransport', () => { dateStub.restore(); }); + + it('passes in headers', async () => { + transport = new Transports.XHRTransport({ + dsn: testDsn, + headers: { + Authorization: 'Basic GVzdDp0ZXN0Cg==', + }, + }); + + server.respondWith('POST', transportUrl, [200, {}, '']); + const res = await transport.sendEvent(payload); + const request = server.requests[0]; + + expect(res.status).equal(Status.Success); + const requestHeaders: { [key: string]: string } = request.requestHeaders as { [key: string]: string }; + const authHeaderLabel: string = 'Authorization'; + expect(requestHeaders[authHeaderLabel]).equal('Basic GVzdDp0ZXN0Cg=='); + }); }); }); diff --git a/packages/types/src/transport.ts b/packages/types/src/transport.ts index 23d874a871ee..e5b0172b75b7 100644 --- a/packages/types/src/transport.ts +++ b/packages/types/src/transport.ts @@ -27,7 +27,7 @@ export interface TransportOptions { /** Sentry DSN */ dsn: DsnLike; /** Define custom headers */ - headers?: object; + headers?: { [key: string]: string }; /** Set a HTTP proxy that should be used for outbound requests. */ httpProxy?: string; /** Set a HTTPS proxy that should be used for outbound requests. */