From 43c44563a9b6671255ee4a591197c125a33b3f68 Mon Sep 17 00:00:00 2001 From: Aymeric Date: Thu, 11 Jan 2024 09:17:31 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20[RUM-2735]=20Track=20request=20w?= =?UTF-8?q?ith=20undefined/null=20method?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/src/browser/fetchObservable.spec.ts | 5 +++++ packages/core/src/browser/fetchObservable.ts | 9 +++++++-- .../core/src/browser/xhrObservable.spec.ts | 20 +++++++++++++++++++ packages/core/src/browser/xhrObservable.ts | 2 +- packages/core/test/requests.ts | 2 +- 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/packages/core/src/browser/fetchObservable.spec.ts b/packages/core/src/browser/fetchObservable.spec.ts index b233552725..c36bd5b834 100644 --- a/packages/core/src/browser/fetchObservable.spec.ts +++ b/packages/core/src/browser/fetchObservable.spec.ts @@ -116,6 +116,8 @@ describe('fetch proxy', () => { fetchStub(FAKE_URL, { method: 'post' }).resolveWith({ status: 500 }) fetchStub(null as any).resolveWith({ status: 500 }) fetchStub({ method: 'POST' } as any).resolveWith({ status: 500 }) + fetchStub(FAKE_URL, { method: null as any }).resolveWith({ status: 500 }) + fetchStub(FAKE_URL, { method: undefined }).resolveWith({ status: 500 }) fetchStubManager.whenAllComplete(() => { expect(requests[0].method).toEqual('GET') @@ -127,6 +129,9 @@ describe('fetch proxy', () => { expect(requests[6].method).toEqual('POST') expect(requests[7].method).toEqual('GET') expect(requests[8].method).toEqual('GET') + expect(requests[9].method).toEqual('NULL') + expect(requests[10].method).toEqual('GET') + done() }) }) diff --git a/packages/core/src/browser/fetchObservable.ts b/packages/core/src/browser/fetchObservable.ts index 3bfd9ee64a..9cf90201e3 100644 --- a/packages/core/src/browser/fetchObservable.ts +++ b/packages/core/src/browser/fetchObservable.ts @@ -55,8 +55,13 @@ function beforeSend( observable: Observable ) { const [input, init] = parameters - const methodFromParams = (init && init.method) || (input instanceof Request && input.method) - const method = methodFromParams ? methodFromParams.toUpperCase() : 'GET' + let methodFromParams = init && init.method + + if (methodFromParams === undefined && input instanceof Request) { + methodFromParams = input.method + } + + const method = methodFromParams !== undefined ? String(methodFromParams).toUpperCase() : 'GET' const url = input instanceof Request ? input.url : normalizeUrl(String(input)) const startClocks = clocksNow() diff --git a/packages/core/src/browser/xhrObservable.spec.ts b/packages/core/src/browser/xhrObservable.spec.ts index 82088dc71e..1da22942bd 100644 --- a/packages/core/src/browser/xhrObservable.spec.ts +++ b/packages/core/src/browser/xhrObservable.spec.ts @@ -377,4 +377,24 @@ describe('xhr observable', () => { expect(XMLHttpRequest.prototype.send).toBe(originalXhrStubSend) }) }) + + it('should track request with undefined or null methods', (done) => { + withXhr({ + setup(xhr) { + xhr.open(null, '/ok') + xhr.send() + xhr.onreadystatechange = jasmine.createSpy() + xhr.complete(200, 'ok') + xhr.open(undefined, '/ok') + xhr.send() + xhr.onreadystatechange = jasmine.createSpy() + xhr.complete(200, 'ok') + }, + onComplete() { + expect(requests[0].method).toBe('NULL') + expect(requests[1].method).toBe('UNDEFINED') + done() + }, + }) + }) }) diff --git a/packages/core/src/browser/xhrObservable.ts b/packages/core/src/browser/xhrObservable.ts index bf5f674941..f97433abbc 100644 --- a/packages/core/src/browser/xhrObservable.ts +++ b/packages/core/src/browser/xhrObservable.ts @@ -60,7 +60,7 @@ function createXhrObservable(configuration: Configuration) { function openXhr({ target: xhr, parameters: [method, url] }: InstrumentedMethodCall) { xhrContexts.set(xhr, { state: 'open', - method: method.toUpperCase(), + method: String(method).toUpperCase(), url: normalizeUrl(String(url)), }) } diff --git a/packages/core/test/requests.ts b/packages/core/test/requests.ts index 4458987a62..938c2812ae 100644 --- a/packages/core/test/requests.ts +++ b/packages/core/test/requests.ts @@ -286,7 +286,7 @@ class StubXhr extends StubEventEmitter { private hasEnded = false /* eslint-disable @typescript-eslint/no-unused-vars */ - open(method: string, url: string | URL | undefined | null) { + open(method: string | undefined | null, url: string | URL | undefined | null) { this.hasEnded = false }