UNPKG

@npio/filesystem

Version:

A free visual website editor, powered with your own SolidJS components.

78 lines (65 loc) 2.44 kB
import { FetchEvent } from "@solidjs/start/server"; import { getRequestURL } from "h3"; import { assertBodySize, h3Event } from "./utils"; const DEFAULT_MAX_SIZE = 1024 * 1024 * 10; type MaybePromise<T> = Promise<T> | T; export const createBodyLimit = ({ customServerFunctions = [], maxSize, }: { /** Skip automatic request body processing for specified Server Functions */ customServerFunctions?: any[]; /** Default maximum body size */ maxSize?: (event: FetchEvent) => MaybePromise<number | undefined>; } = {}) => { const ids = new Map(); for (const fn of customServerFunctions) { const rawUrl = fn.url as string; if (rawUrl == null) { continue; } const urlParts = rawUrl.split("?"); const queryString = urlParts[1]; let params = new URLSearchParams(queryString); const id = params.get("id"); const name = params.get("name"); if (id == null || name == null) continue; ids.set(id, null); } return async (event: FetchEvent) => { if (event.request.body) { const url = getRequestURL(h3Event(event)); const serverReference = event.request.headers.get("x-server-id"); // Inpsired by https://github.com/solidjs/solid-start/blob/a696b99a41697ca69b8284cadb1e0ad2558e816b/packages/start/src/runtime/server-handler.ts#L90 const [id, name] = serverReference ? serverReference.split("#") : [url.searchParams.get("id"), url.searchParams.get("name")]; const matchedCustomServerFunction = id && name ? ids.has(id) : false; if (matchedCustomServerFunction) { const origRequest = event.request; const fakeRequest = new Request(event.request, { body: "" }); fakeRequest.headers.set( "content-type", "application/x-www-form-urlencoded", ); const origDescriptor = Object.getOwnPropertyDescriptor( event, "request", )!; Object.defineProperty(event, "request", { get() { if (!event.locals.serverFunctionMeta) { return fakeRequest; } Object.defineProperty(event, "request", origDescriptor); return origRequest; }, }); return; } } const maxContentLength_ = maxSize ? await maxSize(event) : DEFAULT_MAX_SIZE; if (maxContentLength_ == null) return; assertBodySize({ maxSize: maxContentLength_, event }); }; };