whistle 2.10.9 → 2.10.10
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/js/log.js +4 -0
- package/bin/api.js +85 -1
- package/bin/util.js +1 -1
- package/biz/webui/cgi-bin/util.js +1 -1
- package/biz/webui/cgi-bin/values/add.js +15 -13
- package/biz/webui/htdocs/index.html +1 -1
- package/biz/webui/htdocs/js/index.js +50 -51
- package/biz/webui/lib/index.js +39 -30
- package/lib/config.js +10 -13
- package/lib/handlers/file-proxy.js +1 -1
- package/lib/https/ca.js +17 -16
- package/lib/https/h2.js +53 -34
- package/lib/https/index.js +11 -10
- package/lib/inspectors/data.js +7 -3
- package/lib/inspectors/log.js +14 -33
- package/lib/inspectors/res.js +2 -2
- package/lib/inspectors/rules.js +11 -6
- package/lib/inspectors/weinre.js +1 -1
- package/lib/plugins/index.js +44 -53
- package/lib/plugins/load-plugin.js +31 -40
- package/lib/rules/dns.js +1 -1
- package/lib/rules/index.js +1 -0
- package/lib/rules/rules.js +1 -1
- package/lib/rules/util.js +2 -7
- package/lib/service/composer.js +7 -3
- package/lib/service/service.js +3 -5
- package/lib/socket-mgr.js +1 -1
- package/lib/util/common.js +56 -33
- package/lib/util/data-server.js +5 -1
- package/lib/util/drain.js +5 -6
- package/lib/util/file-mgr.js +1 -1
- package/lib/util/http-mgr.js +6 -2
- package/lib/util/index.js +29 -23
- package/lib/util/speed-transform.js +2 -2
- package/lib/util/transproto.js +4 -3
- package/lib/util/whistle-transform.js +2 -2
- package/lib/util/zlib.js +1 -1
- package/package.json +3 -3
package/assets/js/log.js
CHANGED
|
@@ -243,6 +243,10 @@
|
|
|
243
243
|
var cacheList = [];
|
|
244
244
|
var origin = (location.origin || (location.protocol + '//' + location.host)) + '/';
|
|
245
245
|
|
|
246
|
+
try {
|
|
247
|
+
LOG_ID = decodeURIComponent(LOG_ID);
|
|
248
|
+
} catch(e) {}
|
|
249
|
+
|
|
246
250
|
function setLog() {
|
|
247
251
|
if (!cacheList.length) {
|
|
248
252
|
return;
|
package/bin/api.js
CHANGED
|
@@ -139,7 +139,8 @@ exports.network = {
|
|
|
139
139
|
* - `Font`:字体文件
|
|
140
140
|
* - `Img`:图片资源
|
|
141
141
|
* - `Media`:音视频媒体
|
|
142
|
-
* - `WS`:WebSocket
|
|
142
|
+
* - `WS`:WebSocket 请求
|
|
143
|
+
* - `SSE`:Server-Sent Events 请求
|
|
143
144
|
* - `Tunnel`:隧道连接(如 WebSocket 升级)
|
|
144
145
|
* - `Wasm`:WebAssembly 模块
|
|
145
146
|
* - `Mock`:Mock 数据
|
|
@@ -526,7 +527,90 @@ function getTimings(session) {
|
|
|
526
527
|
};
|
|
527
528
|
}
|
|
528
529
|
|
|
530
|
+
var PATTERN_FIELDS = ['url', 'm', 'method', 'reqH', 'reqHeader', 'reqHeaders',
|
|
531
|
+
'b', 'body', 'reqBody', 's', 'statusCode', 'status', 'resH', 'resHeader', 'resHeaders'];
|
|
532
|
+
|
|
533
|
+
function getHeaderKey(key) {
|
|
534
|
+
return !key || typeof key !== 'string' || /[^\w!#$%&'*+.^`|~-]/.test(key) ? '' : key.toLowerCase();
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
function createFilter(item, name, key) {
|
|
538
|
+
var protocol = (item.exclude ? 'ex' : 'in') + 'cludeFilter://';
|
|
539
|
+
name = name ? name + (key ? '.' : ':') : '';
|
|
540
|
+
key = key ? key + ':' : '';
|
|
541
|
+
return protocol + name + key + item.value;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
function createPattern(list) {
|
|
545
|
+
if (!list) {
|
|
546
|
+
return '';
|
|
547
|
+
}
|
|
548
|
+
if (!Array.isArray(list)) {
|
|
549
|
+
list = [list];
|
|
550
|
+
}
|
|
551
|
+
var len = list.length;
|
|
552
|
+
if (!len) {
|
|
553
|
+
return '';
|
|
554
|
+
}
|
|
555
|
+
var result = [];
|
|
556
|
+
var urlPattern;
|
|
557
|
+
var key;
|
|
558
|
+
var add = function(item, name, key) {
|
|
559
|
+
var p = createFilter(item, name, key);
|
|
560
|
+
if (result.indexOf(p) === -1) {
|
|
561
|
+
result.push(p);
|
|
562
|
+
}
|
|
563
|
+
};
|
|
564
|
+
list.forEach(function(item) {
|
|
565
|
+
if (!item || !item.value || PATTERN_FIELDS.indexOf(item.name) === -1) {
|
|
566
|
+
return;
|
|
567
|
+
}
|
|
568
|
+
var value = item.value;
|
|
569
|
+
if (typeof value !== 'string') {
|
|
570
|
+
value = String(value);
|
|
571
|
+
}
|
|
572
|
+
if (/\s/.test(item.value)) {
|
|
573
|
+
return;
|
|
574
|
+
}
|
|
575
|
+
switch(item.name) {
|
|
576
|
+
case 'url':
|
|
577
|
+
if (urlPattern) {
|
|
578
|
+
add(item);
|
|
579
|
+
} else {
|
|
580
|
+
urlPattern = item.value;
|
|
581
|
+
}
|
|
582
|
+
return;
|
|
583
|
+
case 'm':
|
|
584
|
+
case 'method':
|
|
585
|
+
return add(item, 'm');
|
|
586
|
+
case 'reqH':
|
|
587
|
+
case 'reqHeader':
|
|
588
|
+
case 'reqHeaders':
|
|
589
|
+
key = getHeaderKey(item.key);
|
|
590
|
+
return key && add(item, 'reqH', key);
|
|
591
|
+
case 'b':
|
|
592
|
+
case 'body':
|
|
593
|
+
case 'reqBody':
|
|
594
|
+
return add(item, 'b');
|
|
595
|
+
case 's':
|
|
596
|
+
case 'statusCode':
|
|
597
|
+
case 'status':
|
|
598
|
+
return add(item, 's');
|
|
599
|
+
case 'resH':
|
|
600
|
+
case 'resHeader':
|
|
601
|
+
case 'resHeaders':
|
|
602
|
+
key = getHeaderKey(item.key);
|
|
603
|
+
return key && add(item, 'resH', key);
|
|
604
|
+
}
|
|
605
|
+
});
|
|
606
|
+
if (urlPattern || result.length) {
|
|
607
|
+
result.unshift(urlPattern || '*');
|
|
608
|
+
}
|
|
609
|
+
return result.join(' ');
|
|
610
|
+
}
|
|
611
|
+
|
|
529
612
|
exports.utils = {
|
|
613
|
+
createPattern: createPattern,
|
|
530
614
|
isUtf8: isUtf8,
|
|
531
615
|
getText: getText,
|
|
532
616
|
getUtf8Buf: getUtf8Buf,
|
package/bin/util.js
CHANGED
|
@@ -193,7 +193,7 @@ exports.getBody = function (res, callback, isRaw) {
|
|
|
193
193
|
res.on('data', function(data) {
|
|
194
194
|
resBody.push(data);
|
|
195
195
|
});
|
|
196
|
-
res.
|
|
196
|
+
res.once('end', function() {
|
|
197
197
|
resBody = Buffer.concat(resBody);
|
|
198
198
|
try {
|
|
199
199
|
callback(null, isRaw ? resBody : JSON.parse(resBody.toString()));
|
|
@@ -6,21 +6,23 @@ module.exports = function(req, res) {
|
|
|
6
6
|
var body = req.body;
|
|
7
7
|
var list;
|
|
8
8
|
var exists = values.exists(body.name);
|
|
9
|
-
if (
|
|
10
|
-
if (
|
|
11
|
-
if (body.
|
|
12
|
-
|
|
9
|
+
if (!exists || !body.graceful) {
|
|
10
|
+
if (values.add(body.name, body.value, body.clientId) != null) {
|
|
11
|
+
if (isGroup(body.name)) {
|
|
12
|
+
if (body.focusName) {
|
|
13
|
+
values.moveTo(body.name, body.focusName, body.clientId);
|
|
14
|
+
}
|
|
15
|
+
} else if (body.groupName) {
|
|
16
|
+
values.moveToGroup(body.name, body.groupName);
|
|
17
|
+
} else if (!exists) {
|
|
18
|
+
var group = values.getFirstGroup();
|
|
19
|
+
group && values.moveTo(body.name, group.name, body.clientId, null, true);
|
|
13
20
|
}
|
|
14
|
-
} else if (body.groupName) {
|
|
15
|
-
values.moveToGroup(body.name, body.groupName);
|
|
16
|
-
} else if (!exists) {
|
|
17
|
-
var group = values.getFirstGroup();
|
|
18
|
-
group && values.moveTo(body.name, group.name, body.clientId, null, true);
|
|
19
21
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
if (body.recycleFilename) {
|
|
23
|
+
recycleBin.remove(body.recycleFilename);
|
|
24
|
+
list = recycleBin.list();
|
|
25
|
+
}
|
|
24
26
|
}
|
|
25
27
|
res.json({
|
|
26
28
|
ec: 0,
|