fix(backend): restore the large-body limit on the voice route
POST /voice/extract returned 500 for any real recording. The threshold was exactly 100 kb — Express's body-parser default — which is about 20 seconds of audio, so the endpoint was unusable at its own 2-minute cap. The scoped parser was registered as a path-mounted json() stacked in front of a default one, which relied on two implicit behaviours: Express stripping the mount path, and body-parser skipping a request another parser had already handled. That coupling broke when the surrounding middleware order shifted, and it broke silently — the parser was still registered, just no longer the one that ran. Bisected by dumping the Express layer stack and confirming the raw error was `entity.too.large` with `limit: 102400`. Replaced with a single middleware that picks a parser by path. No mount-path stripping, no dependence on parser ordering. Extracted to common/body-parsers.ts so it is covered by a unit test rather than only reachable through main.ts, which createTestingModule never executes. The test is mutation-checked: forcing the default parser fails 2 of its 5 cases. It also pins that the larger limit does not leak app-wide, and that a merely similar path (/api/voice/extract/extra) does not get it. Verified against the compiled server: 300 kb now reaches /api/voice/extract, /api/auth/login still rejects it, and ordinary requests are unaffected. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
// backend/src/main.ts
|
||||
import { NestFactory } from '@nestjs/core';
|
||||
import { json, urlencoded } from 'express';
|
||||
import { urlencoded } from 'express';
|
||||
import { AppModule } from './app.module';
|
||||
import { createJsonBodyParser } from './common/body-parsers';
|
||||
import { ValidationPipe } from '@nestjs/common';
|
||||
import cookieParser from 'cookie-parser'; // 👈 Change this line!
|
||||
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
|
||||
@@ -29,12 +30,8 @@ async function bootstrap() {
|
||||
// reject a voice recording at its 100 kb default before any later middleware ran.
|
||||
const app = await NestFactory.create(AppModule, { bodyParser: false });
|
||||
|
||||
// Voice recordings are base64 JSON and pass 100 kb at roughly 20 seconds of audio.
|
||||
// Registered first and scoped to the one route: body-parser marks the request handled,
|
||||
// so the default-limit parser below skips it and every other endpoint keeps the
|
||||
// standard limit.
|
||||
app.use('/api/voice/extract', json({ limit: '10mb' }));
|
||||
app.use(json());
|
||||
// Voice needs a larger JSON limit than everything else; see body-parsers.ts.
|
||||
app.use(createJsonBodyParser());
|
||||
app.use(urlencoded({ extended: true }));
|
||||
|
||||
app.useGlobalFilters(new HttpExceptionFilter());
|
||||
|
||||
Reference in New Issue
Block a user