@belmonddev/catch-request-express-middleware 1.2.5 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/index.js +34 -53
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -14,6 +14,9 @@ const override = (module, attr, fn) => {
14
14
  module[attr] = wrapper;
15
15
  };
16
16
 
17
+ export const getHeaderValue = (headers, key) =>
18
+ Object.entries(headers).find(([k]) => k.toLowerCase() === key)?.[1];
19
+
17
20
  const catchHttpResponse = (reqObject, responseCb) => {
18
21
  override(reqObject, 'emit', (result, eventName, response) => {
19
22
  const chunks = [];
@@ -29,26 +32,17 @@ const catchHttpResponse = (reqObject, responseCb) => {
29
32
  statusCode: response.statusCode,
30
33
  statusMessage: response.statusMessage,
31
34
  };
32
- if (
33
- ['gzip', 'deflate'].indexOf(
34
- response.headers['content-encoding']
35
- ) !== -1
36
- ) {
35
+ const contentEncoding = getHeaderValue(
36
+ response.headers,
37
+ 'content-encoding'
38
+ );
39
+ if (['gzip', 'deflate'].indexOf(contentEncoding) !== -1) {
37
40
  const buffer = Buffer.concat(chunks);
38
41
  const zlibFunc =
39
- response.headers['content-encoding'] === 'gzip'
40
- ? zlib.gunzip
41
- : zlib.inflate;
42
+ contentEncoding === 'gzip' ? zlib.gunzip : zlib.inflate;
42
43
  zlibFunc(buffer, (_, decoded) => {
43
44
  const stringBody = decoded.toString('utf8');
44
- const request = {
45
- ...responseObj,
46
- body: /application\/json;?.*?$/.test(
47
- response.headers['content-type']
48
- )
49
- ? JSON.parse(stringBody)
50
- : stringBody,
51
- };
45
+ const request = { ...responseObj, body: stringBody };
52
46
  if (responseCb?.then) {
53
47
  responseCb.then(() => request);
54
48
  } else {
@@ -57,14 +51,7 @@ const catchHttpResponse = (reqObject, responseCb) => {
57
51
  });
58
52
  } else {
59
53
  const stringBody = chunks.map((c) => c.toString('utf8')).join('');
60
- const request = {
61
- ...responseObj,
62
- body: /application\/json;?.*?$/.test(
63
- response.headers['content-type']
64
- )
65
- ? JSON.parse(stringBody)
66
- : stringBody,
67
- };
54
+ const request = { ...responseObj, body: stringBody };
68
55
  if (responseCb?.then) {
69
56
  responseCb.then(() => request);
70
57
  } else {
@@ -79,7 +66,8 @@ const catchHttpResponse = (reqObject, responseCb) => {
79
66
 
80
67
  const overrideHttpModule = (httpModule, requestSentCb) => {
81
68
  override(httpModule, 'request', (reqObject, request) => {
82
- const requestHasBody = request.headers?.['Content-Length']?.[0] > 0;
69
+ const contentLength = getHeaderValue(request.headers, 'content-length');
70
+ const requestHasBody = !!contentLength;
83
71
  const params = Object.fromEntries(
84
72
  new URLSearchParams(request.query).entries()
85
73
  );
@@ -90,11 +78,7 @@ const overrideHttpModule = (httpModule, requestSentCb) => {
90
78
  const responseCb = requestSentCb({
91
79
  ...request,
92
80
  params,
93
- body: /application\/json;?.*?$/.test(
94
- request.headers?.['Content-Type']?.[0]
95
- )
96
- ? JSON.parse(body)
97
- : body,
81
+ body,
98
82
  });
99
83
  if (responseCb) {
100
84
  catchHttpResponse(reqObject, responseCb);
@@ -102,26 +86,19 @@ const overrideHttpModule = (httpModule, requestSentCb) => {
102
86
  });
103
87
  } else {
104
88
  const responseCb = requestSentCb({ ...request, params, body: null });
105
- catchHttpResponse(reqObject, responseCb);
89
+ if (responseCb) {
90
+ catchHttpResponse(reqObject, responseCb);
91
+ }
106
92
  }
107
93
  });
108
94
  };
109
95
 
110
96
  const callResponseCb = (responseCb, res) => {
111
- let body;
112
- try {
113
- body = /application\/json;?.*?$/.test(res.getHeaders()['content-type'])
114
- ? JSON.parse(res.bodyWritten)
115
- : res.bodyWritten;
116
- } catch (e) {
117
- body = res.bodyWritten;
118
- }
119
-
120
97
  const response = {
121
98
  headers: res.getHeaders(),
122
99
  statusCode: res.statusCode,
123
100
  statusMessage: res.statusMessage,
124
- body,
101
+ body: res.bodyWritten,
125
102
  };
126
103
  if (responseCb?.then) {
127
104
  responseCb.then(() => response);
@@ -130,7 +107,7 @@ const callResponseCb = (responseCb, res) => {
130
107
  }
131
108
  };
132
109
 
133
- const callReceivedCbs = (req, res, requestReceivedCb) => {
110
+ const callReceivedCbs = (req, res, requestReceivedCb, body) => {
134
111
  const responseCb = requestReceivedCb({
135
112
  originalRequest: req,
136
113
  headers: req.headers,
@@ -139,7 +116,7 @@ const callReceivedCbs = (req, res, requestReceivedCb) => {
139
116
  pathname: req._parsedUrl.pathname,
140
117
  params: req.params,
141
118
  query: req.query,
142
- body: req.body,
119
+ body,
143
120
  });
144
121
 
145
122
  if (responseCb) {
@@ -171,17 +148,21 @@ const catchExpressReceivedRequest = (req, res, requestReceivedCb) => {
171
148
  }
172
149
  });
173
150
 
174
- if (req.headers['content-type'] !== 'application/json') {
175
- let body = '';
176
- req.on('data', function (data) {
177
- body += data;
178
- });
179
- req.on('end', function () {
180
- req.body = body;
181
- callReceivedCbs(req, res, requestReceivedCb);
182
- });
151
+ if (req.body !== undefined) {
152
+ callReceivedCbs(req, res, requestReceivedCb, req.body);
183
153
  } else {
184
- callReceivedCbs(req, res, requestReceivedCb);
154
+ const contentLength = getHeaderValue(req.headers, 'content-length');
155
+ if (contentLength) {
156
+ let body = '';
157
+ req.on('data', function (data) {
158
+ body += data;
159
+ });
160
+ req.on('end', function () {
161
+ callReceivedCbs(req, res, requestReceivedCb, body);
162
+ });
163
+ } else {
164
+ callReceivedCbs(req, res, requestReceivedCb, '');
165
+ }
185
166
  }
186
167
  };
187
168
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@belmonddev/catch-request-express-middleware",
3
- "version": "1.2.5",
3
+ "version": "2.0.0",
4
4
  "main": "index.js",
5
5
  "scripts": {
6
6
  "start": "nodemon -L --experimental-specifier-resolution=node ./src/index.js"