diff --git a/src/routes/index.ts b/src/routes/index.ts index 1a48794..7fd6d54 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -1,3 +1,4 @@ +import { getBodyBuffer } from '@/utils/body'; import { getProxyHeaders, getAfterResponseHeaders, @@ -11,7 +12,7 @@ export default defineEventHandler(async (event) => { // parse destination URL const destination = getQuery<{ destination?: string }>(event).destination; if (!destination) - return sendJson({ + return await sendJson({ event, status: 400, data: { @@ -19,12 +20,16 @@ export default defineEventHandler(async (event) => { }, }); + // read body + const body = await getBodyBuffer(event); + // proxy cleanupHeadersBeforeProxy(event); await proxyRequest(event, destination, { fetchOptions: { redirect: 'follow', headers: getProxyHeaders(event.headers), + body, }, onResponse(outputEvent, response) { const headers = getAfterResponseHeaders(response.headers, response.url); diff --git a/src/utils/body.ts b/src/utils/body.ts new file mode 100644 index 0000000..9f10d08 --- /dev/null +++ b/src/utils/body.ts @@ -0,0 +1,13 @@ +import { H3Event } from 'h3'; + +export function hasBody(event: H3Event) { + const method = event.method.toUpperCase(); + return ['PUT', 'POST', 'PATCH', 'DELETE'].includes(method); +} + +export async function getBodyBuffer( + event: H3Event, +): Promise { + if (!hasBody(event)) return; + return await readRawBody(event, false); +} diff --git a/src/utils/sending.ts b/src/utils/sending.ts index 2b882f0..145015b 100644 --- a/src/utils/sending.ts +++ b/src/utils/sending.ts @@ -1,11 +1,10 @@ import { H3Event, EventHandlerRequest } from 'h3'; -export function sendJson(ops: { +export async function sendJson(ops: { event: H3Event; data: Record; status?: number; }) { setResponseStatus(ops.event, ops.status ?? 200); - appendResponseHeader(ops.event, 'content-type', 'application/json'); - send(ops.event, JSON.stringify(ops.data, null, 2)); + await send(ops.event, JSON.stringify(ops.data, null, 2), 'application/json'); }