1
- /* eslint-disable no-useless-catch */
2
1
import type { IWindow , listenerHandler , RecordPlugin } from '@rrweb/types' ;
3
2
import { findLast } from '../../../utils' ;
4
- import type { StringifyOptions } from '../../utils/stringify' ;
3
+ import { stringify , StringifyOptions } from '../../utils/stringify' ;
5
4
6
5
export type InitiatorType =
7
6
| 'audio'
@@ -194,22 +193,28 @@ function initFetchObserver(
194
193
! ( 'response' in options . recordBody ) ||
195
194
options . recordBody . response ) ;
196
195
197
- const req = new Request ( url , init ) ;
198
196
let performanceEntry : PerformanceResourceTiming | undefined ;
199
197
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
- }
212
198
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
+ }
213
218
const res = await originalFetch ( req ) ;
214
219
const performanceEntries = win . performance . getEntriesByType (
215
220
'resource' ,
@@ -225,10 +230,27 @@ function initFetchObserver(
225
230
} ) ;
226
231
}
227
232
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
+ }
229
249
}
230
250
return res ;
251
+ // eslint-disable-next-line no-useless-catch
231
252
} catch ( cause ) {
253
+ // failed to fetch
232
254
throw cause ;
233
255
} finally {
234
256
if ( performanceEntry ) {
0 commit comments