Skip to content

fix: return 400 for empty JSON body#130

Open
ping-maxwell wants to merge 1 commit intobetter-auth:mainfrom
ping-maxwell:fix/return-400-on-empty-json-body
Open

fix: return 400 for empty JSON body#130
ping-maxwell wants to merge 1 commit intobetter-auth:mainfrom
ping-maxwell:fix/return-400-on-empty-json-body

Conversation

@ping-maxwell
Copy link
Copy Markdown
Member

@ping-maxwell ping-maxwell commented Apr 22, 2026

closes better-auth/better-auth#9295

The getBody() function calls request.json() unconditionally when the Content-Type header matches application/json:

if (jsonContentTypeRegex.test(normalizedContentType)) return await request.json();

When the body is empty or not valid JSON, request.json() throws a native SyntaxError. Since SyntaxError is not an instance of APIError, the router's catch block at router.mjs:84-99 falls through to the generic 500 handler:

console.error(`# SERVER_ERROR: `, error);
return new Response(null, { status: 500, statusText: "Internal Server Error" });

This affects all POST endpoints that don't define a body schema - because without body or disableBody: true, better-call still attempts JSON parsing.

The `getBody()` function calls `request.json()` unconditionally when the Content-Type header matches `application/json`:

```ts
if (jsonContentTypeRegex.test(normalizedContentType)) return await request.json();
```
When the body is empty or not valid JSON, request.json() throws a native SyntaxError. Since SyntaxError is not an instance of APIError, the router's catch block at router.mjs:84-99 falls through to the generic 500 handler:

console.error(`# SERVER_ERROR: `, error);
return new Response(null, { status: 500, statusText: "Internal Server Error" });
This affects all POST endpoints that don't define a body schema — because without body or disableBody: true, better-call still attempts JSON parsing.
@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new Bot commented Apr 22, 2026

Open in StackBlitz

npm i https://pkg.pr.new/better-call@130

commit: e6a6a1b

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

POST /sign-out with Content-Type: application/json + empty or malformed body returns HTTP 500 instead of 400

1 participant