Skip to content

Commit 147aba6

Browse files
committed
fix xhr
1 parent 0ae1f06 commit 147aba6

File tree

1 file changed

+74
-89
lines changed
  • packages/rrweb/src/plugins/network/record

1 file changed

+74
-89
lines changed

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

Lines changed: 74 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -199,102 +199,87 @@ function initXhrObserver(
199199
password?: string | null,
200200
) {
201201
const xhr = this as XMLHttpRequest;
202-
const requestUrl = typeof url === 'string' ? url : url.toString();
202+
const req = new Request(url);
203203
let performanceEntry: PerformanceEntry | undefined;
204204
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,
240224
);
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+
}
279234
performanceEntry = getPerformanceEntryByUrl(
280235
win,
281236
'xmlhttprequest',
282-
requestUrl,
237+
req.url,
283238
);
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+
});
298283
}
299284
};
300285
},

0 commit comments

Comments
 (0)