2023-04-19 19:17:15 -07:00
|
|
|
import { errJSON, logger } from "./logger.js";
|
|
|
|
|
|
|
|
|
|
export class OriginOverride
|
|
|
|
|
{
|
|
|
|
|
constructor(originOverride) {
|
|
|
|
|
this.originOverride = originOverride.map((override) => {
|
|
|
|
|
let [orig, dest] = override.split("=");
|
|
|
|
|
orig = new URL(orig).origin;
|
|
|
|
|
dest = new URL(dest).origin;
|
|
|
|
|
|
|
|
|
|
return {orig, dest};
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-26 15:41:35 -07:00
|
|
|
async initPage(browser, page) {
|
|
|
|
|
const onRequest = async (request) => {
|
|
|
|
|
try {
|
|
|
|
|
const url = request.url();
|
|
|
|
|
|
|
|
|
|
let newUrl = null;
|
|
|
|
|
|
|
|
|
|
for (const {orig, dest} of this.originOverride) {
|
|
|
|
|
if (url.startsWith(orig)) {
|
|
|
|
|
newUrl = dest + url.slice(orig.length);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-04-19 19:17:15 -07:00
|
|
|
|
2023-04-26 15:41:35 -07:00
|
|
|
if (!newUrl) {
|
|
|
|
|
request.continue({}, -1);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2023-04-19 19:17:15 -07:00
|
|
|
|
2023-04-26 15:41:35 -07:00
|
|
|
const resp = await fetch(newUrl, {headers: request.headers()});
|
2023-04-19 19:17:15 -07:00
|
|
|
|
2023-04-26 15:41:35 -07:00
|
|
|
const body = Buffer.from(await resp.arrayBuffer());
|
|
|
|
|
const headers = Object.fromEntries(resp.headers);
|
|
|
|
|
const status = resp.status;
|
2023-04-19 19:17:15 -07:00
|
|
|
|
2023-04-26 15:41:35 -07:00
|
|
|
logger.debug("Origin overridden", {orig: url, dest: newUrl, status, body: body.length}, "originoverride");
|
2023-04-19 19:17:15 -07:00
|
|
|
|
2023-04-26 15:41:35 -07:00
|
|
|
request.respond({body, headers, status}, -1);
|
2023-04-19 19:17:15 -07:00
|
|
|
|
2023-04-26 15:41:35 -07:00
|
|
|
} catch (e) {
|
|
|
|
|
logger.warn("Error overriding origin", {...errJSON(e), url: page.url()}, "originoverride");
|
|
|
|
|
request.continue({}, -1);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
await browser.interceptRequest(page, onRequest);
|
2023-04-19 19:17:15 -07:00
|
|
|
}
|
|
|
|
|
}
|