Created
May 24, 2022 01:10
-
-
Save nicoandmee/9691456433f8c3de0070b09dae104abc to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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