@npio/filesystem
Version:
A free visual website editor, powered with your own SolidJS components.
78 lines (65 loc) • 2.44 kB
text/typescript
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 });
};
};