@@ -199,102 +199,87 @@ function initXhrObserver(
199
199
password ?: string | null ,
200
200
) {
201
201
const xhr = this as XMLHttpRequest ;
202
- const requestUrl = typeof url === 'string' ? url : url . toString ( ) ;
202
+ const req = new Request ( url ) ;
203
203
let performanceEntry : PerformanceEntry | undefined ;
204
204
const networkRequest : Partial < NetworkRequest > = { } ;
205
- try {
206
- if ( recordRequestHeaders ) {
207
- networkRequest . requestHeaders = { } ;
208
- const originalSetRequestHeader = xhr . setRequestHeader . bind ( xhr ) ;
209
- xhr . setRequestHeader = ( header : string , value : string ) => {
210
- networkRequest . requestHeaders ! [ header ] = value ;
211
- return originalSetRequestHeader ( header , value ) ;
212
- } ;
213
- }
214
- if ( recordRequestBody ) {
215
- const originalSend = xhr . send . bind ( xhr ) ;
216
- xhr . send = ( body ) => {
217
- if ( body === undefined || body === null ) {
218
- networkRequest . requestBody = null ;
219
- } else {
220
- networkRequest . requestBody = stringify (
221
- body ,
222
- typeof recordRequestBody === 'object'
223
- ? recordRequestBody
224
- : undefined ,
225
- ) ;
226
- }
227
- return originalSend ( body ) ;
228
- } ;
229
- }
230
- await new Promise < void > ( ( resolve ) => {
231
- xhr . responseType = 'text' ;
232
- xhr . addEventListener ( 'readystatechange' , ( ) => {
233
- if ( xhr . readyState !== xhr . DONE ) {
234
- return ;
235
- }
236
- performanceEntry = getPerformanceEntryByUrl (
237
- win ,
238
- 'xmlhttprequest' ,
239
- requestUrl ,
205
+ if ( recordRequestHeaders ) {
206
+ networkRequest . requestHeaders = { } ;
207
+ const originalSetRequestHeader = xhr . setRequestHeader . bind ( xhr ) ;
208
+ xhr . setRequestHeader = ( header : string , value : string ) => {
209
+ networkRequest . requestHeaders ! [ header ] = value ;
210
+ return originalSetRequestHeader ( header , value ) ;
211
+ } ;
212
+ }
213
+ if ( recordRequestBody ) {
214
+ const originalSend = xhr . send . bind ( xhr ) ;
215
+ xhr . send = ( body ) => {
216
+ if ( body === undefined || body === null ) {
217
+ networkRequest . requestBody = null ;
218
+ } else {
219
+ networkRequest . requestBody = stringify (
220
+ body ,
221
+ typeof recordRequestBody === 'object'
222
+ ? recordRequestBody
223
+ : undefined ,
240
224
) ;
241
- if ( recordResponseHeaders ) {
242
- networkRequest . responseHeaders = { } ;
243
- const rawHeaders = xhr . getAllResponseHeaders ( ) ;
244
- const headers = rawHeaders . trim ( ) . split ( / [ \r \n ] + / ) ;
245
- headers . forEach ( ( line ) => {
246
- const parts = line . split ( ': ' ) ;
247
- const header = parts . shift ( ) ;
248
- const value = parts . join ( ': ' ) ;
249
- if ( header ) {
250
- networkRequest . responseHeaders ! [ header ] = value ;
251
- }
252
- } ) ;
253
- }
254
- if ( recordResponseBody ) {
255
- if ( ! xhr . response ) {
256
- networkRequest . responseBody = null ;
257
- } else {
258
- try {
259
- const objBody = JSON . parse (
260
- xhr . response as string ,
261
- ) as object ;
262
- networkRequest . responseBody = stringify (
263
- objBody ,
264
- typeof recordResponseBody === 'object'
265
- ? recordResponseBody
266
- : undefined ,
267
- ) ;
268
- } catch {
269
- networkRequest . responseBody = xhr . response as string ;
270
- }
271
- }
272
- }
273
- resolve ( ) ;
274
- } ) ;
275
- originalOpen ( method , url , async , username , password ) ;
276
- } ) ;
277
- } catch ( cause ) {
278
- if ( ! performanceEntry ) {
225
+ }
226
+ return originalSend ( body ) ;
227
+ } ;
228
+ }
229
+ await new Promise < void > ( ( resolve ) => {
230
+ xhr . addEventListener ( 'readystatechange' , ( ) => {
231
+ if ( xhr . readyState !== xhr . DONE ) {
232
+ return ;
233
+ }
279
234
performanceEntry = getPerformanceEntryByUrl (
280
235
win ,
281
236
'xmlhttprequest' ,
282
- requestUrl ,
237
+ req . url ,
283
238
) ;
284
- }
285
- throw cause ;
286
- } finally {
287
- if ( performanceEntry ) {
288
- cb ( {
289
- requests : [
290
- {
291
- performanceEntry,
292
- requestMethod : method ,
293
- ...networkRequest ,
294
- } ,
295
- ] ,
296
- } ) ;
297
- }
239
+ if ( recordResponseHeaders ) {
240
+ networkRequest . responseHeaders = { } ;
241
+ const rawHeaders = xhr . getAllResponseHeaders ( ) ;
242
+ const headers = rawHeaders . trim ( ) . split ( / [ \r \n ] + / ) ;
243
+ headers . forEach ( ( line ) => {
244
+ const parts = line . split ( ': ' ) ;
245
+ const header = parts . shift ( ) ;
246
+ const value = parts . join ( ': ' ) ;
247
+ if ( header ) {
248
+ networkRequest . responseHeaders ! [ header ] = value ;
249
+ }
250
+ } ) ;
251
+ }
252
+ if ( recordResponseBody ) {
253
+ if ( ! xhr . response ) {
254
+ networkRequest . responseBody = null ;
255
+ } else {
256
+ try {
257
+ const objBody = JSON . parse ( xhr . response as string ) as object ;
258
+ networkRequest . responseBody = stringify (
259
+ objBody ,
260
+ typeof recordResponseBody === 'object'
261
+ ? recordResponseBody
262
+ : undefined ,
263
+ ) ;
264
+ } catch {
265
+ networkRequest . responseBody = xhr . response as string ;
266
+ }
267
+ }
268
+ }
269
+ resolve ( ) ;
270
+ } ) ;
271
+ originalOpen ( method , url , async , username , password ) ;
272
+ } ) ;
273
+ if ( performanceEntry ) {
274
+ cb ( {
275
+ requests : [
276
+ {
277
+ performanceEntry,
278
+ requestMethod : req . method ,
279
+ ...networkRequest ,
280
+ } ,
281
+ ] ,
282
+ } ) ;
298
283
}
299
284
} ;
300
285
} ,
0 commit comments