Skip to content

Body Limit Middleware

The Body Limit Middleware can limit the file size of the request body.

This middleware first uses the value of the Content-Length header in the request, if present. If it is not set, it reads the body in the stream and executes an error handler if it is larger than the specified file size.

Import

ts
import { Hono } from 'hono'
import { bodyLimit } from 'hono/body-limit'

Usage

ts
const app = new Hono()

app.post(
  '/upload',
  bodyLimit({
    maxSize: 50 * 1024, // 50kb
    onError: (c) => {
      return c.text('overflow :(', 413)
    },
  }),
  async (c) => {
    const body = await c.req.parseBody()
    if (body['file'] instanceof File) {
      console.log(`Got file sized: ${body['file'].size}`)
    }
    return c.text('pass :)')
  }
)

Options

required maxSize: number

The maximum file size of the file you want to limit. The default is 100 * 1024 - 100kb.

optional onError: OnError

The error handler to be invoked if the specified file size is exceeded.

Usage with Bun for large requests

If the Body Limit Middleware is used explicitly to allow a request body larger than the default, it might be necessary to make changes to your Bun.serve configuration accordingly. At the time of writing, Bun.serve's default request body limit is 128MiB. If you set Hono's Body Limit Middleware to a value bigger than that, your requests will still fail and, additionally, the onError handler specified in the middleware will not be called. This is because Bun.serve() will set the status code to 413 and terminate the connection before passing the request to Hono.

If you want to accept requests larger than 128MiB with Hono and Bun, you need to set the limit for Bun as well:

ts
export default {
  port: process.env['PORT'] || 3000,
  fetch: app.fetch,
  maxRequestBodySize: 1024 * 1024 * 200, // your value here
}

or, depending on your setup:

ts
Bun.serve({
  fetch(req, server) {
    return app.fetch(req, { ip: server.requestIP(req) })
  },
  maxRequestBodySize: 1024 * 1024 * 200, // your value here
})

Released under the MIT License.