- Removed old relay utilities and tests, replacing them with a new structure under `src/lib/relay-utils.ts`. - Implemented a new edge function in `app/api/proxy/route.ts` to handle proxy requests. - Created a new Next.js layout and page structure for the frontend, including a user interface for testing the proxy. - Added Tailwind CSS for styling and configured PostCSS. - Updated TypeScript configuration for better compatibility with Next.js. - Removed unused files and configurations related to the previous setup.
50 lines
1.2 KiB
TypeScript
50 lines
1.2 KiB
TypeScript
export interface RelayOptions {
|
|
stripHeaders?: string[];
|
|
}
|
|
|
|
export function normalizeTargetUrl(target: string | null, relayPath: string): string | null {
|
|
if (!target) return null;
|
|
return target.replace(/\/$/, "") + relayPath;
|
|
}
|
|
|
|
export function stripRelayHeaders(headers: Headers): Headers {
|
|
const stripped = new Headers(headers);
|
|
stripped.delete("x-relay-target");
|
|
stripped.delete("x-relay-path");
|
|
stripped.delete("host");
|
|
return stripped;
|
|
}
|
|
|
|
export function shouldSendBody(method: string): boolean {
|
|
return method !== "GET" && method !== "HEAD";
|
|
}
|
|
|
|
export function buildRelayRequest(
|
|
req: Request,
|
|
targetUrl: string,
|
|
headers: Headers
|
|
): RequestInit {
|
|
return {
|
|
method: req.method,
|
|
headers,
|
|
body: shouldSendBody(req.method) ? req.body : undefined,
|
|
duplex: "half" as const,
|
|
};
|
|
}
|
|
|
|
export function isAllowedTarget(url: string): boolean {
|
|
try {
|
|
const parsed = new URL(url);
|
|
return ["http:", "https:"].includes(parsed.protocol);
|
|
} catch {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
export function createRelayResponse(response: Response): Response {
|
|
return new Response(response.body, {
|
|
status: response.status,
|
|
headers: response.headers,
|
|
});
|
|
}
|