whistle 2.10.2 → 2.10.4

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 (58) hide show
  1. package/assets/menu.html +2 -0
  2. package/assets/modal.html +2 -0
  3. package/assets/tab.html +3 -3
  4. package/bin/proxy.js +2 -2
  5. package/bin/whistle.js +5 -5
  6. package/biz/webui/cgi-bin/add-rules-values.js +1 -1
  7. package/biz/webui/cgi-bin/check-update.js +0 -1
  8. package/biz/webui/cgi-bin/do-not-show-again.js +1 -1
  9. package/biz/webui/cgi-bin/download.js +1 -1
  10. package/biz/webui/cgi-bin/enable-http2.js +1 -1
  11. package/biz/webui/cgi-bin/get-matched-rules.js +14 -0
  12. package/biz/webui/cgi-bin/hide-https-connects.js +1 -1
  13. package/biz/webui/cgi-bin/intercept-https-connects.js +1 -1
  14. package/biz/webui/cgi-bin/plugins/disable-all-plugins.js +1 -1
  15. package/biz/webui/cgi-bin/reset-local-address.js +1 -1
  16. package/biz/webui/cgi-bin/rules/allow-multiple-choice.js +1 -1
  17. package/biz/webui/cgi-bin/rules/clear-dns-cache.js +7 -0
  18. package/biz/webui/cgi-bin/rules/disable-all-rules.js +1 -1
  19. package/biz/webui/cgi-bin/rules/disable-default.js +1 -1
  20. package/biz/webui/cgi-bin/rules/enable-back-rules-first.js +1 -1
  21. package/biz/webui/cgi-bin/rules/enable-default.js +1 -1
  22. package/biz/webui/cgi-bin/rules/move-to.js +1 -1
  23. package/biz/webui/cgi-bin/rules/remove.js +1 -1
  24. package/biz/webui/cgi-bin/rules/rename.js +1 -1
  25. package/biz/webui/cgi-bin/rules/select.js +1 -1
  26. package/biz/webui/cgi-bin/rules/set-sys-hosts.js +1 -1
  27. package/biz/webui/cgi-bin/rules/unselect.js +1 -1
  28. package/biz/webui/cgi-bin/values/move-to.js +1 -1
  29. package/biz/webui/cgi-bin/values/remove.js +1 -1
  30. package/biz/webui/cgi-bin/values/rename.js +1 -1
  31. package/biz/webui/htdocs/index.html +1 -1
  32. package/biz/webui/htdocs/js/index.js +54 -52
  33. package/biz/webui/lib/index.js +32 -2
  34. package/lib/config.js +4 -4
  35. package/lib/handlers/file-proxy.js +1 -1
  36. package/lib/https/ca.js +31 -0
  37. package/lib/https/index.js +4 -2
  38. package/lib/index.js +0 -2
  39. package/lib/inspectors/data.js +120 -13
  40. package/lib/inspectors/req.js +5 -3
  41. package/lib/plugins/get-plugins-sync.js +15 -11
  42. package/lib/plugins/get-plugins.js +11 -12
  43. package/lib/plugins/load-plugin.js +1 -1
  44. package/lib/plugins/module-paths.js +4 -0
  45. package/lib/plugins/util.js +8 -0
  46. package/lib/rules/dns.js +4 -0
  47. package/lib/rules/rules.js +7 -8
  48. package/lib/service/composer.js +86 -39
  49. package/lib/service/service.js +14 -10
  50. package/lib/service/util.js +3 -42
  51. package/lib/socket-mgr.js +2 -16
  52. package/lib/tunnel.js +3 -0
  53. package/lib/upgrade.js +1 -0
  54. package/lib/util/common.js +54 -10
  55. package/lib/util/data-server.js +10 -0
  56. package/lib/util/index.js +38 -19
  57. package/package.json +2 -2
  58. package/biz/webui/cgi-bin/import-remote.js +0 -37
package/lib/util/index.js CHANGED
@@ -29,6 +29,7 @@ var h2Consts = config.enableH2 ? require('http2').constants : {};
29
29
  var protocols = protoMgr.protocols;
30
30
  var resProtocols = protoMgr.resProtocols;
31
31
  var uid = config.uid;
32
+ var trimStr = common.trimStr;
32
33
  var parseQuery = common.parseQuery;
33
34
  var supportsBr = common.supportsBr;
34
35
  var isLocalIp = common.isLocalIp;
@@ -126,6 +127,7 @@ workerIndex = workerIndex >= 0 ? common.padLeft(config.workerIndex, 3) : '';
126
127
 
127
128
 
128
129
  exports.sendRes = common.sendRes;
130
+ exports.trimStr = trimStr;
129
131
  exports.THEME_STYLE = THEME_STYLE;
130
132
  exports.encodeNonLatin1Char = encodeNonLatin1Char;
131
133
  exports.isJson = common.isJson;
@@ -1164,7 +1166,7 @@ function getTempFilePath(filePath, rule) {
1164
1166
  var root = rule.root;
1165
1167
  if (!root && common.TEMP_PATH_RE.test(filePath)) {
1166
1168
  rule._suffix = RegExp.$2;
1167
- return path.join(config.TEMP_FILES_PATH, RegExp.$1);
1169
+ return path.join(common.TEMP_FILES_PATH, RegExp.$1);
1168
1170
  }
1169
1171
  return joinPath(root, decodePath(filePath));
1170
1172
  }
@@ -2359,15 +2361,6 @@ exports.transformReq = function(req, res, port, host, html) {
2359
2361
  return client;
2360
2362
  };
2361
2363
 
2362
- function trimStr(str) {
2363
- if (typeof str !== 'string') {
2364
- return '';
2365
- }
2366
- return str.trim();
2367
- }
2368
-
2369
- exports.trimStr = trimStr;
2370
-
2371
2364
  function hasHeaderRules(headers) {
2372
2365
  return (
2373
2366
  headers['x-whistle-rule-key'] ||
@@ -3102,10 +3095,10 @@ function getCookieItem(name, cookie) {
3102
3095
  if (!cookie || typeof cookie != 'object') {
3103
3096
  return name + '=' + (cookie == null ? '' : cookie);
3104
3097
  }
3105
- var attrs = [name + '=' + escapeValue(cookie.value)];
3098
+ var attrs = [name + '=' + escapeValue(cookie.value || cookie.Value)];
3106
3099
  var maxAge = cookie.maxAge || cookie.maxage ||
3107
3100
  cookie.MaxAge || cookie['Max-Age'] || cookie['max-age'];
3108
- maxAge = parseInt(cookie.maxAge, 10);
3101
+ maxAge = parseInt(maxAge, 10);
3109
3102
  if (!Number.isNaN(maxAge)) {
3110
3103
  attrs.push('Expires=' + new Date(Date.now() + maxAge * 1000).toGMTString());
3111
3104
  attrs.push('Max-Age=' + (maxAge === EXPIRED_SEC ? 0 : maxAge));
@@ -3389,19 +3382,25 @@ exports.parseRange = function (req, size) {
3389
3382
  };
3390
3383
 
3391
3384
  exports.parseClientInfo = function (req) {
3392
- if (req.headers[config.FROM_COM_HEADER] === '1') {
3385
+ var headers = req.headers;
3386
+ var testId = headers[config.TEST_HEADER];
3387
+ if (testId) {
3388
+ delete headers[config.TEST_HEADER];
3389
+ req._testId = testId;
3390
+ }
3391
+ if (headers[config.FROM_COM_HEADER] === '1') {
3393
3392
  req.fromComposer = true;
3394
- req._disabledProxyRules = !!req.headers[config.DISABLE_RULES_HEADER];
3395
- delete req.headers[config.FROM_COM_HEADER];
3396
- delete req.headers[config.DISABLE_RULES_HEADER];
3393
+ req._disabledProxyRules = !!headers[config.DISABLE_RULES_HEADER];
3394
+ delete headers[config.FROM_COM_HEADER];
3395
+ delete headers[config.DISABLE_RULES_HEADER];
3397
3396
  }
3398
3397
  var socket = req.socket || '';
3399
3398
  if (socket.fromTunnel) {
3400
3399
  req.fromTunnel = true;
3401
3400
  }
3402
- var clientInfo = req.headers[clientInfoKey];
3401
+ var clientInfo = headers[clientInfoKey];
3403
3402
  if (clientInfo) {
3404
- delete req.headers[clientInfoKey];
3403
+ delete headers[clientInfoKey];
3405
3404
  clientInfo = String(clientInfo).split(',');
3406
3405
  if (!net.isIP(clientInfo[0]) || !(clientInfo[1] > 0)) {
3407
3406
  return '';
@@ -3638,7 +3637,8 @@ function formatAuth(obj) {
3638
3637
  var password = obj.password;
3639
3638
  return {
3640
3639
  username: username == null ? null : String(username),
3641
- password: password == null ? null : String(password)
3640
+ password: password == null ? null : String(password),
3641
+ proxy: !!obj.proxy
3642
3642
  };
3643
3643
  }
3644
3644
 
@@ -3997,3 +3997,22 @@ exports.isHide = function(req) {
3997
3997
  var d = req.disable || '';
3998
3998
  return req.fromComposer ? checkHideProp(e, d, 'Composer') : checkHideProp(e, d, '', req._filters && req._filters.hide);
3999
3999
  };
4000
+
4001
+
4002
+ var frameIndex = 0;
4003
+
4004
+ exports.MAX_FRAME_PAYLOAD = 1024 * 1024;
4005
+
4006
+ exports.getFrameId = function() {
4007
+ ++frameIndex;
4008
+ if (frameIndex > 999) {
4009
+ frameIndex = 0;
4010
+ }
4011
+ if (frameIndex > 99) {
4012
+ return Date.now() + '-' + frameIndex;
4013
+ }
4014
+ if (frameIndex > 9) {
4015
+ return Date.now() + '-0' + frameIndex;
4016
+ }
4017
+ return Date.now() + '-00' + frameIndex;
4018
+ };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "whistle",
3
3
  "description": "HTTP, HTTP2, HTTPS, Websocket debugging proxy",
4
- "version": "2.10.2",
4
+ "version": "2.10.4",
5
5
  "dataDirname": ".whistle",
6
6
  "localUIHost": "local.whistlejs.com",
7
7
  "port": 8899,
@@ -53,7 +53,7 @@
53
53
  "parseurl": "^1.3.1",
54
54
  "pfork": "^0.6.3",
55
55
  "pipestream": "^0.7.5",
56
- "set-global-proxy": "^0.3.0",
56
+ "set-global-proxy": "^0.4.2",
57
57
  "sni": "1.0.0",
58
58
  "sockx": "^0.2.3",
59
59
  "starting": "^8.0.3",
@@ -1,37 +0,0 @@
1
- var util = require('../../../lib/util');
2
- var loadService = require('../lib/proxy').loadService;
3
-
4
- var MAX_LEN = 1024 * 1024 * 6;
5
- var HTTP_RE = /https?:\/\/\S/i;
6
-
7
- module.exports = function(req, res) {
8
- var url = req.query.url;
9
- if (HTTP_RE.test(url)) {
10
- util.request({
11
- url: url,
12
- maxLength: MAX_LEN
13
- }, function(err, body, r) {
14
- if (err) {
15
- var msg = err.code === 'EEXCEED' ? 'The size of response body exceeds 6MB' : err.message;
16
- return res.json({ec: 2, em: msg});
17
- }
18
- var status = r.statusCode;
19
- if (status !== 200) {
20
- var em = status > 200 && status < 400 ? 'No data' : 'Request failed';
21
- return res.json({ec: 2, em: em + ' (statusCode: ' + status + ')'});
22
- }
23
- return res.json({ec: 0, body: body});
24
- });
25
- } else if (util.isString(url)) {
26
- loadService(function(err, options) {
27
- if (err) {
28
- util.sendRes(res, 500, err.stack || err);
29
- } else {
30
- req.url = '/cgi-bin/temp/get?filename=' + encodeURIComponent(url);
31
- util.transformReq(req, res, options.port);
32
- }
33
- });
34
- } else {
35
- res.json({ec: 400, em: 'Bad url'});
36
- }
37
- };