import { NextRequest, NextResponse } from 'next/server'
import { getToken } from 'next-auth/jwt'
const backendUrl = process.env.NEXT_PUBLIC_BACKEND_URL
async function proxyRequest(request: NextRequest) {
const authToken = request.headers.get('Authorization')
const baseUrl = process.env.NEXTAUTH_URL
if (!authToken) {
return NextResponse.redirect(`${baseUrl}`)
}
const url = `${backendUrl}${request.nextUrl.pathname.replace('/api/proxy', '')}${
request.nextUrl.search
}`
try {
const response = await fetch(url, {
method: request.method,
headers: {
...filterHeaders(request.headers),
Authorization: authToken,
},
body:
request.method !== 'GET' && request.method !== 'HEAD'
? await request.text()
: undefined,
})
const responseBody = await response.text()
return new NextResponse(responseBody, {
status: response.status,
headers: filterResponseHeaders(response.headers),
})
} catch (error) {
console.error('Proxy error:', error)
return NextResponse.json({ error: 'Internal Server Error' }, { status: 500 })
}
}
export async function GET(request: NextRequest) {
return proxyRequest(request)
}
export async function POST(request: NextRequest) {
return proxyRequest(request)
}
export async function PUT(request: NextRequest) {
return proxyRequest(request)
}
export async function DELETE(request: NextRequest) {
return proxyRequest(request)
}
export async function PATCH(request: NextRequest) {
return proxyRequest(request)
}
function filterHeaders(headers: Headers) {
const excludedHeaders = ['host', 'content-length', 'connection']
const filtered: Record<string, string> = {}
Array.from(headers.entries()).forEach(([key, value]) => {
if (!excludedHeaders.includes(key.toLowerCase())) {
filtered[key] = value
}
})
return filtered
}
function filterResponseHeaders(headers: Headers) {
const excludedHeaders = [
'content-encoding',
'transfer-encoding',
'connection',
'content-length',
]
const filtered: Record<string, string> = {}
Array.from(headers.entries()).forEach(([key, value]) => {
if (!excludedHeaders.includes(key.toLowerCase())) {
filtered[key] = value
}
})
return filtered
}