From 6a82a834eba13184a8be8e9570b36a48a19bc3b0 Mon Sep 17 00:00:00 2001 From: MythEclipse Date: Thu, 7 May 2026 23:09:49 +0700 Subject: [PATCH] refactor: remove unnecessary targetUrl parameter and prevent compressed responses in relay --- src/app/route.ts | 5 +---- src/lib/relay-utils.ts | 45 +++++++++++++----------------------------- 2 files changed, 15 insertions(+), 35 deletions(-) diff --git a/src/app/route.ts b/src/app/route.ts index 1cf4034..4050a57 100644 --- a/src/app/route.ts +++ b/src/app/route.ts @@ -46,10 +46,7 @@ async function handler(req: Request): Promise { } const headers = filterHeaders(new Headers(req.headers)); - // Prevent compressed responses (gzip, br) that cause encoding bugs in relay - headers.delete("accept-encoding"); - - const fetchOptions = buildRelayRequest(req, targetUrl, headers); + const fetchOptions = buildRelayRequest(req, headers); const response = await fetch(targetUrl, fetchOptions); return createRelayResponse(response); diff --git a/src/lib/relay-utils.ts b/src/lib/relay-utils.ts index 6fbe16b..d62e405 100644 --- a/src/lib/relay-utils.ts +++ b/src/lib/relay-utils.ts @@ -12,36 +12,26 @@ export const ALLOWED_HEADERS = new Set([ ]); export const BLOCKED_HEADERS = new Set([ - "x-vercel-id", - "x-vercel-deployment-url", - "x-vercel-oidc-token", - "x-vercel-oidc-token-ts", - "x-vercel-signature", - "x-vercel-edgified", - "x-vercel-ip-city", - "x-vercel-ip-country", - "x-vercel-ip-country-region", - "x-vercel-ip-latency", - "x-vercel-deployment-config", - "x-vercel-rewritten-query", - "cf-ray", - "cf-connecting-ip", - "cf-ipcountry", - "cf-ray-id", - "x-forwarded-for", - "x-forwarded-host", - "x-forwarded-proto", - "forwarded", + "host", + "connection", + "keep-alive", + "proxy-authenticate", + "proxy-authorization", + "te", + "trailers", + "transfer-encoding", + "upgrade", + "x-relay-target", + "x-relay-path", "cookie", "set-cookie", "x-real-ip", - "x-cluster-client-ip", + "x-forwarded-for", + "x-forwarded-host", + "x-forwarded-proto", "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 { if (!target) return null; return target.replace(/\/$/, "") + relayPath; @@ -51,12 +41,9 @@ export function filterHeaders(headers: Headers): Headers { const filtered = new Headers(); for (const [key, value] of headers.entries()) { const lowerKey = key.toLowerCase(); - if (INTERNAL_HEADERS.has(lowerKey)) continue; if (BLOCKED_HEADERS.has(lowerKey)) continue; if (lowerKey.startsWith("x-vercel-")) continue; if (lowerKey.startsWith("cf-")) continue; - if (lowerKey.startsWith("x-forwarded-")) continue; - // Forward remaining headers filtered.set(key, value); } return filtered; @@ -68,7 +55,6 @@ export function shouldSendBody(method: string): boolean { export function buildRelayRequest( req: Request, - targetUrl: string, headers: Headers ): RequestInit { return { @@ -91,13 +77,10 @@ export function isAllowedTarget(url: string): boolean { export function createRelayResponse(response: Response): Response { const headers = new Headers(response.headers); // Remove headers that would confuse the browser or were handled by the proxy - headers.delete("content-encoding"); headers.delete("content-length"); headers.delete("transfer-encoding"); headers.delete("connection"); headers.delete("keep-alive"); - headers.delete("x-frame-options"); // Allow embedding if needed - headers.delete("content-security-policy"); // Add CORS for browser UI headers.set("Access-Control-Allow-Origin", "*");