Skip to content

Commit

Permalink
improve forgeResponse and rename replacingRequest > forgedRequest for…
Browse files Browse the repository at this point in the history
… xhr scriptlet
  • Loading branch information
stanislav-atr committed Nov 1, 2022
1 parent 7de569d commit 88e0d03
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 18 deletions.
33 changes: 22 additions & 11 deletions src/scriptlets/trusted-replace-fetch-response.js
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,14 @@ export function trustedReplaceFetchResponse(source, pattern = '', replacement =
return Reflect.apply(target, thisArg, args);
}

const forgeResponse = (response, text) => {
/**
* Create new Response object using original response' properties
* and given text as body content
* @param {Response} response original response to copy properties from
* @param {string} textContent text to set as body content
* @returns {Response}
*/
const forgeResponse = (response, textContent) => {
const {
bodyUsed,
headers,
Expand All @@ -128,35 +135,39 @@ export function trustedReplaceFetchResponse(source, pattern = '', replacement =
url,
} = response;

const patternRegexp = pattern === getWildcardSymbol()
? toRegExp()
: toRegExp(pattern);

const modifiedContent = text.replace(patternRegexp, replacement);

// eslint-disable-next-line compat/compat
const fiddledResponse = new Response(modifiedContent, {
const forgedResponse = new Response(textContent, {
status,
statusText,
headers,
});

// Manually set properties which can't be set by Response constructor
Object.defineProperties(fiddledResponse, {
Object.defineProperties(forgedResponse, {
url: { value: url },
type: { value: type },
ok: { value: ok },
bodyUsed: { value: bodyUsed },
redirected: { value: redirected },
});

hit(source);
return forgedResponse;
};

return nativeFetch(...args)
.then((response) => {
return response.text()
.then((bodyText) => forgeResponse(response, bodyText))
.then((bodyText) => {
const patternRegexp = pattern === getWildcardSymbol()
? toRegExp()
: toRegExp(pattern);

const modifiedTextContent = bodyText.replace(patternRegexp, replacement);
const forgedResponse = forgeResponse(response, modifiedTextContent);

hit(source);
return forgedResponse;
})
.catch(() => {
// log if response body can't be converted to a string
const fetchDataStr = objectToString(fetchData);
Expand Down
14 changes: 7 additions & 7 deletions src/scriptlets/trusted-replace-xhr-response.js
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,9 @@ export function trustedReplaceXhrResponse(source, pattern = '', replacement = ''
* to be able to collect response data without triggering
* listeners on original XHR object
*/
const replacingRequest = new XMLHttpRequest();
replacingRequest.addEventListener('readystatechange', () => {
if (replacingRequest.readyState !== 4) {
const forgedRequest = new XMLHttpRequest();
forgedRequest.addEventListener('readystatechange', () => {
if (forgedRequest.readyState !== 4) {
return;
}

Expand All @@ -145,7 +145,7 @@ export function trustedReplaceXhrResponse(source, pattern = '', replacement = ''
responseXML,
status,
statusText,
} = replacingRequest;
} = forgedRequest;

// Extract content from response
const content = responseText || response;
Expand Down Expand Up @@ -186,20 +186,20 @@ export function trustedReplaceXhrResponse(source, pattern = '', replacement = ''
hit(source);
});

nativeOpen.apply(replacingRequest, [xhrData.method, xhrData.url]);
nativeOpen.apply(forgedRequest, [xhrData.method, xhrData.url]);

// Mimic request headers before sending
// setRequestHeader can only be called on open request objects
requestHeaders.forEach((header) => {
const name = header[0];
const value = header[1];

replacingRequest.setRequestHeader(name, value);
forgedRequest.setRequestHeader(name, value);
});
requestHeaders = [];

try {
nativeSend.call(replacingRequest, args);
nativeSend.call(forgedRequest, args);
} catch {
return Reflect.apply(target, thisArg, args);
}
Expand Down

0 comments on commit 88e0d03

Please sign in to comment.