Skip to content

Hard-coded 10MB bodyLimit blocks large git pushes #474

@melvincarvalho

Description

@melvincarvalho

Symptom

```
git -c http.extraHeader="Authorization: Bearer $TOKEN"
push http://localhost:5444/public/apps/chat HEAD:gh-pages

→ error: RPC failed; HTTP 413

→ send-pack: unexpected disconnect while reading sideband packet

→ fatal: the remote end hung up unexpectedly

```

Hit this trying to install solid-chat/app on a jspod — the pack is ~30 MiB (3 years of history; tracked working tree is only ~444 KB), and JSS rejects it.

Cause

`src/server.js:187` hard-codes Fastify's `bodyLimit` to 10 MB:

```js
const fastifyOptions = {

bodyLimit: 10 * 1024 * 1024, // 10MB

};
```

This caps every request body across the server. Reasonable for normal PUT/POST, but git pushes can be much larger — especially first-push of an established repo, or merges with binary assets.

The git handler runs as a `preHandler` hook on wildcard routes (`fastify.addHook('preHandler', …)` at server.js:500), so Fastify's body-size check has already fired before any git-specific code runs. A route-level `bodyLimit` override isn't reachable here.

Proposed fix

Make `bodyLimit` configurable:

  1. `createServer({ bodyLimit })` option, default `10 * 1024 * 1024` (no behavior change).
  2. CLI flag: `--body-limit <bytes|kb|mb|gb>` (or `--max-upload-size`), parsed to bytes.
  3. Document the trade-off in `--help`: higher = bigger pushes accepted, lower = more memory-DoS resistant.

```js
bodyLimit: options.bodyLimit ?? (10 * 1024 * 1024),
```

Wrappers like jspod can then default to a more generous limit (e.g. 100 MB) for the personal-pod use case where the operator is the user.

Scope

~5 LoC in `src/server.js` + CLI arg parsing in `bin/jss.js` + a help-line update. No new dependencies. Test: existing tests pass with default; one new test pushing a >10 MB pack with raised limit.

Optional follow-up

If we want git pushes to be the only thing that can exceed the global cap, we could pre-parse the URL in a custom `contentTypeParser` and apply a different limit for `application/x-git-receive-pack-request`. More surgical, but more code. Open to either path.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions