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.
- package/assets/menu.html +2 -0
- package/assets/modal.html +2 -0
- package/assets/tab.html +3 -3
- package/bin/proxy.js +2 -2
- package/bin/whistle.js +5 -5
- package/biz/webui/cgi-bin/add-rules-values.js +1 -1
- package/biz/webui/cgi-bin/check-update.js +0 -1
- package/biz/webui/cgi-bin/do-not-show-again.js +1 -1
- package/biz/webui/cgi-bin/download.js +1 -1
- package/biz/webui/cgi-bin/enable-http2.js +1 -1
- package/biz/webui/cgi-bin/get-matched-rules.js +14 -0
- package/biz/webui/cgi-bin/hide-https-connects.js +1 -1
- package/biz/webui/cgi-bin/intercept-https-connects.js +1 -1
- package/biz/webui/cgi-bin/plugins/disable-all-plugins.js +1 -1
- package/biz/webui/cgi-bin/reset-local-address.js +1 -1
- package/biz/webui/cgi-bin/rules/allow-multiple-choice.js +1 -1
- package/biz/webui/cgi-bin/rules/clear-dns-cache.js +7 -0
- package/biz/webui/cgi-bin/rules/disable-all-rules.js +1 -1
- package/biz/webui/cgi-bin/rules/disable-default.js +1 -1
- package/biz/webui/cgi-bin/rules/enable-back-rules-first.js +1 -1
- package/biz/webui/cgi-bin/rules/enable-default.js +1 -1
- package/biz/webui/cgi-bin/rules/move-to.js +1 -1
- package/biz/webui/cgi-bin/rules/remove.js +1 -1
- package/biz/webui/cgi-bin/rules/rename.js +1 -1
- package/biz/webui/cgi-bin/rules/select.js +1 -1
- package/biz/webui/cgi-bin/rules/set-sys-hosts.js +1 -1
- package/biz/webui/cgi-bin/rules/unselect.js +1 -1
- package/biz/webui/cgi-bin/values/move-to.js +1 -1
- package/biz/webui/cgi-bin/values/remove.js +1 -1
- package/biz/webui/cgi-bin/values/rename.js +1 -1
- package/biz/webui/htdocs/index.html +1 -1
- package/biz/webui/htdocs/js/index.js +54 -52
- package/biz/webui/lib/index.js +32 -2
- package/lib/config.js +4 -4
- package/lib/handlers/file-proxy.js +1 -1
- package/lib/https/ca.js +31 -0
- package/lib/https/index.js +4 -2
- package/lib/index.js +0 -2
- package/lib/inspectors/data.js +120 -13
- package/lib/inspectors/req.js +5 -3
- package/lib/plugins/get-plugins-sync.js +15 -11
- package/lib/plugins/get-plugins.js +11 -12
- package/lib/plugins/load-plugin.js +1 -1
- package/lib/plugins/module-paths.js +4 -0
- package/lib/plugins/util.js +8 -0
- package/lib/rules/dns.js +4 -0
- package/lib/rules/rules.js +7 -8
- package/lib/service/composer.js +86 -39
- package/lib/service/service.js +14 -10
- package/lib/service/util.js +3 -42
- package/lib/socket-mgr.js +2 -16
- package/lib/tunnel.js +3 -0
- package/lib/upgrade.js +1 -0
- package/lib/util/common.js +54 -10
- package/lib/util/data-server.js +10 -0
- package/lib/util/index.js +38 -19
- package/package.json +2 -2
- 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(
|
|
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(
|
|
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
|
-
|
|
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 = !!
|
|
3395
|
-
delete
|
|
3396
|
-
delete
|
|
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 =
|
|
3401
|
+
var clientInfo = headers[clientInfoKey];
|
|
3403
3402
|
if (clientInfo) {
|
|
3404
|
-
delete
|
|
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.
|
|
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.
|
|
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
|
-
};
|