refactor: remove unnecessary targetUrl parameter and prevent compressed responses in relay

This commit is contained in:
MythEclipse
2026-05-07 23:09:49 +07:00
parent c1772d6b6b
commit 6a82a834eb
2 changed files with 15 additions and 35 deletions
+1 -4
View File
@@ -46,10 +46,7 @@ async function handler(req: Request): Promise<Response> {
} }
const headers = filterHeaders(new Headers(req.headers)); const headers = filterHeaders(new Headers(req.headers));
// Prevent compressed responses (gzip, br) that cause encoding bugs in relay const fetchOptions = buildRelayRequest(req, headers);
headers.delete("accept-encoding");
const fetchOptions = buildRelayRequest(req, targetUrl, headers);
const response = await fetch(targetUrl, fetchOptions); const response = await fetch(targetUrl, fetchOptions);
return createRelayResponse(response); return createRelayResponse(response);
+14 -31
View File
@@ -12,36 +12,26 @@ export const ALLOWED_HEADERS = new Set([
]); ]);
export const BLOCKED_HEADERS = new Set([ export const BLOCKED_HEADERS = new Set([
"x-vercel-id", "host",
"x-vercel-deployment-url", "connection",
"x-vercel-oidc-token", "keep-alive",
"x-vercel-oidc-token-ts", "proxy-authenticate",
"x-vercel-signature", "proxy-authorization",
"x-vercel-edgified", "te",
"x-vercel-ip-city", "trailers",
"x-vercel-ip-country", "transfer-encoding",
"x-vercel-ip-country-region", "upgrade",
"x-vercel-ip-latency", "x-relay-target",
"x-vercel-deployment-config", "x-relay-path",
"x-vercel-rewritten-query",
"cf-ray",
"cf-connecting-ip",
"cf-ipcountry",
"cf-ray-id",
"x-forwarded-for",
"x-forwarded-host",
"x-forwarded-proto",
"forwarded",
"cookie", "cookie",
"set-cookie", "set-cookie",
"x-real-ip", "x-real-ip",
"x-cluster-client-ip", "x-forwarded-for",
"x-forwarded-host",
"x-forwarded-proto",
"x-api-key", "x-api-key",
"x-cache",
]); ]);
const INTERNAL_HEADERS = new Set(["x-relay-target", "x-relay-path", "host"]);
export function normalizeTargetUrl(target: string | null, relayPath: string): string | null { export function normalizeTargetUrl(target: string | null, relayPath: string): string | null {
if (!target) return null; if (!target) return null;
return target.replace(/\/$/, "") + relayPath; return target.replace(/\/$/, "") + relayPath;
@@ -51,12 +41,9 @@ export function filterHeaders(headers: Headers): Headers {
const filtered = new Headers(); const filtered = new Headers();
for (const [key, value] of headers.entries()) { for (const [key, value] of headers.entries()) {
const lowerKey = key.toLowerCase(); const lowerKey = key.toLowerCase();
if (INTERNAL_HEADERS.has(lowerKey)) continue;
if (BLOCKED_HEADERS.has(lowerKey)) continue; if (BLOCKED_HEADERS.has(lowerKey)) continue;
if (lowerKey.startsWith("x-vercel-")) continue; if (lowerKey.startsWith("x-vercel-")) continue;
if (lowerKey.startsWith("cf-")) continue; if (lowerKey.startsWith("cf-")) continue;
if (lowerKey.startsWith("x-forwarded-")) continue;
// Forward remaining headers
filtered.set(key, value); filtered.set(key, value);
} }
return filtered; return filtered;
@@ -68,7 +55,6 @@ export function shouldSendBody(method: string): boolean {
export function buildRelayRequest( export function buildRelayRequest(
req: Request, req: Request,
targetUrl: string,
headers: Headers headers: Headers
): RequestInit { ): RequestInit {
return { return {
@@ -91,13 +77,10 @@ export function isAllowedTarget(url: string): boolean {
export function createRelayResponse(response: Response): Response { export function createRelayResponse(response: Response): Response {
const headers = new Headers(response.headers); const headers = new Headers(response.headers);
// Remove headers that would confuse the browser or were handled by the proxy // Remove headers that would confuse the browser or were handled by the proxy
headers.delete("content-encoding");
headers.delete("content-length"); headers.delete("content-length");
headers.delete("transfer-encoding"); headers.delete("transfer-encoding");
headers.delete("connection"); headers.delete("connection");
headers.delete("keep-alive"); headers.delete("keep-alive");
headers.delete("x-frame-options"); // Allow embedding if needed
headers.delete("content-security-policy");
// Add CORS for browser UI // Add CORS for browser UI
headers.set("Access-Control-Allow-Origin", "*"); headers.set("Access-Control-Allow-Origin", "*");