From 05f3cbfbc9b8d801252e19ad4d033bce90404ecd Mon Sep 17 00:00:00 2001 From: nitish-egov <137176807+nitish-egov@users.noreply.github.com> Date: Wed, 18 Dec 2024 18:03:04 +0530 Subject: [PATCH] added gzip handler in middleware --- .../project-factory/src/server/app.ts | 17 ++++++-- .../src/server/utils/gzipHandler.ts | 41 +++++++++++++++++++ .../utils/middlewares/requestMiddleware.ts | 8 ++-- 3 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 health-services/project-factory/src/server/utils/gzipHandler.ts diff --git a/health-services/project-factory/src/server/app.ts b/health-services/project-factory/src/server/app.ts index f662b76d104..c1ca2179a3b 100644 --- a/health-services/project-factory/src/server/app.ts +++ b/health-services/project-factory/src/server/app.ts @@ -11,6 +11,7 @@ import { tracingMiddleware } from "./tracing"; import { createProxyMiddleware } from "http-proxy-middleware"; import * as v8 from "v8"; import { logger } from "./utils/logger"; +import { handleGzipRequest } from "./utils/gzipHandler"; const printMemoryInMB = (memoryInBytes: number) => { const memoryInMB = memoryInBytes / (1024 * 1024); // Convert bytes to MB @@ -41,16 +42,24 @@ class App { } private initializeMiddlewares() { - this.app.use( - bodyParser.json({ limit: config.app.incomingRequestPayloadLimit }) - ); + this.app.use((req, res, next) => { + const contentType = req.headers["content-type"]; + + if (contentType === "application/gzip") { + return handleGzipRequest(req, res, next); + } + + return bodyParser.json({ limit: config.app.incomingRequestPayloadLimit })(req, res, next); + }); + + this.app.use( bodyParser.urlencoded({ limit: config.app.incomingRequestPayloadLimit, extended: true, }) ); - this.app.use(bodyParser.json()); + // this.app.use(bodyParser.json()); this.app.use(tracingMiddleware); this.app.use(requestMiddleware); this.app.use(errorLogger); diff --git a/health-services/project-factory/src/server/utils/gzipHandler.ts b/health-services/project-factory/src/server/utils/gzipHandler.ts new file mode 100644 index 00000000000..5b40ce6a0bb --- /dev/null +++ b/health-services/project-factory/src/server/utils/gzipHandler.ts @@ -0,0 +1,41 @@ +import zlib from "zlib"; +import { Request, Response, NextFunction } from "express"; +import { logger } from "./logger"; + +export const handleGzipRequest = ( + req: Request, + res: Response, + next: NextFunction +) => { + const buffers: Buffer[] = []; + + req.on("data", (chunk) => buffers.push(chunk)); + req.on("end", () => { + try { + const gzipBuffer = Buffer.concat(buffers); + + // Decompress the Gzip data + zlib.gunzip(gzipBuffer, (err, decompressedBuffer) => { + if (err) { + logger.error("Error decompressing Gzip file:", err); + res.status(500).send("Invalid Gzip file"); + return; + } + + try { + // Convert the decompressed buffer to string and parse as JSON + const jsonData = decompressedBuffer.toString(); + const parsedData = JSON.parse(jsonData); + req.body = parsedData; // Attach parsed data to the request body + next(); // Proceed to next middleware + } catch (parseError) { + logger.error("Error parsing JSON data:", parseError); + res.status(500).send("Invalid JSON in Gzip content"); + } + }); + } catch (err) { + logger.error("Error processing Gzip content:", err); + res.status(500).send("Invalid Gzip content"); + } + }); +}; \ No newline at end of file diff --git a/health-services/project-factory/src/server/utils/middlewares/requestMiddleware.ts b/health-services/project-factory/src/server/utils/middlewares/requestMiddleware.ts index a8bfd34a330..5c5c1eb32be 100644 --- a/health-services/project-factory/src/server/utils/middlewares/requestMiddleware.ts +++ b/health-services/project-factory/src/server/utils/middlewares/requestMiddleware.ts @@ -18,9 +18,9 @@ const requestMiddleware = (req: Request, res: Response, next: NextFunction) => { logger.info(`RECEIVED A HTTP REQUEST :: URI :: ${req.url}`); // Check if the content type is 'application/json' const contentType = req.headers['content-type']; - if (!contentType || !contentType.split(';').map(part => part.trim()).includes('application/json')) { - // If content type is not 'application/json', throw Unsupported Media Type error - let e: any = new Error("Unsupported Media Type: Content-Type should be 'application/json'"); + if (!contentType || !contentType.split(';').map(part => part.trim()).includes('application/json') && !contentType.split(';').map(part => part.trim()).includes('application/gzip')) { + // If content type is not 'application/json' or 'application/gzip', throw Unsupported Media Type error + let e: any = new Error("Unsupported Media Type: Content-Type should be 'application/json' or 'application/gzip'"); e = Object.assign(e, { status: 415, code: "UNSUPPORTED_MEDIA_TYPE" }); errorResponder(e, req, res, 415) return; @@ -43,4 +43,4 @@ const requestMiddleware = (req: Request, res: Response, next: NextFunction) => { } }; -export default requestMiddleware; // Exporting the requestMiddleware function for use in Express middleware chain +export default requestMiddleware; // Exporting the requestMiddleware function for use in Express middleware chain \ No newline at end of file