Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions biz/webui/cgi-bin/init.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ module.exports = function(req, res) {
epm: config.epm,
custom1: properties.get('Custom1'),
custom2: properties.get('Custom2'),
maxReqMergeSize: properties.get('maxReqMergeSize') || 1024 * 1024,
hasInvalidCerts: ca.hasInvalidCerts,
supportH2: config.enableH2,
lastLogId: lastLog && lastLog.id,
Expand Down
9 changes: 9 additions & 0 deletions biz/webui/cgi-bin/set-max-req-merge-size.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
var properties = require('../../../lib/rules/util').properties;

var DEFAULT_SIZE = 1024 * 1024; // 1MB

module.exports = function(req, res) {
var size = parseInt(req.body.size, 10);
properties.set('maxReqMergeSize', size);
res.json({ ec: 0, size: properties.get('maxReqMergeSize') || DEFAULT_SIZE });
};
18 changes: 9 additions & 9 deletions biz/webui/htdocs/js/index.js

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions biz/webui/htdocs/src/js/data-center.js
Original file line number Diff line number Diff line change
Expand Up @@ -606,6 +606,7 @@ $.extend(
enableHttp2: 'cgi-bin/enable-http2',
abort: 'cgi-bin/abort',
setCustomColumn: 'cgi-bin/set-custom-column',
setMaxReqMergeSize: 'cgi-bin/set-max-req-merge-size',
addRulesAndValues: {
url: 'cgi-bin/add-rules-values',
contentType: 'application/json'
Expand Down Expand Up @@ -795,6 +796,7 @@ exports.getInitialData = function (callback) {
exports.custom2 = data.custom2;
exports.custom1Key = data.custom1Key;
exports.custom2Key = data.custom2Key;
exports.maxReqMergeSize = data.maxReqMergeSize;
initialData = data;
clientId = data.clientId;
DEFAULT_CONF.data.clientId = clientId;
Expand Down
32 changes: 31 additions & 1 deletion biz/webui/htdocs/src/js/network-settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,11 @@ var Settings = React.createClass({
var dragger = columns.getDragger();
var urlType = storage.get('urlType');
dragger.onDrop = dragger.onDrop.bind(this);
return $.extend(this.getNetworkSettings(), { dragger: dragger, urlType: urlType === '-' ? '-' : '' });
return $.extend(this.getNetworkSettings(), {
dragger: dragger,
urlType: urlType === '-' ? '-' : '',
maxReqMergeSize: dataCenter.maxReqMergeSize || 1048576
});
},
getNetworkSettings: function () {
return $.extend(dataCenter.getFilterText(), {
Expand Down Expand Up @@ -133,6 +137,16 @@ var Settings = React.createClass({
onRowsChange: function (e) {
NetworkModal.setMaxRows(e.target.value);
},
onMaxReqMergeSizeChange: function (e) {
var self = this;
var size = parseInt(e.target.value, 10);
dataCenter.setMaxReqMergeSize({ size: size }, function (data) {
if (data && data.ec === 0) {
dataCenter.maxReqMergeSize = data.size;
self.setState({ maxReqMergeSize: data.size });
}
});
},
showDialog: function () {
var settings = this.getNetworkSettings();
this.setState(settings);
Expand Down Expand Up @@ -489,6 +503,22 @@ var Settings = React.createClass({
<option value="3000">3000</option>
</select>
</label>
<label className="w-network-settings-own">
Max ReqMerge Size:
<select
className="form-control"
onChange={self.onMaxReqMergeSizeChange}
value={state.maxReqMergeSize || 1048576}
>
<option value="262144">256KB</option>
<option value="524288">512KB</option>
<option value="1048576">1MB</option>
<option value="2097152">2MB</option>
<option value="4194304">4MB</option>
<option value="8388608">8MB</option>
<option value="16777216">16MB</option>
</select>
</label>
<label className="w-network-settings-own">
<input
checked={dataCenter.isOnlyViewOwnData()}
Expand Down
1 change: 1 addition & 0 deletions docs/docs/gui/network.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ b:/"success":false/ m:POST s:200 H:api.example.com
| ----------------------------------------- | -------------------------------------------------------- |
| **Network Columns** | 自定义抓包列表显示的列(如状态码、方法、大小等) |
| **Maximum Rows** | 设置同时显示的最大抓包数量(防止内存溢出) |
| **Max ReqMerge Size** | 设置 [reqMerge](../rules/reqMerge) 规则处理请求体的最大大小(默认 1MB,可选 256KB ~ 16MB),超过该大小的请求体将不会被合并处理 |
| **Viewing only your computer's requests** | 只显示本机发出的请求(过滤其他设备/远程请求) |
| **ViewAll in new window** | 点击"View All"时在新窗口打开完整内容(适合大响应体查看) |
| **Show Tree View** | 以树状结构展示请求(按域名/路径分组) |
Expand Down
5 changes: 5 additions & 0 deletions docs/docs/rules/reqMerge.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ www.example.com/path2 reqMerge://https://www.xxx.com/xxx/params.json
www.example.com/path3 reqMerge://temp/blank.json
````

## 请求体大小限制
`reqMerge` 规则默认只处理请求体大小不超过 **1MB** 的请求。如果请求体超过该限制,将不会进行合并处理,请求体将原样发送。

可以在 [Network Settings](../gui/network#settings) 中通过 **Max ReqMerge Size** 选项调整该限制,支持的范围为 256KB ~ 16MB。

## 关联协议
1. 通过关键字或正则替换:[reqReplace](./reqReplace)
2. 修改响应内容对象:[resMerge](./resMerge)
Expand Down
1 change: 1 addition & 0 deletions docs/en/docs/gui/network.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ Different from the search box at the bottom of the Network list:
| ----------------------------------------- | -------------------------------------------------------- |
| **Network Columns** | Customize the columns displayed in the packet capture list (such as status code, method, size, etc.) |
| **Maximum Rows** | Set the maximum number of packets displayed simultaneously (to prevent memory overflow) |
| **Max ReqMerge Size** | Set the maximum request body size for [reqMerge](../rules/reqMerge) rule processing (default 1MB, range 256KB ~ 16MB). Request bodies exceeding this size will not be merged |
| **Viewing only your computer's requests** | Displays only requests sent by the local computer (filters requests from other devices/remote requests) |
| **View All in new window** | Click "View All" to open the full content in a new window (suitable for viewing large response bodies) |
| **Show Tree View** | Displays requests in a tree structure (grouped by domain name/path) |
Expand Down
5 changes: 5 additions & 0 deletions docs/en/docs/rules/reqMerge.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ www.example.com/path2 reqMerge://https://www.xxx.com/xxx/params.json
www.example.com/path3 reqMerge://temp/blank.json
````

## Request Body Size Limit
The `reqMerge` rule only processes request bodies up to **1MB** by default. If the request body exceeds this limit, it will not be merged and will be sent as-is.

You can adjust this limit in [Network Settings](../gui/network#settings) via the **Max ReqMerge Size** option, with a supported range of 256KB ~ 16MB.

## Associated Protocols
1. Replace with a keyword or regular expression: [reqReplace](./reqReplace)
2. Modify the response content object: [resMerge](./resMerge)
12 changes: 9 additions & 3 deletions lib/inspectors/req.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ var Buffer = require('safe-buffer').Buffer;
var mime = require('mime');
var pluginMgr = require('../plugins');
var config = require('../config');
var properties = require('../rules/util').properties;

var Transform = require('pipestream').Transform;
var WhistleTransform = util.WhistleTransform;
Expand All @@ -14,7 +15,11 @@ var ReplaceStringTransform = util.ReplaceStringTransform;
var FileWriterTransform = util.FileWriterTransform;

var JSON_RE = /{[\w\W]*}|\[[\w\W]*\]/;
var MAX_REQ_SIZE = 1024 * 1024;
var DEFAULT_MAX_REQ_SIZE = 1024 * 1024;

function getMaxReqSize() {
return properties.get('maxReqMergeSize') || DEFAULT_MAX_REQ_SIZE;
}
var MAX_HEADER_SIZE = 1024 * 8;
var CRLF = Buffer.from('\r\n');
var CR = CRLF[0];
Expand Down Expand Up @@ -159,12 +164,13 @@ function handleParams(req, params, urlParams) {
delete headers['content-length'];
transform = new Transform();
var interrupt;
var maxReqSize = getMaxReqSize();
transform._transform = function (chunk, _, callback) {
if (chunk) {
if (!interrupt) {
buffer = buffer ? Buffer.concat([buffer, chunk]) : chunk;
chunk = null;
if (buffer.length > MAX_REQ_SIZE) {
if (buffer.length > maxReqSize) {
interrupt = true;
chunk = buffer;
buffer = null;
Expand Down Expand Up @@ -204,7 +210,7 @@ function handleParams(req, params, urlParams) {
chunk = util.toBuffer(body);
}
buffer = null;
} else if (params) {
} else if (params && !interrupt) {
util.deleteProps(params, delProps);
var data = isJson ? JSON.stringify(params) : qs.stringify(params);
chunk = util.toBuffer(data);
Expand Down