UNPKG

hono

Version:

Web framework built on Web Standards

54 lines (53 loc) 1.51 kB
// src/middleware/body-limit/index.ts import { HTTPException } from "../../http-exception.js"; var ERROR_MESSAGE = "Payload Too Large"; var bodyLimit = (options) => { const onError = options.onError || (() => { const res = new Response(ERROR_MESSAGE, { status: 413 }); throw new HTTPException(413, { res }); }); const maxSize = options.maxSize; return async function bodyLimit2(c, next) { if (!c.req.raw.body) { return next(); } const hasTransferEncoding = c.req.raw.headers.has("transfer-encoding"); const hasContentLength = c.req.raw.headers.has("content-length"); if (hasContentLength && !hasTransferEncoding) { const contentLength = parseInt(c.req.raw.headers.get("content-length") || "0", 10); return contentLength > maxSize ? onError(c) : next(); } let size = 0; const chunks = []; const rawReader = c.req.raw.body.getReader(); for (; ; ) { const { done, value } = await rawReader.read(); if (done) { break; } size += value.length; if (size > maxSize) { return onError(c); } chunks.push(value); } const requestInit = { body: new ReadableStream({ start(controller) { for (const chunk of chunks) { controller.enqueue(chunk); } controller.close(); } }), duplex: "half" }; c.req.raw = new Request(c.req.raw, requestInit); return next(); }; }; export { bodyLimit };