Skip to content

Commit 863717d

Browse files
committed
use stringify
1 parent 05a45df commit 863717d

File tree

1 file changed

+38
-16
lines changed
  • packages/rrweb/src/plugins/network/record

1 file changed

+38
-16
lines changed

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

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
/* eslint-disable no-useless-catch */
21
import type { IWindow, listenerHandler, RecordPlugin } from '@rrweb/types';
32
import { findLast } from '../../../utils';
4-
import type { StringifyOptions } from '../../utils/stringify';
3+
import { stringify, StringifyOptions } from '../../utils/stringify';
54

65
export type InitiatorType =
76
| 'audio'
@@ -194,22 +193,28 @@ function initFetchObserver(
194193
!('response' in options.recordBody) ||
195194
options.recordBody.response);
196195

197-
const req = new Request(url, init);
198196
let performanceEntry: PerformanceResourceTiming | undefined;
199197
const networkRequest: Partial<NetworkRequest> = {};
200-
if (recordRequestHeaders) {
201-
networkRequest.requestHeaders = {};
202-
req.headers.forEach((value, key) => {
203-
networkRequest.requestHeaders![key] = value;
204-
});
205-
}
206-
if (recordRequestBody) {
207-
networkRequest.requestBody = init?.body?.toString();
208-
if (networkRequest.requestBody === undefined) {
209-
networkRequest.requestBody = null;
210-
}
211-
}
212198
try {
199+
const req = new Request(url, init);
200+
if (recordRequestHeaders) {
201+
networkRequest.requestHeaders = {};
202+
req.headers.forEach((value, key) => {
203+
networkRequest.requestHeaders![key] = value;
204+
});
205+
}
206+
if (recordRequestBody) {
207+
if (!req.body) {
208+
networkRequest.requestBody = null;
209+
} else {
210+
networkRequest.requestBody = stringify(
211+
req.body,
212+
typeof recordRequestBody === 'object'
213+
? recordRequestBody
214+
: undefined,
215+
);
216+
}
217+
}
213218
const res = await originalFetch(req);
214219
const performanceEntries = win.performance.getEntriesByType(
215220
'resource',
@@ -225,10 +230,27 @@ function initFetchObserver(
225230
});
226231
}
227232
if (recordResponseBody) {
228-
networkRequest.responseBody = await res.clone().text();
233+
const reqBody = await res.clone().text();
234+
if (!reqBody) {
235+
networkRequest.responseBody = null;
236+
} else {
237+
try {
238+
const objBody = JSON.parse(reqBody) as object;
239+
networkRequest.responseBody = stringify(
240+
objBody,
241+
typeof recordResponseBody === 'object'
242+
? recordResponseBody
243+
: undefined,
244+
);
245+
} catch {
246+
networkRequest.responseBody = reqBody;
247+
}
248+
}
229249
}
230250
return res;
251+
// eslint-disable-next-line no-useless-catch
231252
} catch (cause) {
253+
// failed to fetch
232254
throw cause;
233255
} finally {
234256
if (performanceEntry) {

0 commit comments

Comments
 (0)