From 3f2d84bf622528bb0a41ed724c7f7018764d05eb Mon Sep 17 00:00:00 2001 From: lebaudantoine Date: Wed, 21 May 2025 11:49:53 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B(y-provider)=20increase=20JSON=20si?= =?UTF-8?q?ze=20limits=20for=20transcription=20conversion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: - Default Express JSON parser limit (100kb) is insufficient for larger transcription files - 2-hour audio transcriptions slightly exceed the 100kb limit, causing request failures Solution: - Implemented custom middleware to apply different JSON parser configurations based on route - Applied 500kb limit specifically for transcription conversion endpoints - Maintained default limits for all other routes to preserve security Technical notes: - Could not find a built-in Express solution to specify parser config per route - Custom middleware conditionally applies the appropriate parser configuration --- CHANGELOG.md | 1 + .../y-provider/__tests__/server.test.ts | 32 +++++++++++++++++++ .../y-provider/src/servers/appServer.ts | 8 ++++- 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d70ef583..1b0a03a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ and this project adheres to - ✅(frontend) Improve tests coverage - ⬆️(docker) upgrade backend image to python 3.13 #973 - ⬆️(docker) upgrade node images to alpine 3.21 +- 🐛(y-provider) increase JSON size limits for transcription conversion ### Removed diff --git a/src/frontend/servers/y-provider/__tests__/server.test.ts b/src/frontend/servers/y-provider/__tests__/server.test.ts index 2f048bff..0c4ed30a 100644 --- a/src/frontend/servers/y-provider/__tests__/server.test.ts +++ b/src/frontend/servers/y-provider/__tests__/server.test.ts @@ -1,5 +1,7 @@ import request from 'supertest'; +import { routes } from '@/routes'; + const port = 5557; const origin = 'http://localhost:3000'; @@ -36,4 +38,34 @@ describe('Server Tests', () => { expect(response.body.error).toBe('Forbidden'); }); }); + + it('should allow JSON payloads up to 500kb for the CONVERT_MARKDOWN route', async () => { + const largePayload = 'a'.repeat(400 * 1024); // 400kb payload + const response = await request(app) + .post(routes.CONVERT_MARKDOWN) + .send({ data: largePayload }) + .set('Content-Type', 'application/json'); + + expect(response.status).not.toBe(413); + }); + + it('should reject JSON payloads larger than 500kb for the CONVERT_MARKDOWN route', async () => { + const oversizedPayload = 'a'.repeat(501 * 1024); // 501kb payload + const response = await request(app) + .post(routes.CONVERT_MARKDOWN) + .send({ data: oversizedPayload }) + .set('Content-Type', 'application/json'); + + expect(response.status).toBe(413); + }); + + it('should use the default JSON limit for other routes', async () => { + const largePayload = 'a'.repeat(150 * 1024); + const response = await request(app) + .post('/some-other-route') + .send({ data: largePayload }) + .set('Content-Type', 'application/json'); + + expect(response.status).toBe(413); + }); }); diff --git a/src/frontend/servers/y-provider/src/servers/appServer.ts b/src/frontend/servers/y-provider/src/servers/appServer.ts index 00532e03..5c035db7 100644 --- a/src/frontend/servers/y-provider/src/servers/appServer.ts +++ b/src/frontend/servers/y-provider/src/servers/appServer.ts @@ -21,7 +21,13 @@ import { logger } from '../utils'; */ export const initServer = () => { const { app } = expressWebsockets(express()); - app.use(express.json()); + app.use((req, res, next) => { + if (req.path === routes.CONVERT_MARKDOWN) { + // Large transcript files are bigger than the default '100kb' limit + return express.json({ limit: '500kb' })(req, res, next); + } + express.json()(req, res, next); + }); app.use(corsMiddleware); /**