feat: handle plain text payloads

This commit is contained in:
Mohamed Marrouchi 2025-02-03 18:42:03 +01:00
parent e8f031da02
commit 8955ec38f0

View File

@ -8,6 +8,7 @@
import { BadRequestException, Injectable } from '@nestjs/common'; import { BadRequestException, Injectable } from '@nestjs/common';
import { EventEmitter2, OnEvent } from '@nestjs/event-emitter'; import { EventEmitter2, OnEvent } from '@nestjs/event-emitter';
import bodyParser from 'body-parser';
import { NextFunction, Request, Response } from 'express'; import { NextFunction, Request, Response } from 'express';
import multer, { diskStorage, memoryStorage } from 'multer'; import multer, { diskStorage, memoryStorage } from 'multer';
import { Socket } from 'socket.io'; import { Socket } from 'socket.io';
@ -1302,33 +1303,47 @@ export default abstract class BaseWebChannelHandler<
} }
/** /**
* Web channel middleware to handle multipart uploads (Long Pooling only) * Web channel middleware
*
* @param req Express Request * @param req Express Request
* @param res Express Response * @param res Express Response
* @param next Callback function * @param next Callback function
*/ */
async middleware(req: Request, res: Response, next: NextFunction) { async middleware(req: Request, res: Response, next: NextFunction) {
if ( if (!this.isSocketRequest(req)) {
!this.isSocketRequest(req) && if (req.headers['content-type']?.includes('multipart/form-data')) {
req.headers['content-type']?.includes('multipart/form-data') // Handle multipart uploads (Long Pooling only)
) { const upload = multer({
const upload = multer({ limits: {
limits: { fileSize: config.parameters.maxUploadSize,
fileSize: config.parameters.maxUploadSize, },
}, storage: (() => {
storage: (() => { if (config.parameters.storageMode === 'memory') {
if (config.parameters.storageMode === 'memory') { return memoryStorage();
return memoryStorage(); } else {
} else { return diskStorage({});
return diskStorage({}); }
} })(),
})(), }).single('file'); // 'file' is the field name in the form
}).single('file'); // 'file' is the field name in the form
upload(req, res, next); return upload(req, res, next);
} else { } else if (req.headers['content-type']?.includes('text/plain')) {
// Do nothing // Handle plain text payloads as JSON (retro-compability)
next(); const textParser = bodyParser.text({ type: 'text/plain' });
return textParser(req, res, () => {
try {
req.body =
typeof req.body === 'string' ? JSON.parse(req.body) : req.body;
next();
} catch (err) {
next(err);
}
});
}
} }
// Do nothing
next();
} }
} }