75 lines
2.3 KiB
JavaScript
75 lines
2.3 KiB
JavaScript
// CF headers to remove
|
|
const CF_HEADERS = [
|
|
"cf-connecting-ip", "cf-connecting-ip6", "cf-ray", "cf-visitor",
|
|
"cf-ipcountry", "cf-tracking-id", "cf-connecting-ip6-policy",
|
|
"x-real-ip", "x-forwarded-for", "x-forwarded-proto", "x-forwarded-host"
|
|
];
|
|
|
|
// Forward request to any endpoint
|
|
export async function handleForward(request) {
|
|
try {
|
|
const url = new URL(request.url);
|
|
const clientIp = request.headers.get("CF-Connecting-IP") || "";
|
|
const { targetUrl, headers = {}, body } = await request.json();
|
|
|
|
if (!targetUrl) {
|
|
return new Response(JSON.stringify({ error: "targetUrl is required" }), {
|
|
status: 400,
|
|
headers: { "Content-Type": "application/json" }
|
|
});
|
|
}
|
|
|
|
// Filter out CF headers from input
|
|
const cleanHeaders = {};
|
|
for (const [key, value] of Object.entries(headers)) {
|
|
if (!CF_HEADERS.includes(key.toLowerCase())) {
|
|
cleanHeaders[key] = value;
|
|
}
|
|
}
|
|
|
|
// Set standard forwarding headers
|
|
cleanHeaders["X-Client-IP"] = clientIp;
|
|
cleanHeaders["X-Forwarded-Proto"] = url.protocol.replace(":", "");
|
|
cleanHeaders["X-Forwarded-Host"] = url.host;
|
|
cleanHeaders["X-From-Worker"] = "1";
|
|
|
|
console.log("[FORWARD] Target:", targetUrl);
|
|
console.log("[FORWARD] Headers:", JSON.stringify(cleanHeaders));
|
|
|
|
// Create Request object to have more control over headers
|
|
const outgoingRequest = new Request(targetUrl, {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
...cleanHeaders
|
|
},
|
|
body: JSON.stringify(body)
|
|
});
|
|
|
|
// Use fetch with cf options to minimize auto-added headers
|
|
const response = await fetch(outgoingRequest, {
|
|
cf: {
|
|
// Disable automatic features that add headers
|
|
scrapeShield: false,
|
|
minify: false,
|
|
mirage: false,
|
|
polish: "off"
|
|
}
|
|
});
|
|
|
|
// Stream response back to client
|
|
return new Response(response.body, {
|
|
status: response.status,
|
|
headers: {
|
|
"Content-Type": response.headers.get("Content-Type") || "application/json",
|
|
"Access-Control-Allow-Origin": "*"
|
|
}
|
|
});
|
|
} catch (error) {
|
|
console.error("[FORWARD] Error:", error.message);
|
|
return new Response(JSON.stringify({ error: error.message }), {
|
|
status: 500,
|
|
headers: { "Content-Type": "application/json" }
|
|
});
|
|
}
|
|
}
|