9router/cloud/src/handlers/forward.js

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" }
});
}
}