davechri 1.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.

Potentially problematic release.


This version of davechri might be problematic. Click here for more details.

Files changed (113) hide show
  1. package/README.md +277 -0
  2. package/bin/proxyall +5 -0
  3. package/build/app.js +89 -0
  4. package/build/app.js.map +1 -0
  5. package/build/common/Message.js +34 -0
  6. package/build/common/Message.js.map +1 -0
  7. package/build/common/ProxyConfig.js +27 -0
  8. package/build/common/ProxyConfig.js.map +1 -0
  9. package/build/node-http-mitm-proxy/.gitattributes +2 -0
  10. package/build/node-http-mitm-proxy/.travis.yml +10 -0
  11. package/build/node-http-mitm-proxy/README.md +539 -0
  12. package/build/node-http-mitm-proxy/bin/mitm-proxy.js +36 -0
  13. package/build/node-http-mitm-proxy/examples/forwardHttps.js +62 -0
  14. package/build/node-http-mitm-proxy/examples/modifyGoogle.js +44 -0
  15. package/build/node-http-mitm-proxy/examples/onCertificateMissing.js +30 -0
  16. package/build/node-http-mitm-proxy/examples/onCertificateRequired.js +23 -0
  17. package/build/node-http-mitm-proxy/examples/preventRequest.js +20 -0
  18. package/build/node-http-mitm-proxy/examples/processFullResponseBody.js +36 -0
  19. package/build/node-http-mitm-proxy/examples/removeProxyToServerContentLength.js +17 -0
  20. package/build/node-http-mitm-proxy/examples/websocket.js +31 -0
  21. package/build/node-http-mitm-proxy/examples/wildcard.js +17 -0
  22. package/build/node-http-mitm-proxy/index.d.ts +233 -0
  23. package/build/node-http-mitm-proxy/index.js +3 -0
  24. package/build/node-http-mitm-proxy/lib/ca.js +245 -0
  25. package/build/node-http-mitm-proxy/lib/middleware/gunzip.js +19 -0
  26. package/build/node-http-mitm-proxy/lib/middleware/wildcard.js +22 -0
  27. package/build/node-http-mitm-proxy/lib/proxy.js +1137 -0
  28. package/build/node-http-mitm-proxy/package-lock.json +1406 -0
  29. package/build/node-http-mitm-proxy/package.json +45 -0
  30. package/build/node-http-mitm-proxy/test/01_proxy.js +449 -0
  31. package/build/node-http-mitm-proxy/test/www/1024.bin +64 -0
  32. package/build/node-http-mitm-proxy/test/wwwA/1024.bin +64 -0
  33. package/build/node-http-mitm-proxy/test/wwwA/example.com.html +8 -0
  34. package/build/node-http-mitm-proxy/test/wwwA/index.html +0 -0
  35. package/build/node-http-mitm-proxy/test/wwwB/1024.bin +64 -0
  36. package/build/node-http-mitm-proxy/test/wwwB/index.html +0 -0
  37. package/build/private/keys/README.md +2 -0
  38. package/build/private/keys/server.crt +20 -0
  39. package/build/private/keys/server.key +28 -0
  40. package/build/private/keys/ssl.conf +25 -0
  41. package/build/server/src/Global.js +38 -0
  42. package/build/server/src/Global.js.map +1 -0
  43. package/build/server/src/Http2Proxy.js +197 -0
  44. package/build/server/src/Http2Proxy.js.map +1 -0
  45. package/build/server/src/HttpMessage.js +99 -0
  46. package/build/server/src/HttpMessage.js.map +1 -0
  47. package/build/server/src/HttpProxy.js +196 -0
  48. package/build/server/src/HttpProxy.js.map +1 -0
  49. package/build/server/src/HttpsProxy.js +110 -0
  50. package/build/server/src/HttpsProxy.js.map +1 -0
  51. package/build/server/src/LogProxy.js +115 -0
  52. package/build/server/src/LogProxy.js.map +1 -0
  53. package/build/server/src/Paths.js +28 -0
  54. package/build/server/src/Paths.js.map +1 -0
  55. package/build/server/src/Ping.js +21 -0
  56. package/build/server/src/Ping.js.map +1 -0
  57. package/build/server/src/ProxyAllApp.js +70 -0
  58. package/build/server/src/ProxyAllApp.js.map +1 -0
  59. package/build/server/src/Resend.js +89 -0
  60. package/build/server/src/Resend.js.map +1 -0
  61. package/build/server/src/SocketIoManager.js +312 -0
  62. package/build/server/src/SocketIoManager.js.map +1 -0
  63. package/build/server/src/SocketMessage.js +68 -0
  64. package/build/server/src/SocketMessage.js.map +1 -0
  65. package/build/server/src/TcpProxy.js +202 -0
  66. package/build/server/src/TcpProxy.js.map +1 -0
  67. package/build/server/src/formatters/HexFormatter.js +33 -0
  68. package/build/server/src/formatters/HexFormatter.js.map +1 -0
  69. package/build/server/src/formatters/MongoFormatter.js +97 -0
  70. package/build/server/src/formatters/MongoFormatter.js.map +1 -0
  71. package/build/server/src/formatters/MongoOpCode.js +51 -0
  72. package/build/server/src/formatters/MongoOpCode.js.map +1 -0
  73. package/build/server/src/formatters/RedisFormatter.js +25 -0
  74. package/build/server/src/formatters/RedisFormatter.js.map +1 -0
  75. package/build/server/src/formatters/SqlCommand.js +111 -0
  76. package/build/server/src/formatters/SqlCommand.js.map +1 -0
  77. package/build/server/src/formatters/SqlFormatter.js +150 -0
  78. package/build/server/src/formatters/SqlFormatter.js.map +1 -0
  79. package/client/README.md +46 -0
  80. package/client/build/asset-manifest.json +26 -0
  81. package/client/build/favicon.ico +0 -0
  82. package/client/build/index.html +1 -0
  83. package/client/build/manifest.json +8 -0
  84. package/client/build/robots.txt +3 -0
  85. package/client/build/static/css/2.bbde182e.chunk.css +12 -0
  86. package/client/build/static/css/2.bbde182e.chunk.css.map +1 -0
  87. package/client/build/static/css/main.5bf489b2.chunk.css +2 -0
  88. package/client/build/static/css/main.5bf489b2.chunk.css.map +1 -0
  89. package/client/build/static/js/2.ba308ba1.chunk.js +3 -0
  90. package/client/build/static/js/2.ba308ba1.chunk.js.LICENSE.txt +100 -0
  91. package/client/build/static/js/2.ba308ba1.chunk.js.map +1 -0
  92. package/client/build/static/js/3.7073b0d8.chunk.js +2 -0
  93. package/client/build/static/js/3.7073b0d8.chunk.js.map +1 -0
  94. package/client/build/static/js/main.494a7501.chunk.js +2 -0
  95. package/client/build/static/js/main.494a7501.chunk.js.map +1 -0
  96. package/client/build/static/js/runtime-main.00264969.js +2 -0
  97. package/client/build/static/js/runtime-main.00264969.js.map +1 -0
  98. package/client/build/static/media/fa-brands-400.2285773e.woff +0 -0
  99. package/client/build/static/media/fa-brands-400.23f19bb0.eot +0 -0
  100. package/client/build/static/media/fa-brands-400.2f517e09.svg +3717 -0
  101. package/client/build/static/media/fa-brands-400.527940b1.ttf +0 -0
  102. package/client/build/static/media/fa-brands-400.d878b0a6.woff2 +0 -0
  103. package/client/build/static/media/fa-regular-400.4689f52c.svg +801 -0
  104. package/client/build/static/media/fa-regular-400.491974d1.ttf +0 -0
  105. package/client/build/static/media/fa-regular-400.77206a6b.eot +0 -0
  106. package/client/build/static/media/fa-regular-400.7a333762.woff2 +0 -0
  107. package/client/build/static/media/fa-regular-400.bb58e57c.woff +0 -0
  108. package/client/build/static/media/fa-solid-900.1551f4f6.woff2 +0 -0
  109. package/client/build/static/media/fa-solid-900.7a8b4f13.svg +5034 -0
  110. package/client/build/static/media/fa-solid-900.9bbb245e.eot +0 -0
  111. package/client/build/static/media/fa-solid-900.be9ee23c.ttf +0 -0
  112. package/client/build/static/media/fa-solid-900.eeccf4f6.woff +0 -0
  113. package/package.json +80 -0
@@ -0,0 +1,20 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDODCCAiCgAwIBAgIUSl8sCdLklhM2lvHjqHp0pHk4ZbMwDQYJKoZIhvcNAQEL
3
+ BQAwFjEUMBIGA1UEAwwLZ29kLWVtcGVyb3IwHhcNMjAxMjE1MjAxMzQwWhcNMjMw
4
+ MzIwMjAxMzQwWjBqMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHVGVzdGluZzENMAsG
5
+ A1UEBwwEVGVzdDEUMBIGA1UECgwLZGV2ZWxvcG1lbnQxJDAiBgNVBAMMGyouc2hh
6
+ cnBzcHJpbmcubG9jYWxob3N0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
7
+ AQoCggEBAO/BJ/fGe3TGGzLUCKHeEQrrwQb1Zp369+zdNU/qsrPZ2zOwx9vgoPNS
8
+ m7fQa01DeqQkDsjwfxcdn7j5m4ZgiGsjJhiPLf8oJ0NdDPPcTRTmobK10ARdq8Kv
9
+ Ag2qI66WM6F+FZao80Kk0XyUAq1dzYZ42gSdhjXaNKYxZxG/EdE5XDyAETPxo6KD
10
+ eXEe6ZVlVEjIskXshnNEDm4Bf/zdYJ2Fm2eajnN9xOdFmRDnbv0pJXKewzGqMs/b
11
+ P4jT87QtTmh0X+fYqdXXGXzqGABiOERbSYSICnuasCPDpab3DAoJfnQpp8LYg1YB
12
+ 93wPdTMCIRlZ8NOv7GL+Qf8Q6r0f7NcCAwEAAaMqMCgwJgYDVR0RBB8wHYIbKi5z
13
+ aGFycHNwcmluZy5sb2NhbGhvc3QuY29tMA0GCSqGSIb3DQEBCwUAA4IBAQCde/me
14
+ RUebMVM1CwVd0tLBWUyfJhhHjHhMwBstRqFaNSCr5UafmH+OQdx2GRHvAUOcYRBW
15
+ 9V+zIXcDwkyeGLviclJ00JOZfgIeuWfKRTiCnOBlWJ0zZPrXCsN2tYfjPOc0vX7m
16
+ 5fopWekLs4PJZePPJQatZ+4lSTbSUz7ILmqF9zHjcQ3B7NRE08uo9x8j3DhtIhNX
17
+ KjYfa5Th7rmsNUGEEcaIK+rBSNNuPrD5GKQcTiIQnJDmBJxABDp3i5HIebA7Tz+S
18
+ n01KLMxelAWFJcQhK9uqEzhC1gWqhkpvF8sDxNh7nQX2CT9bLdMjm+n+cVV68Ifz
19
+ 6hleMUjjrbPcwGpW
20
+ -----END CERTIFICATE-----
@@ -0,0 +1,28 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDvwSf3xnt0xhsy
3
+ 1Aih3hEK68EG9Wad+vfs3TVP6rKz2dszsMfb4KDzUpu30GtNQ3qkJA7I8H8XHZ+4
4
+ +ZuGYIhrIyYYjy3/KCdDXQzz3E0U5qGytdAEXavCrwINqiOuljOhfhWWqPNCpNF8
5
+ lAKtXc2GeNoEnYY12jSmMWcRvxHROVw8gBEz8aOig3lxHumVZVRIyLJF7IZzRA5u
6
+ AX/83WCdhZtnmo5zfcTnRZkQ5279KSVynsMxqjLP2z+I0/O0LU5odF/n2KnV1xl8
7
+ 6hgAYjhEW0mEiAp7mrAjw6Wm9wwKCX50KafC2INWAfd8D3UzAiEZWfDTr+xi/kH/
8
+ EOq9H+zXAgMBAAECggEBALPLe2iRnSWOJvlwDuUsfkVdVM0eHQ1eFqy3mvJKhCbh
9
+ ukPCT66xfqHaklI/Zyhy8TbEn53K1NQF8DCsZxhXrhYCLuB+BzVw7DjVQBBkZh3F
10
+ cv9s3wlXIaaGzZhnvgiANUnnHtNz8bFJnpu492UBkk5EtOJ/KxWZhKAZLj0dt4PY
11
+ 944z0jrAdbdkXULwPpO9FOqkXvqErbYQsc2Ow5QRYltqPi4UJuPYEiF6WmyCsOTx
12
+ gWygWmD2/65kpU8HBGgVk3u+x0YvEA+evqRawaUU/BWB70hrSHxRwz76F0EhxoR4
13
+ 8k7FeezcTCUesXU95WOT/ciMbFH2Y1R3bvKwVGgDZlECgYEA/Mos3y5gKqIt01tV
14
+ /E3gSgKwmrASfkLP5WJha8gt5Q1sXYpYppokfPY1DIyP9RTlcOa7NDdi88mN6hk0
15
+ xS1nZ05kNJvHNLlnBEF4UUGwcnTHyeIyeJIpQh1qwrNNMT2nxUr9pVFpMJ/ay1Xp
16
+ e40MD2YPHsii+aTOLL3BxM/BIl8CgYEA8syaYKIEoLWQ7WySgyzHdyFMFXHxjdRG
17
+ jV3mzIhgYO+sQ5D6JLBFmMvFmVzboM8ZLvLmibcM/frAmNXQEziX49A3OvSGuoFV
18
+ otxVb1dM6EvRYDELMsTUJSzMGvooppFbkUstLuDPQoks4jGkeBn0lS3/EumPIb5F
19
+ u+7R9opYeIkCgYAMmAHuSIAv/45q5jT9cd/HsCSeQEFbmvaChgk2dm2a6LVKX7cU
20
+ 7b79nsJ70pDlc9oOauBOtKewX407aXAQlrd9FRG28T/WZ5ozQxO8cJpayWierS84
21
+ hIebrJ2B/67L0jeGg7rpPooQCxa6ZJhSOG+uYLZGIVbFOymuXvHFXVhQ3wKBgQDM
22
+ 5F6Ol4sCN9ZylYHaUoqM/LthCYPHpVBYcdqX1apHg1pCtnBxT5ObyrIYpqTswnfF
23
+ B9QGeUPsfJPVJfHuln6PECHbjYi4kPY8dmVejTRof7rTyu9hS3qfWHtxdJOjZNz5
24
+ 8o/RlIMy6eHHjA74Dyc4UNWFFzXjStc8LeBfhgX8yQKBgDuB9pAlzA4eZ4tCECdz
25
+ d0tiVpEhkTYS/kQPQ8oS8+EmTOd2NoOjus9OZ4ZQeS/r6C3BW4lHb8KfEUlsq6pf
26
+ k5d47wETtTIK88kBtbwp6a0kWMDhdy+m1xpIsOfeEzmrHLC/RIDhOPRhAPQCvFxD
27
+ CRoOK4xCwC9cCgAAq1ZZQZGF
28
+ -----END PRIVATE KEY-----
@@ -0,0 +1,25 @@
1
+ [ req ]
2
+ default_bits = 4096
3
+ distinguished_name = req_distinguished_name
4
+ req_extensions = req_ext
5
+
6
+ [ req_distinguished_name ]
7
+ countryName = US
8
+ countryName_default = US
9
+ stateOrProvinceName = MN
10
+ stateOrProvinceName_default = Minnesota
11
+ localityName = Fergus Falls
12
+ localityName_default = Fergus Falls
13
+ organizationName = SharpSpring
14
+ organizationName_default = SharpSpring
15
+ commonName = localhost
16
+ commonName_max = 64
17
+ commonName_default = localhost
18
+
19
+ [ req_ext ]
20
+ subjectAltName = @alt_names
21
+
22
+ [alt_names]
23
+ DNS.1 = localhost
24
+ DNS.2 = middleman
25
+
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const dns_1 = __importDefault(require("dns"));
7
+ class Global {
8
+ static resolveIp(ipAddr) {
9
+ return new Promise((resolve) => {
10
+ if (ipAddr) {
11
+ try {
12
+ ipAddr = ipAddr.replace('::ffff:', '');
13
+ dns_1.default.reverse(ipAddr, (err, hosts) => {
14
+ if (err === null && hosts.length > 0) {
15
+ ipAddr = hosts.sort((a, b) => a.length - b.length)[0];
16
+ const host = ipAddr.split('.')[0]; // un-qualify host name
17
+ if (isNaN(+host)) {
18
+ ipAddr = host;
19
+ }
20
+ }
21
+ resolve(ipAddr);
22
+ });
23
+ }
24
+ catch (e) {
25
+ resolve(ipAddr);
26
+ }
27
+ }
28
+ else {
29
+ ipAddr = 'unknown';
30
+ resolve(ipAddr);
31
+ }
32
+ });
33
+ }
34
+ }
35
+ exports.default = Global;
36
+ Global.nextSequenceNumber = 0;
37
+ Global.debug = false;
38
+ //# sourceMappingURL=Global.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Global.js","sourceRoot":"","sources":["../../../server/src/Global.ts"],"names":[],"mappings":";;;;;AACA,8CAAqB;AAErB,MAAqB,MAAM;IAKvB,MAAM,CAAC,SAAS,CAAE,MAA0B;QAC1C,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;YACrC,IAAI,MAAM,EAAE;gBACV,IAAI;oBACF,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;oBACtC,aAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,GAAQ,EAAE,KAAU,EAAE,EAAE;wBAC3C,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;4BACpC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAQ,EAAE,CAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;4BACnE,MAAM,IAAI,GAAG,MAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,uBAAuB;4BAC1D,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE;gCAChB,MAAM,GAAG,IAAI,CAAA;6BACd;yBACF;wBACD,OAAO,CAAC,MAAO,CAAC,CAAA;oBAClB,CAAC,CAAC,CAAA;iBACH;gBAAC,OAAO,CAAC,EAAE;oBACV,OAAO,CAAC,MAAM,CAAC,CAAA;iBAChB;aACF;iBAAM;gBACL,MAAM,GAAG,SAAS,CAAA;gBAClB,OAAO,CAAC,MAAM,CAAC,CAAA;aAChB;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;;AA5BL,yBA6BC;AA3BU,yBAAkB,GAAW,CAAC,CAAC;AAC/B,YAAK,GAAG,KAAK,CAAC"}
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const url_1 = __importDefault(require("url"));
16
+ const http2_1 = __importDefault(require("http2"));
17
+ const Global_1 = __importDefault(require("./Global"));
18
+ const ProxyConfig_1 = __importDefault(require("../../common/ProxyConfig"));
19
+ const HttpMessage_1 = __importDefault(require("./HttpMessage"));
20
+ const querystring_1 = __importDefault(require("querystring"));
21
+ const HexFormatter_1 = __importDefault(require("./formatters/HexFormatter"));
22
+ const Paths_1 = __importDefault(require("./Paths"));
23
+ const fs_1 = __importDefault(require("fs"));
24
+ const debug = false;
25
+ const settings = { maxConcurrentStreams: undefined };
26
+ const tlsOptions = {
27
+ key: fs_1.default.readFileSync(Paths_1.default.serverKey()),
28
+ cert: fs_1.default.readFileSync(Paths_1.default.serverCrt())
29
+ };
30
+ /**
31
+ * Important: This module must remain at the project root to properly set the document root for the index.html.
32
+ */
33
+ class Http2Proxy {
34
+ static forwardProxy(port, isSecure = false) {
35
+ const proxyConfig = new ProxyConfig_1.default();
36
+ proxyConfig.isSecure = isSecure;
37
+ proxyConfig.protocol = 'browser:';
38
+ proxyConfig.path = port.toString();
39
+ Http2Proxy.start(proxyConfig);
40
+ }
41
+ static reverseProxy(proxyConfig) {
42
+ Http2Proxy.start(proxyConfig);
43
+ }
44
+ static start(proxyConfig) {
45
+ const server = proxyConfig.isSecure
46
+ ? http2_1.default.createSecureServer(Object.assign({ settings }, tlsOptions))
47
+ : http2_1.default.createServer({
48
+ settings
49
+ }); // HTTPS is not currently supported
50
+ proxyConfig._server = server;
51
+ listen(server);
52
+ let retries = 0;
53
+ let wait = 1000;
54
+ server.on('error', (err) => {
55
+ if (++retries < 10) {
56
+ setTimeout(() => listen(server), wait *= 2);
57
+ }
58
+ else {
59
+ console.error('Http2Proxy server error', err);
60
+ }
61
+ });
62
+ server.on('request', onRequest);
63
+ function listen(server) {
64
+ server.listen(proxyConfig.path, () => {
65
+ const msg = proxyConfig.protocol === 'browser:' ? '' : `, target host ${proxyConfig.hostname}`;
66
+ console.log(`Listening on http2 port ${proxyConfig.path} ${msg}`);
67
+ });
68
+ }
69
+ function onRequest(clientReq, clientRes) {
70
+ return __awaiter(this, void 0, void 0, function* () {
71
+ // eslint-disable-next-line node/no-deprecated-api
72
+ const reqUrl = url_1.default.parse(clientReq.url ? clientReq.url : '');
73
+ const sequenceNumber = ++Global_1.default.nextSequenceNumber;
74
+ const remoteAddress = clientReq.socket.remoteAddress;
75
+ const httpMessage = new HttpMessage_1.default(proxyConfig, sequenceNumber, remoteAddress, clientReq.method, clientReq.url, clientReq.headers);
76
+ const requestBodyPromise = getReqBody(clientReq);
77
+ httpMessage.emitMessageToBrowser(''); // No request body received yet
78
+ proxyRequest(proxyConfig, requestBodyPromise);
79
+ function proxyRequest(proxyConfig, requestBodyPromise) {
80
+ clientReq.on('error', function (error) {
81
+ console.error(sequenceNumber, 'Client connection error', JSON.stringify(error, null, 2));
82
+ });
83
+ const headers = clientReq.headers;
84
+ let authority = proxyConfig.hostname;
85
+ if (proxyConfig.port)
86
+ authority += ':' + proxyConfig.port;
87
+ headers[http2_1.default.constants.HTTP2_HEADER_AUTHORITY] = authority;
88
+ let { protocol, hostname, port } = proxyConfig.protocol === 'browser:'
89
+ ? reqUrl
90
+ : proxyConfig;
91
+ if (proxyConfig.protocol !== 'browser:') {
92
+ protocol = proxyConfig.isSecure ? 'https:' : 'http:';
93
+ }
94
+ if (port === undefined) {
95
+ port = protocol === 'https:' ? 443 : 80;
96
+ }
97
+ const proxyClient = http2_1.default.connect(`${protocol}//${hostname}:${port}`, { settings });
98
+ proxyClient.on('error', (err) => __awaiter(this, void 0, void 0, function* () {
99
+ const requestBody = yield requestBodyPromise;
100
+ httpMessage.emitMessageToBrowser(requestBody, 404, {}, { err, 'proxyall-config': proxyConfig });
101
+ }));
102
+ const chunks = [];
103
+ let trailers = {};
104
+ const proxyStream = proxyClient.request(headers);
105
+ proxyStream.on('trailers', (headers, _flags) => {
106
+ if (debug)
107
+ console.log('trailers', headers);
108
+ clientRes.addTrailers(headers);
109
+ trailers = headers;
110
+ });
111
+ proxyStream.on('response', (headers, flags) => {
112
+ if (debug)
113
+ console.log('on response', clientReq.url, headers, flags);
114
+ clientRes.stream.respond(headers, { waitForTrailers: true });
115
+ // proxyStream.pipe(clientRes, {
116
+ // end: true
117
+ // })
118
+ proxyStream.on('data', function (chunk) {
119
+ clientRes.write(chunk);
120
+ chunks.push(chunk);
121
+ });
122
+ proxyStream.on('end', () => __awaiter(this, void 0, void 0, function* () {
123
+ if (debug)
124
+ console.log('end of response received');
125
+ clientRes.end();
126
+ proxyClient.close();
127
+ const requestBody = yield requestBodyPromise;
128
+ // chunks.push(headers)
129
+ const resBody = getResBody(chunks);
130
+ const allHeaders = Object.assign(Object.assign({}, headers), trailers);
131
+ httpMessage.emitMessageToBrowser(requestBody, headers[':status'], allHeaders, resBody);
132
+ }));
133
+ });
134
+ // Forward the client request
135
+ clientReq.pipe(proxyStream, {
136
+ end: true
137
+ });
138
+ }
139
+ function getReqBody(clientReq) {
140
+ return new Promise(resolve => {
141
+ // eslint-disable-next-line no-unreachable
142
+ let requestBody = '';
143
+ let rawData = '';
144
+ clientReq.on('data', function (chunk) {
145
+ rawData += chunk;
146
+ });
147
+ // eslint-disable-next-line no-unreachable
148
+ clientReq.on('end', function () {
149
+ return __awaiter(this, void 0, void 0, function* () {
150
+ try {
151
+ requestBody = JSON.parse(rawData);
152
+ }
153
+ catch (e) {
154
+ const contentType = clientReq.headers['content-type'];
155
+ if (contentType && contentType.indexOf('application/x-www-form-urlencoded') !== -1) {
156
+ requestBody = querystring_1.default.parse(rawData);
157
+ }
158
+ else {
159
+ requestBody = rawData;
160
+ }
161
+ }
162
+ if (proxyConfig.protocol === 'grpc:') {
163
+ requestBody = HexFormatter_1.default.format(Buffer.from(requestBody, 'utf-8'));
164
+ }
165
+ resolve(requestBody);
166
+ });
167
+ });
168
+ });
169
+ }
170
+ function getResBody(chunks) {
171
+ if (chunks.length === 0)
172
+ return '';
173
+ const resBuffer = chunks.reduce((prevChunk, chunk) => Buffer.concat([prevChunk, chunk], prevChunk.length + chunk.length));
174
+ const resString = resBuffer.toString();
175
+ let resBody = '';
176
+ try {
177
+ resBody = JSON.parse(resString); // assume JSON
178
+ }
179
+ catch (e) {
180
+ resBody = resString;
181
+ }
182
+ // gRPC is binary data
183
+ if (proxyConfig.protocol === 'grpc:') {
184
+ resBody = HexFormatter_1.default.format(Buffer.from(resBody, 'utf-8'));
185
+ }
186
+ return resBody;
187
+ }
188
+ });
189
+ }
190
+ }
191
+ static destructor(proxyConfig) {
192
+ if (proxyConfig._server)
193
+ proxyConfig._server.close();
194
+ }
195
+ }
196
+ exports.default = Http2Proxy;
197
+ //# sourceMappingURL=Http2Proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Http2Proxy.js","sourceRoot":"","sources":["../../../server/src/Http2Proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const Message_1 = require("../../common/Message");
16
+ const SocketMessage_1 = __importDefault(require("./SocketMessage"));
17
+ const Global_1 = __importDefault(require("./Global"));
18
+ class HttpMessage {
19
+ constructor(proxyConfig, sequenceNumber, remoteAddress, method, url, reqHeaders) {
20
+ this.emitCount = 0;
21
+ this.sequenceNumber = 0;
22
+ this.getHttpEndpoint = (method, url, requestBody) => {
23
+ let endpoint = url.split('?')[0];
24
+ const tokens = endpoint === null || endpoint === void 0 ? void 0 : endpoint.split('/');
25
+ endpoint = tokens ? tokens[tokens.length - 1] : '';
26
+ if (!isNaN(+endpoint) && tokens && tokens.length > 1) {
27
+ endpoint = tokens[tokens.length - 2] + '/' + tokens[tokens.length - 1];
28
+ }
29
+ if (method !== 'OPTIONS' &&
30
+ (url.endsWith('/graphql') || url.endsWith('/graphql-public'))) {
31
+ endpoint = '';
32
+ if (typeof requestBody === 'object') {
33
+ if (Array.isArray(requestBody)) {
34
+ requestBody.forEach((entry) => {
35
+ if (entry.operationName) {
36
+ if (endpoint.length > 0)
37
+ endpoint += ',';
38
+ endpoint += ' ' + entry.operationName;
39
+ }
40
+ });
41
+ }
42
+ else {
43
+ for (const key in requestBody) {
44
+ if (key === 'operationName') {
45
+ if (endpoint.length > 0)
46
+ endpoint += ',';
47
+ endpoint += ' ' + requestBody[key];
48
+ }
49
+ }
50
+ }
51
+ }
52
+ const tag = url.endsWith('/graphql-public') ? 'GQLP' : 'GQL';
53
+ endpoint = ' ' + tag + endpoint;
54
+ }
55
+ if ('/' + endpoint === url)
56
+ endpoint = '';
57
+ return endpoint;
58
+ };
59
+ this.startTime = Date.now();
60
+ this.proxyConfig = proxyConfig;
61
+ this.sequenceNumber = sequenceNumber;
62
+ this.remoteAddress = remoteAddress;
63
+ this.method = method;
64
+ this.url = url;
65
+ this.reqHeaders = reqHeaders;
66
+ }
67
+ emitMessageToBrowser(reqBody = '', resStatus = 0, resHeaders = {}, resBody = Message_1.NO_RESPONSE) {
68
+ return __awaiter(this, void 0, void 0, function* () {
69
+ const reqBodyJson = typeof reqBody === 'object' ? reqBody : this.toJSON(reqBody);
70
+ const resBodyJson = resBody === Message_1.NO_RESPONSE || typeof resBody === 'object' ? resBody : this.toJSON(resBody);
71
+ const host = this.proxyConfig ? this.getHostPort(this.proxyConfig) : 'Unknown';
72
+ const message = yield SocketMessage_1.default.buildRequest(Date.now(), this.sequenceNumber, this.reqHeaders, this.method, this.url, this.getHttpEndpoint(this.method, this.url, reqBodyJson), reqBodyJson, this.remoteAddress, host, // server host
73
+ this.proxyConfig ? this.proxyConfig.path : '', Date.now() - this.startTime);
74
+ SocketMessage_1.default.appendResponse(message, resHeaders, resBodyJson, resStatus, Date.now() - this.startTime);
75
+ Global_1.default.socketIoManager.emitMessageToBrowser(resBody === Message_1.NO_RESPONSE
76
+ ? Message_1.MessageType.REQUEST
77
+ : this.emitCount === 0
78
+ ? Message_1.MessageType.REQUEST_AND_RESPONSE
79
+ : Message_1.MessageType.RESPONSE, message, this.proxyConfig);
80
+ ++this.emitCount;
81
+ });
82
+ }
83
+ toJSON(s) {
84
+ try {
85
+ return JSON.parse(s);
86
+ }
87
+ catch (e) {
88
+ return s;
89
+ }
90
+ }
91
+ getHostPort(proxyConfig) {
92
+ let host = proxyConfig.hostname;
93
+ if (proxyConfig.port)
94
+ host += ':' + proxyConfig.port;
95
+ return host;
96
+ }
97
+ }
98
+ exports.default = HttpMessage;
99
+ //# sourceMappingURL=HttpMessage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpMessage.js","sourceRoot":"","sources":["../../../server/src/HttpMessage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const url_1 = __importDefault(require("url"));
16
+ const http_1 = __importDefault(require("http"));
17
+ const https_1 = __importDefault(require("https"));
18
+ const Global_1 = __importDefault(require("./Global"));
19
+ const ProxyConfig_1 = __importDefault(require("../../common/ProxyConfig"));
20
+ const HttpMessage_1 = __importDefault(require("./HttpMessage"));
21
+ const querystring_1 = __importDefault(require("querystring"));
22
+ const ProxyAllApp_1 = __importDefault(require("./ProxyAllApp"));
23
+ const decompressResponse = require('decompress-response');
24
+ /**
25
+ * Important: This module must remain at the project root to properly set the document root for the index.html.
26
+ */
27
+ class HttpProxy {
28
+ onRequest(clientReq, clientRes) {
29
+ return __awaiter(this, void 0, void 0, function* () {
30
+ // eslint-disable-next-line node/no-deprecated-api
31
+ const reqUrl = url_1.default.parse(clientReq.url ? clientReq.url : '');
32
+ // Request is from ProxyAll app?
33
+ if (ProxyAllApp_1.default(clientRes, reqUrl)) {
34
+ return;
35
+ }
36
+ const sequenceNumber = ++Global_1.default.nextSequenceNumber;
37
+ const remoteAddress = clientReq.socket.remoteAddress;
38
+ // Find matching proxy configuration
39
+ const clientHostName = yield Global_1.default.resolveIp(clientReq.socket.remoteAddress);
40
+ let proxyConfig = Global_1.default.socketIoManager.findProxyConfigMatchingURL('http:', clientHostName, reqUrl);
41
+ // Always proxy forward proxy requests
42
+ if (proxyConfig === undefined && reqUrl.protocol !== null) {
43
+ proxyConfig = new ProxyConfig_1.default();
44
+ proxyConfig.path = reqUrl.pathname;
45
+ proxyConfig.protocol = reqUrl.protocol;
46
+ proxyConfig.hostname = reqUrl.hostname;
47
+ proxyConfig.port = reqUrl.port === null
48
+ ? reqUrl.protocol === 'http:' ? 80 : 443
49
+ : +reqUrl.port;
50
+ }
51
+ const httpMessage = new HttpMessage_1.default(proxyConfig, sequenceNumber, remoteAddress, clientReq.method, clientReq.url, clientReq.headers);
52
+ const requestBodyPromise = getReqBody(clientReq);
53
+ if (proxyConfig === undefined) {
54
+ const requestBody = yield requestBodyPromise;
55
+ const error = 'No matching proxy configuration found for ' + reqUrl.pathname;
56
+ if (reqUrl.pathname === '/') {
57
+ clientRes.writeHead(302, { Location: reqUrl.href + 'proxyall' });
58
+ clientRes.end();
59
+ }
60
+ else {
61
+ httpMessage.emitMessageToBrowser(requestBody, 404, {}, { error });
62
+ }
63
+ }
64
+ else {
65
+ httpMessage.emitMessageToBrowser(''); // No request body received yet
66
+ proxyRequest(proxyConfig, requestBodyPromise);
67
+ }
68
+ function proxyRequest(proxyConfig, requestBodyPromise) {
69
+ clientReq.on('close', function () {
70
+ // sendErrorResponse(499, "Client closed connection", undefined, proxyConfig.path);
71
+ });
72
+ clientReq.on('error', function (error) {
73
+ console.error(sequenceNumber, 'Client connection error', JSON.stringify(error, null, 2));
74
+ });
75
+ let method = clientReq.method;
76
+ // GET request received with body?
77
+ if (clientReq.method === 'GET' &&
78
+ clientReq.headers['content-length'] && +clientReq.headers['content-length'] > 0) {
79
+ method = 'POST'; // forward request as POST
80
+ }
81
+ const headers = clientReq.headers;
82
+ headers.host = proxyConfig.hostname;
83
+ if (proxyConfig.port)
84
+ headers.host += ':' + proxyConfig.port;
85
+ let { protocol, hostname, port } = proxyConfig.protocol === 'browser:' || proxyConfig.protocol === 'log:'
86
+ ? reqUrl
87
+ : proxyConfig;
88
+ if (port === undefined) {
89
+ port = proxyConfig.protocol === 'https:' ? 443 : 80;
90
+ }
91
+ const options = {
92
+ protocol,
93
+ hostname,
94
+ port,
95
+ path: clientReq.url,
96
+ method,
97
+ headers
98
+ };
99
+ let proxy;
100
+ if (options.protocol === 'https:') {
101
+ // options.cert: fs.readFileSync('/home/davidchr/imlTrust.pem');
102
+ // options.headers.Authorization = 'Basic ' + new Buffer.from('elastic:imliml').toString('base64'); // hardcoded authentication
103
+ proxy = https_1.default.request(options, handleResponse);
104
+ }
105
+ else {
106
+ proxy = http_1.default.request(options, handleResponse);
107
+ }
108
+ function handleResponse(proxyRes) {
109
+ return __awaiter(this, void 0, void 0, function* () {
110
+ const requestBody = yield requestBodyPromise;
111
+ if (typeof requestBody === 'object' ||
112
+ (typeof requestBody === 'string' && requestBody.length > 0)) {
113
+ httpMessage.emitMessageToBrowser(requestBody);
114
+ }
115
+ /**
116
+ * Forward the response back to the client
117
+ */
118
+ clientRes.writeHead(proxyRes.statusCode, proxyRes.headers);
119
+ proxyRes.pipe(clientRes, {
120
+ end: true
121
+ });
122
+ const resBody = yield getResBody(proxyRes);
123
+ httpMessage.emitMessageToBrowser(requestBody, proxyRes.statusCode, proxyRes.headers, resBody);
124
+ });
125
+ }
126
+ proxy.on('error', function (error) {
127
+ return __awaiter(this, void 0, void 0, function* () {
128
+ console.error(sequenceNumber, 'Proxy connect error', JSON.stringify(error, null, 2), 'config:', proxyConfig);
129
+ const requestBody = yield requestBodyPromise;
130
+ httpMessage.emitMessageToBrowser(requestBody, 404, {}, { error, 'proxyall-config': proxyConfig });
131
+ });
132
+ });
133
+ clientReq.pipe(proxy, {
134
+ end: true
135
+ });
136
+ }
137
+ function getReqBody(clientReq) {
138
+ return new Promise(resolve => {
139
+ let requestBody = '';
140
+ clientReq.setEncoding('utf8');
141
+ let rawData = '';
142
+ clientReq.on('data', function (chunk) {
143
+ rawData += chunk;
144
+ });
145
+ clientReq.on('end', function () {
146
+ return __awaiter(this, void 0, void 0, function* () {
147
+ try {
148
+ requestBody = JSON.parse(rawData);
149
+ }
150
+ catch (e) {
151
+ const contentType = clientReq.headers['content-type'];
152
+ if (contentType && contentType.indexOf('application/x-www-form-urlencoded') !== -1) {
153
+ requestBody = querystring_1.default.parse(rawData);
154
+ }
155
+ else {
156
+ requestBody = rawData;
157
+ }
158
+ }
159
+ resolve(requestBody);
160
+ });
161
+ });
162
+ });
163
+ }
164
+ function getResBody(proxyRes) {
165
+ return new Promise(resolve => {
166
+ if (proxyRes.headers) {
167
+ if (proxyRes.headers['content-encoding']) {
168
+ proxyRes = decompressResponse(proxyRes);
169
+ // delete proxyRes.headers['content-encoding'];
170
+ }
171
+ if (proxyRes.headers['content-type'] &&
172
+ proxyRes.headers['content-type'].indexOf('utf-8') !== -1) {
173
+ proxyRes.setEncoding('utf8');
174
+ }
175
+ }
176
+ let rawData = '';
177
+ proxyRes.on('data', function (chunk) {
178
+ rawData += chunk;
179
+ });
180
+ let parsedData = '';
181
+ proxyRes.on('end', () => {
182
+ try {
183
+ parsedData = JSON.parse(rawData); // assume JSON
184
+ }
185
+ catch (e) {
186
+ parsedData = rawData;
187
+ }
188
+ resolve(parsedData);
189
+ });
190
+ });
191
+ }
192
+ });
193
+ }
194
+ }
195
+ exports.default = HttpProxy;
196
+ //# sourceMappingURL=HttpProxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpProxy.js","sourceRoot":"","sources":["../../../server/src/HttpProxy.ts"],"names":[],"mappings":"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"}