feat(nitro): handle request body in workers (#537)

This commit is contained in:
Ahad Birang 2021-09-20 22:42:43 +04:30 committed by GitHub
parent 3e0e24f80d
commit 2b63578a84
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 35 additions and 3 deletions

View File

@ -1,6 +1,7 @@
import '#polyfill'
import { getAssetFromKV } from '@cloudflare/kv-asset-handler'
import { localCall } from '../server'
import { requestHasBody, useRequestBody } from '../server/utils'
const PUBLIC_PATH = process.env.PUBLIC_PATH // Default: /_nuxt/
@ -17,6 +18,10 @@ async function handleEvent (event) {
const url = new URL(event.request.url)
if (requestHasBody(event.request)) {
event.request.body = await useRequestBody(event.request)
}
const r = await localCall({
event,
url: url.pathname + url.search,

View File

@ -1,9 +1,9 @@
// @ts-nocheck
import '#polyfill'
import { localCall } from '../server'
import { requestHasBody, useRequestBody } from '../server/utils'
const STATIC_ASSETS_BASE = process.env.NUXT_STATIC_BASE + '/' + process.env.NUXT_STATIC_VERSION
const METHODS_WITH_BODY = ['POST', 'PUT', 'PATCH']
addEventListener('fetch', (event: any) => {
const url = new URL(event.request.url)
@ -16,9 +16,10 @@ addEventListener('fetch', (event: any) => {
})
async function handleEvent (url, event) {
if (METHODS_WITH_BODY.includes(event.request.method.toUpperCase()) && !event.request.body) {
event.request.body = await event.request.text()
if (requestHasBody(event.request)) {
event.request.body = await useRequestBody(event.request)
}
const r = await localCall({
event,
url: url.pathname + url.search,

View File

@ -0,0 +1,26 @@
const METHOD_WITH_BODY_RE = /post|put|patch/i
const TEXT_MIME_RE = /application\/text|text\/html/
const JSON_MIME_RE = /application\/json/
export function requestHasBody (request: globalThis.Request) : boolean {
return METHOD_WITH_BODY_RE.test(request.method)
}
export async function useRequestBody (request: globalThis.Request): Promise<any> {
const contentType = request.headers.get('content-type') || ''
if (contentType.includes('form')) {
const formData = await request.formData()
const body = Object.create(null)
for (const entry of formData.entries()) {
body[entry[0]] = entry[1]
}
return body
} else if (JSON_MIME_RE.test(contentType)) {
return request.json()
} else if (TEXT_MIME_RE.test(contentType)) {
return request.text()
} else {
const blob = await request.blob()
return URL.createObjectURL(blob)
}
}