Forráskód Böngészése

fix req interception

Pablo Barrera Yaksic 1 éve
szülő
commit
1078752baf
3 módosított fájl, 55 hozzáadás és 29 törlés
  1. 2 1
      .eslintrc.json
  2. 39 22
      lib/index.js
  3. 14 6
      src/index.ts

+ 2 - 1
.eslintrc.json

@@ -13,6 +13,7 @@
         "@typescript-eslint/no-console": 1,
         "@typescript-eslint/explicit-function-return-type": 1,
         "import/no-unresolved": 1,
-        "quotes": ["error", "double"]
+        "@typescript-eslint/prefer-nullish-coalescing": 1,
+        "strictNullChecks": 1
     }
 }

+ 39 - 22
lib/index.js

@@ -2,17 +2,18 @@
 Object.defineProperty(exports, "__esModule", { value: true });
 exports.PRAS = void 0;
 class PRAS {
-    getPRASResultObject(statusCode, status, message, data, code, extra) {
+    getPRASResultObject(statusCode = 200, status = "OK", message = "", data = null, code = "UNKNOWN_CODE", extra = null) {
         return {
-            statusCode: statusCode || 200,
-            status: status || "OK",
-            message: message || "",
-            data: data || null,
-            code: code || "UNKNOWN_CODE",
-            extra: extra || null,
+            statusCode,
+            status,
+            message,
+            data,
+            code,
+            extra,
         };
     }
     responseMiddleware() {
+        // eslint-disable-next-line @typescript-eslint/ban-types
         return (req, res, next) => {
             res.pras = {
                 ok: (message, data, code, extra) => {
@@ -50,22 +51,38 @@ class PRAS {
                     res.json(this.getPRASResultObject(statusCode, status, message, data, code, extra));
                 },
             };
-            const originalSend = res.send;
-            res.send = (body) => {
-                if (typeof body === "string") {
-                    body = JSON.parse(body);
+            const rawHeaders = req.rawHeaders;
+            let foundHeaderIndex = -1;
+            for (let i = 0; i < rawHeaders.length; i++) {
+                if (rawHeaders[i] === "Accept") {
+                    foundHeaderIndex = i;
+                    break;
                 }
-                if (typeof body === "string") {
-                    body = { data: body };
-                }
-                else if (!body.hasOwnProperty("data")) {
-                    body = { data: body };
-                }
-                const prasBody = this.getPRASResultObject(body.statusCode, body.status, body.message, body.data, body.code, body.extra);
-                res.status(Number(prasBody.statusCode) || 200);
-                delete prasBody.statusCode;
-                return originalSend.call(res, JSON.stringify(prasBody));
-            };
+            }
+            if (rawHeaders.hasOwnProperty("Accept") &&
+                rawHeaders[foundHeaderIndex].includes("application/json")) {
+                const send = res.send;
+                res.send = (body) => {
+                    try {
+                        if (typeof body === "string") {
+                            body = JSON.parse(body);
+                        }
+                        if (typeof body === "string") {
+                            body = { data: body };
+                        }
+                        else if (!body.hasOwnProperty("data")) {
+                            body = { data: body };
+                        }
+                        const prasBody = this.getPRASResultObject(body.statusCode, body.status, body.message, body.data, body.code, body.extra);
+                        res.status(prasBody.statusCode || 200);
+                        delete prasBody.statusCode;
+                        return send.call(res, JSON.stringify(prasBody));
+                    }
+                    catch (err) {
+                        return send.call(res, body);
+                    }
+                };
+            }
             next();
         };
     }

+ 14 - 6
src/index.ts

@@ -1,4 +1,4 @@
-import { Request, Response } from "express";
+import type { Request, Response } from "express";
 
 interface PRASResponse extends Response {
   pras: {
@@ -29,10 +29,10 @@ export class PRAS {
     statusCode = 200,
     status = "OK",
     message = "",
-    data = null,
+    data: any = null,
     code = "UNKNOWN_CODE",
-    extra = null
-  ) {
+    extra: any = null
+  ): any {
     return {
       statusCode,
       status,
@@ -44,6 +44,7 @@ export class PRAS {
   }
 
   public responseMiddleware() {
+    // eslint-disable-next-line @typescript-eslint/ban-types
     return (req: Request, res: PRASResponse, next: Function): void => {
       res.pras = {
         ok: (message, data, code, extra) => {
@@ -103,10 +104,17 @@ export class PRAS {
         },
       };
 
-      const rawHeaders = req.rawHeaders;
+      const rawHeaders: string[] = req.rawHeaders;
+      let foundHeaderIndex = -1;
+      for (let i = 0; i < rawHeaders.length; i++) {
+        if (rawHeaders[i] === "Accept") {
+          foundHeaderIndex = i;
+          break;
+        }
+      }
       if (
         rawHeaders.hasOwnProperty("Accept") &&
-        /application\/json/.test(rawHeaders.Accept)
+        rawHeaders[foundHeaderIndex].includes("application/json")
       ) {
         const send = res.send;
         res.send = (body) => {