Skip to content

Commit 6804e4b

Browse files
committed
better recordBody
1 parent 0278113 commit 6804e4b

File tree

1 file changed

+72
-97
lines changed
  • packages/rrweb/src/plugins/network/record

1 file changed

+72
-97
lines changed

packages/rrweb/src/plugins/network/record/index.ts

Lines changed: 72 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,34 @@ function initPerformanceObserver(
168168
};
169169
}
170170

171-
function getContentType(headers: Headers) {
172-
const contentTypeHeader = Object.keys(headers).find(
173-
(key) => key.toLowerCase() === 'content-type',
171+
function shouldRecordHeaders(
172+
type: 'request' | 'response',
173+
recordHeaders: NetworkRecordOptions['recordHeaders'],
174+
) {
175+
return (
176+
!!recordHeaders &&
177+
(typeof recordHeaders === 'boolean' || recordHeaders[type])
174178
);
175-
return contentTypeHeader && headers[contentTypeHeader];
179+
}
180+
181+
function shouldRecordBody(
182+
type: 'request' | 'response',
183+
recordBody: NetworkRecordOptions['recordBody'],
184+
headers: Headers,
185+
) {
186+
function matchesContentType(contentTypes: string[]) {
187+
const contentTypeHeader = Object.keys(headers).find(
188+
(key) => key.toLowerCase() === 'content-type',
189+
);
190+
const contentType = contentTypeHeader && headers[contentTypeHeader];
191+
return contentTypes.some((ct) => contentType?.includes(ct));
192+
}
193+
if (!recordBody) return false;
194+
if (typeof recordBody === 'boolean') return true;
195+
if (Array.isArray(recordBody)) return matchesContentType(recordBody);
196+
const recordBodyType = recordBody[type];
197+
if (typeof recordBodyType === 'boolean') return recordBodyType;
198+
return matchesContentType(recordBodyType);
176199
}
177200

178201
async function getRequestPerformanceEntry(
@@ -221,27 +244,14 @@ function initXhrObserver(
221244
//
222245
};
223246
}
224-
const recordRequestHeaders =
225-
!!options.recordHeaders &&
226-
(typeof options.recordHeaders === 'boolean' ||
227-
!('request' in options.recordHeaders) ||
228-
options.recordHeaders.request);
229-
const recordRequestBody =
230-
!!options.recordBody &&
231-
(typeof options.recordBody === 'boolean' ||
232-
!('request' in options.recordBody) ||
233-
options.recordBody.request);
234-
const recordResponseHeaders =
235-
!!options.recordHeaders &&
236-
(typeof options.recordHeaders === 'boolean' ||
237-
!('response' in options.recordHeaders) ||
238-
options.recordHeaders.response);
239-
const recordResponseBody =
240-
!!options.recordBody &&
241-
(typeof options.recordBody === 'boolean' ||
242-
!('response' in options.recordBody) ||
243-
options.recordBody.response);
244-
247+
const recordRequestHeaders = shouldRecordHeaders(
248+
'request',
249+
options.recordHeaders,
250+
);
251+
const recordResponseHeaders = shouldRecordHeaders(
252+
'response',
253+
options.recordHeaders,
254+
);
245255
const restorePatch = patch(
246256
win.XMLHttpRequest.prototype,
247257
'open',
@@ -269,17 +279,11 @@ function initXhrObserver(
269279
}
270280
const originalSend = xhr.send.bind(xhr);
271281
xhr.send = (body) => {
272-
if (recordRequestBody) {
273-
const contentType = getContentType(requestHeaders);
274-
if (
275-
recordRequestBody === true ||
276-
(contentType && recordRequestBody.includes(contentType))
277-
) {
278-
if (body === undefined || body === null) {
279-
networkRequest.requestBody = null;
280-
} else {
281-
networkRequest.requestBody = body;
282-
}
282+
if (shouldRecordBody('request', options.recordBody, requestHeaders)) {
283+
if (body === undefined || body === null) {
284+
networkRequest.requestBody = null;
285+
} else {
286+
networkRequest.requestBody = body;
283287
}
284288
}
285289
after = win.performance.now();
@@ -304,18 +308,14 @@ function initXhrObserver(
304308
if (recordResponseHeaders) {
305309
networkRequest.responseHeaders = responseHeaders;
306310
}
307-
if (recordResponseBody) {
308-
const contentType = getContentType(responseHeaders);
309-
if (
310-
recordResponseBody === true ||
311-
(contentType && recordResponseBody.includes(contentType))
312-
) {
313-
if (xhr.response === undefined || xhr.response === null) {
314-
networkRequest.responseBody = null;
315-
} else {
316-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
317-
networkRequest.responseBody = xhr.response;
318-
}
311+
if (
312+
shouldRecordBody('response', options.recordBody, responseHeaders)
313+
) {
314+
if (xhr.response === undefined || xhr.response === null) {
315+
networkRequest.responseBody = null;
316+
} else {
317+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
318+
networkRequest.responseBody = xhr.response;
319319
}
320320
}
321321
getRequestPerformanceEntry(
@@ -363,27 +363,14 @@ function initFetchObserver(
363363
//
364364
};
365365
}
366-
const recordRequestHeaders =
367-
!!options.recordHeaders &&
368-
(typeof options.recordHeaders === 'boolean' ||
369-
!('request' in options.recordHeaders) ||
370-
options.recordHeaders.request);
371-
const recordRequestBody =
372-
!!options.recordBody &&
373-
(typeof options.recordBody === 'boolean' ||
374-
!('request' in options.recordBody) ||
375-
options.recordBody.request);
376-
const recordResponseHeaders =
377-
!!options.recordHeaders &&
378-
(typeof options.recordHeaders === 'boolean' ||
379-
!('response' in options.recordHeaders) ||
380-
options.recordHeaders.response);
381-
const recordResponseBody =
382-
!!options.recordBody &&
383-
(typeof options.recordBody === 'boolean' ||
384-
!('response' in options.recordBody) ||
385-
options.recordBody.response);
386-
366+
const recordRequestHeaders = shouldRecordHeaders(
367+
'request',
368+
options.recordHeaders,
369+
);
370+
const recordResponseHeaders = shouldRecordHeaders(
371+
'response',
372+
options.recordHeaders,
373+
);
387374
const restorePatch = patch(win, 'fetch', (originalFetch: typeof fetch) => {
388375
return async function (
389376
url: URL | RequestInfo,
@@ -402,17 +389,11 @@ function initFetchObserver(
402389
if (recordRequestHeaders) {
403390
networkRequest.requestHeaders = requestHeaders;
404391
}
405-
if (recordRequestBody) {
406-
const contentType = getContentType(requestHeaders);
407-
if (
408-
recordRequestBody === true ||
409-
(contentType && recordRequestBody.includes(contentType))
410-
) {
411-
if (req.body === undefined || req.body === null) {
412-
networkRequest.requestBody = null;
413-
} else {
414-
networkRequest.requestBody = req.body;
415-
}
392+
if (shouldRecordBody('request', options.recordBody, requestHeaders)) {
393+
if (req.body === undefined || req.body === null) {
394+
networkRequest.requestBody = null;
395+
} else {
396+
networkRequest.requestBody = req.body;
416397
}
417398
}
418399
after = win.performance.now();
@@ -425,23 +406,17 @@ function initFetchObserver(
425406
if (recordResponseHeaders) {
426407
networkRequest.responseHeaders = responseHeaders;
427408
}
428-
if (recordResponseBody) {
429-
const contentType = getContentType(responseHeaders);
430-
if (
431-
recordResponseBody === true ||
432-
(contentType && recordResponseBody.includes(contentType))
433-
) {
434-
let body: string | undefined;
435-
try {
436-
body = await res.clone().text();
437-
} catch {
438-
//
439-
}
440-
if (res.body === undefined || res.body === null) {
441-
networkRequest.responseBody = null;
442-
} else {
443-
networkRequest.responseBody = body;
444-
}
409+
if (shouldRecordBody('response', options.recordBody, responseHeaders)) {
410+
let body: string | undefined;
411+
try {
412+
body = await res.clone().text();
413+
} catch {
414+
//
415+
}
416+
if (res.body === undefined || res.body === null) {
417+
networkRequest.responseBody = null;
418+
} else {
419+
networkRequest.responseBody = body;
445420
}
446421
}
447422
return res;

0 commit comments

Comments
 (0)