41 lines
1.1 KiB
TypeScript
41 lines
1.1 KiB
TypeScript
import { NextRequest } from 'next/server'
|
|
|
|
export const dynamic = 'force-dynamic'
|
|
|
|
function redirectToProtectedUploadRoute(
|
|
request: NextRequest,
|
|
pathSegments: string[],
|
|
): Response {
|
|
if (pathSegments.length === 1 && pathSegments[0] === 'health') {
|
|
return new Response(request.method === 'HEAD' ? null : 'OK', { status: 200 })
|
|
}
|
|
|
|
if (
|
|
pathSegments.length === 0 ||
|
|
pathSegments.some((segment) => !segment || segment === '.' || segment === '..' || /[\\/]/.test(segment))
|
|
) {
|
|
return new Response(request.method === 'HEAD' ? null : 'Forbidden', { status: 403 })
|
|
}
|
|
|
|
const target = new URL(
|
|
`/api/uploads/${pathSegments.map((segment) => encodeURIComponent(segment)).join('/')}`,
|
|
request.url,
|
|
)
|
|
target.search = request.nextUrl.search
|
|
return Response.redirect(target, 307)
|
|
}
|
|
|
|
export async function GET(
|
|
request: NextRequest,
|
|
{ params }: { params: { path?: string[] } },
|
|
) {
|
|
return redirectToProtectedUploadRoute(request, params.path || [])
|
|
}
|
|
|
|
export async function HEAD(
|
|
request: NextRequest,
|
|
{ params }: { params: { path?: string[] } },
|
|
) {
|
|
return redirectToProtectedUploadRoute(request, params.path || [])
|
|
}
|