Merge pull request #135 from cloudflare/media_upload_hack

parse form data locally in specific cases
pull/137/head
Sven Sauleau 2023-01-18 13:24:32 +01:00 zatwierdzone przez GitHub
commit 91d4e3a04e
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
2 zmienionych plików z 51 dodań i 28 usunięć

Wyświetl plik

@ -2,6 +2,7 @@
// can be url encoded, form data or JSON. However, not working for formData
// containing binary data (like File).
export async function readBody<T>(request: Request): Promise<T> {
let form = null
const contentType = request.headers.get('content-type')
if (contentType === null) {
throw new Error('invalid request')
@ -13,35 +14,41 @@ export async function readBody<T>(request: Request): Promise<T> {
contentType.includes('multipart/form-data') &&
contentType.includes('boundary')
) {
console.log('will attempt local parse of form data')
const rBody = await request.text()
const enc = new TextEncoder()
const bodyArr = enc.encode(rBody)
const boundary = getBoundary(contentType)
console.log(`Got boundary ${boundary}`)
const parts = parse(bodyArr, boundary)
console.log(`parsed ${parts.length} parts`)
const dec = new TextDecoder()
const form: FormData = new FormData()
for (const part of parts) {
const value = dec.decode(part.data)
form.append(part.name || 'null', value)
}
const out: any = {}
for (const [key, value] of form) {
out[key] = value
}
return out as T
form = await localFormDataParse(request)
} else {
const form = await request.formData()
const out: any = {}
for (const [key, value] of form) {
out[key] = value
}
return out as T
form = await request.formData()
}
const out: any = {}
for (const [key, value] of form) {
out[key] = value
}
return out as T
}
export async function localFormDataParse(request: Request): Promise<FormData> {
const contentType = request.headers.get('content-type')
if (contentType === null) {
throw new Error('invalid request')
}
console.log('will attempt local parse of form data')
const rBody = await request.text()
const enc = new TextEncoder()
const bodyArr = enc.encode(rBody)
const boundary = getBoundary(contentType)
console.log(`Got boundary ${boundary}`)
const parts = parse(bodyArr, boundary)
console.log(`parsed ${parts.length} parts`)
const dec = new TextDecoder()
const form: FormData = new FormData()
for (const part of parts) {
const value = dec.decode(part.data)
form.append(part.name || 'null', value)
}
return form
}
// temporary code to deal with EW bug

Wyświetl plik

@ -5,6 +5,7 @@ import * as media from 'wildebeest/backend/src/media/image'
import type { ContextData } from 'wildebeest/backend/src/types/context'
import type { MediaAttachment } from 'wildebeest/backend/src/types/media'
import type { Person } from 'wildebeest/backend/src/activitypub/actors'
import { localFormDataParse } from 'wildebeest/backend/src/utils/body'
export const onRequest: PagesFunction<Env, any, ContextData> = async ({ request, env, data }) => {
return handleRequest(request, env.DATABASE, data.connectedActor, env.CF_ACCOUNT_ID, env.CF_API_TOKEN)
@ -18,7 +19,22 @@ export async function handleRequest(
accountId: string,
apiToken: string
): Promise<Response> {
const formData = await request.formData()
const contentType = request.headers.get('content-type')
if (contentType === null) {
throw new Error('invalid request')
}
let formData = null
if (
contentType.includes('charset') &&
contentType.includes('multipart/form-data') &&
contentType.includes('boundary')
) {
formData = await localFormDataParse(request)
} else {
formData = await request.formData()
}
const domain = new URL(request.url).hostname
if (!formData.has('file')) {