Skip to content

Instantly share code, notes, and snippets.

@nicoandmee
Created May 24, 2022 01:10
Show Gist options
  • Save nicoandmee/9691456433f8c3de0070b09dae104abc to your computer and use it in GitHub Desktop.
Save nicoandmee/9691456433f8c3de0070b09dae104abc to your computer and use it in GitHub Desktop.
const replaceProperty = (obj, propName, descriptorOverrides = {}) => {
return Object.defineProperty(obj, propName, {
// Copy over the existing descriptors (writable, enumerable, configurable, etc)
...(Object.getOwnPropertyDescriptor(obj, propName) || {}),
// Add our overrides (e.g. value, get())
...descriptorOverrides
})
}
const replaceWithProxy = (obj, propName, handler) => {
const proxyObj = new Proxy(obj[propName], handler);
replaceProperty(obj, propName, { value: proxyObj });
return true;
}
const openProxyHandler = {
apply: function(target, ctx, args) {
const [method, URL, async, user, password] = args;
ctx.addEventListener('loadend', function () {
// Get the raw header string
const headers = ctx.getAllResponseHeaders();
// Convert the header string into an array of individual headers
const arr = headers.trim().split(/[\r\n]+/);
// Create a map of header names to values
const headerMap = [];
arr.forEach(function (line) {
const parts = line.split(': ');
const header = parts.shift();
const headerObject = { [header]: parts.join(': ')};
headerMap.push(headerObject);
});
const payload = {
status: ctx.status,
statusText: '',
responseURL: ctx.responseURL,
responseType: ctx.responseType,
response: ctx.response,
responseHeaders: headerMap,
requestHeaders: ctx.requestHeaders,
method: ctx.method,
data: ctx.data,
};
if (ctx.responseType === '' || ctx.responseType === 'text') {
payload.responseText = ctx.responseText;
}
window.postMessage({ type: 'MAIN_NETWORK_RESPONSE', payload }, '*');
console.log(payload);
}, false);
ctx.method = method;
return Reflect.apply(target, ctx, args);
}
}
const setRequestHeaderProxyHandler = {
apply: function(target, ctx, args) {
if (!ctx.requestHeaders) {
ctx.requestHeaders = [];
}
const [name, value] = args;
const header = { [name]: value };
ctx.requestHeaders.push(header);
return Reflect.apply(target, ctx, args);
}
};
const sendProxyHandler = {
apply: function(target, ctx, args) {
ctx.data = (args || [])[0];
return Reflect.apply(target, ctx, args);
}
}
replaceWithProxy(XMLHttpRequest.prototype, 'open', openProxyHandler);
replaceWithProxy(XMLHttpRequest.prototype, 'setRequestHeader', setRequestHeaderProxyHandler);
replaceWithProxy(XMLHttpRequest.prototype, 'send', sendProxyHandler);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment