invix_test_task/web/app/backend/[...path]/route.ts

56 lines
1.8 KiB
TypeScript

import { NextRequest, NextResponse } from "next/server";
export const dynamic = "force-dynamic";
const DROP = new Set(["host", "connection", "content-length", "transfer-encoding"]);
async function proxy(request: NextRequest, context: { params: Promise<{ path: string[] }> }) {
const base = process.env.API_INTERNAL_URL;
if (!base) {
return NextResponse.json({ detail: "API_INTERNAL_URL is not set" }, { status: 500 });
}
const { path } = await context.params;
const target = new URL(`${base.replace(/\/$/, "")}/${path.join("/")}`);
target.search = request.nextUrl.search;
const headers = new Headers();
request.headers.forEach((value, key) => {
if (!DROP.has(key.toLowerCase())) {
headers.set(key, value);
}
});
const hasBody = request.method !== "GET" && request.method !== "HEAD";
const upstream = await fetch(target, {
method: request.method,
headers,
body: hasBody ? await request.arrayBuffer() : undefined,
cache: "no-store",
redirect: "manual",
});
const responseHeaders = new Headers();
upstream.headers.forEach((value, key) => {
const name = key.toLowerCase();
if (name === "content-encoding" || name === "content-length" || name === "transfer-encoding" || name === "set-cookie") {
return;
}
responseHeaders.set(key, value);
});
const cookies = typeof upstream.headers.getSetCookie === "function" ? upstream.headers.getSetCookie() : [];
for (const cookie of cookies) {
responseHeaders.append("set-cookie", cookie);
}
return new NextResponse(await upstream.arrayBuffer(), {
status: upstream.status,
headers: responseHeaders,
});
}
export const GET = proxy;
export const POST = proxy;
export const PUT = proxy;
export const PATCH = proxy;
export const DELETE = proxy;