- main
- manifest
- deps
- main
- Install
- Run
const maxRedirectCount = 2;
let redirectCount = 0;
addEventListener("fetch", (event) => event.respondWith(handleRequest(event)));
async function handleRequest(event) {
const request = event.request;
const reqHost = request.headers.get('host');
let beResp = await fetch(request, {
backend: "origin_0",
});
console.log("Backend Response :", beResp);
while (
isRedirect(beResp.status) &&
beResp.headers.has('location') &&
urlHasHost(beResp.headers.get('location'), reqHost) &&
redirectCount <= maxRedirectCount
) {
redirectCount++;
const redirectPath = parsePath(beResp.headers.get("Location"), reqHost);
console.log(`Redirect URL (count: ${redirectCount}): ${redirectPath}`);
let newRequest = new Request(redirectPath, { headers: beResp.headers });
beResp = await fetch(newRequest, {
backend: "origin_0",
});
}
return beResp;
}
function isRedirect(statusCode) {
return statusCode >= 300 && statusCode < 400;
}
function urlHasHost(locationStr, host) {
if (locationStr.startsWith('/')) return true;
const url = new URL(locationStr);
return (url.hostname === host);
}
function parsePath(locationStr, host) {
if (locationStr.startsWith('/')) {
locationStr = `https://${host}${locationStr}`;
}
const url = new URL(locationStr);
return url.pathname;
}