@requestly/requestly-proxy 1.1.23 → 1.2.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.
@@ -22,14 +22,14 @@ const createHarQueryStrings = (query_params) => {
22
22
  query_value.forEach(val => {
23
23
  res.push({
24
24
  "name": query,
25
- "value": val
25
+ "value": val !== null && val !== void 0 ? val : ""
26
26
  });
27
27
  });
28
28
  }
29
29
  else {
30
30
  res.push({
31
31
  "name": query,
32
- "value": query_value
32
+ "value": query_value !== null && query_value !== void 0 ? query_value : ""
33
33
  });
34
34
  }
35
35
  });
@@ -49,13 +49,8 @@ const bodyParser = (contentTypeHeader, buffer) => {
49
49
  };
50
50
  exports.bodyParser = bodyParser;
51
51
  const getContentType = (contentTypeHeader) => {
52
- if (!contentTypeHeader) {
53
- return null;
54
- }
55
- let contentType = null;
56
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type
57
- contentType = contentTypeHeader.split(";")[0];
58
- return contentType;
52
+ var _a;
53
+ return (_a = contentTypeHeader === null || contentTypeHeader === void 0 ? void 0 : contentTypeHeader.split(";")[0]) !== null && _a !== void 0 ? _a : null;
59
54
  };
60
55
  exports.getContentType = getContentType;
61
56
  const parseJsonBody = (data) => {
@@ -117,6 +117,7 @@ const modify_response_using_code = (action, ctx) => __awaiter(void 0, void 0, vo
117
117
  responseType: (_c = (_b = ctx === null || ctx === void 0 ? void 0 : ctx.serverToProxyResponse) === null || _b === void 0 ? void 0 : _b.headers) === null || _c === void 0 ? void 0 : _c["content-type"],
118
118
  requestHeaders: ctx.clientToProxyRequest.headers,
119
119
  requestData: (0, http_helpers_1.parseJsonBody)((_e = (_d = ctx.rq) === null || _d === void 0 ? void 0 : _d.final_request) === null || _e === void 0 ? void 0 : _e.body) || null,
120
+ statusCode: ctx.serverToProxyResponse.statusCode,
120
121
  };
121
122
  try {
122
123
  args.responseJSON = JSON.parse(args.response);
@@ -1,5 +1,6 @@
1
1
  export = CA;
2
2
  declare class CA {
3
+ onCARegenerated(callback: any): void;
3
4
  randomSerialNumber(): string;
4
5
  generateCA(callback: any): void;
5
6
  loadCA(callback: any): void;
@@ -127,7 +127,12 @@ var ServerExtensions = [
127
127
  name: "subjectKeyIdentifier",
128
128
  },
129
129
  ];
130
- var CA = function () { };
130
+ var CA = function () {
131
+ this.onCARegenerationCallbacks = [];
132
+ };
133
+ CA.prototype.onCARegenerated = function (callback) {
134
+ this.onCARegenerationCallbacks.push(callback);
135
+ };
131
136
  CA.create = function (caFolder, callback) {
132
137
  var ca = new CA();
133
138
  ca.baseCAFolder = caFolder;
@@ -140,7 +145,19 @@ CA.create = function (caFolder, callback) {
140
145
  function (callback) {
141
146
  FS.exists(path.join(ca.certsFolder, "ca.pem"), function (exists) {
142
147
  if (exists) {
143
- ca.loadCA(callback);
148
+ // ca.loadCA(callback);
149
+ ca.loadCA(function (err) {
150
+ if (err) {
151
+ return callback(err);
152
+ }
153
+ if (ca.CAcert.validity.notAfter < new Date()) {
154
+ // generate the certificate again since it is expired
155
+ ca.generateCA(callback);
156
+ }
157
+ else {
158
+ return callback();
159
+ }
160
+ });
144
161
  }
145
162
  else {
146
163
  ca.generateCA(callback);
@@ -153,6 +170,7 @@ CA.create = function (caFolder, callback) {
153
170
  }
154
171
  return callback(null, ca);
155
172
  });
173
+ return ca;
156
174
  };
157
175
  CA.prototype.randomSerialNumber = function () {
158
176
  // generate random 16 bytes hex string
@@ -182,12 +200,25 @@ CA.prototype.generateCA = function (callback) {
182
200
  cert.sign(keys.privateKey, Forge.md.sha256.create());
183
201
  self.CAcert = cert;
184
202
  self.CAkeys = keys;
203
+ // delete all the keys and certs in the folders, first
204
+ // so that previously generated keys and certs are not used
205
+ async.parallel([
206
+ ...FS.readdirSync(self.certsFolder).map((file) => {
207
+ return () => FS.unlinkSync(path.join(self.certsFolder, file));
208
+ }),
209
+ ...FS.readdirSync(self.keysFolder).map((file) => {
210
+ return () => FS.unlinkSync(path.join(self.keysFolder, file));
211
+ }),
212
+ ], (err) => {
213
+ console.debug("Error while deleting existing certs during CA regeneration: ", err);
214
+ });
185
215
  async.parallel([
186
216
  FS.writeFile.bind(null, path.join(self.certsFolder, "ca.pem"), pki.certificateToPem(cert)),
187
217
  FS.writeFile.bind(null, path.join(self.keysFolder, "ca.private.key"), pki.privateKeyToPem(keys.privateKey)),
188
218
  FS.writeFile.bind(null, path.join(self.keysFolder, "ca.public.key"), pki.publicKeyToPem(keys.publicKey)),
189
219
  ], callback);
190
- });
220
+ this.onCARegenerationCallbacks.forEach((callback) => callback(path.join(self.certsFolder, "ca.pem")));
221
+ }.bind(self));
191
222
  };
192
223
  CA.prototype.loadCA = function (callback) {
193
224
  var self = this;
@@ -16,7 +16,7 @@ declare var WebSocket: {
16
16
  };
17
17
  declare var url: any;
18
18
  declare var semaphore: any;
19
- declare var ca: any;
19
+ declare var CA: any;
20
20
  declare var Sentry: any;
21
21
  declare const checkInvalidHeaderChar: any;
22
22
  declare const debug: any;
@@ -12,7 +12,7 @@ var events = require("events");
12
12
  var WebSocket = require("ws");
13
13
  var url = require("url");
14
14
  var semaphore = require("semaphore");
15
- var ca = require("./ca.js");
15
+ var CA = require("./ca.js");
16
16
  var Sentry = require("@sentry/browser");
17
17
  const checkInvalidHeaderChar = require("../custom/utils/checkInvalidHeaderChar");
18
18
  const debug = require("debug")("http-mitm-proxy");
@@ -38,6 +38,7 @@ var Proxy = function () {
38
38
  this.onResponseDataHandlers = [];
39
39
  this.onResponseEndHandlers = [];
40
40
  this.responseContentPotentiallyModified = false;
41
+ this.onCARegeneratedHandlers = [];
41
42
  };
42
43
  module.exports.Proxy = Proxy;
43
44
  const PROXY_HANDLER_TYPE = {
@@ -74,7 +75,7 @@ Proxy.prototype.listen = function (options, callback = (e) => { }) {
74
75
  this.httpsPort = this.forceSNI ? options.httpsPort : undefined;
75
76
  this.sslCaDir =
76
77
  options.sslCaDir || path.resolve(process.cwd(), ".http-mitm-proxy");
77
- ca.create(this.sslCaDir, function (err, ca) {
78
+ this.ca = CA.create(this.sslCaDir, function (err, ca) {
78
79
  if (err) {
79
80
  return callback(err);
80
81
  }
@@ -115,7 +116,8 @@ Proxy.prototype.listen = function (options, callback = (e) => { }) {
115
116
  callback();
116
117
  });
117
118
  }
118
- });
119
+ }.bind(this));
120
+ this.ca.onCARegenerated(this._onCARegenerated.bind(this));
119
121
  return this;
120
122
  };
121
123
  Proxy.prototype._createHttpsServer = function (options, callback) {
@@ -561,6 +563,12 @@ Proxy.prototype.onCertificateMissing = function (ctx, files, callback) {
561
563
  });
562
564
  return this;
563
565
  };
566
+ Proxy.prototype.onCARegenerated = function (fn) {
567
+ this.onCARegeneratedHandlers.push(fn);
568
+ };
569
+ Proxy.prototype._onCARegenerated = function (pathToNewCA) {
570
+ this.onCARegeneratedHandlers.forEach(fn => fn(pathToNewCA));
571
+ };
564
572
  Proxy.prototype._onError = function (kind, ctx, err) {
565
573
  if (ctx) {
566
574
  ctx.currentHandler = PROXY_HANDLER_TYPE.ON_ERROR;
package/dist/rq-proxy.js CHANGED
@@ -13,6 +13,9 @@ class RQProxy {
13
13
  console.log(proxyConfig);
14
14
  // @ts-ignore
15
15
  this.proxy = new proxy_1.default();
16
+ if (proxyConfig.onCARegenerated) {
17
+ this.proxy.onCARegenerated(proxyConfig.onCARegenerated);
18
+ }
16
19
  // console.log(this.proxy);
17
20
  this.proxy.listen({
18
21
  port: proxyConfig.port,
@@ -1,7 +1,9 @@
1
1
  export interface ProxyConfig {
2
+ [x: string]: any;
2
3
  port: Number;
3
4
  certPath: String;
4
5
  rootCertPath: String;
6
+ onCARegenerated?: Function;
5
7
  }
6
8
  export interface Rule {
7
9
  id: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@requestly/requestly-proxy",
3
- "version": "1.1.23",
3
+ "version": "1.2.0",
4
4
  "description": "Proxy that gives superpowers to all the Requestly clients",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {