- feat: 支持 whistle-client 搜索功能
- feat: Composer 支持导入 CURL 文本
- feat: 优化 Composer
- perf: 优化
enable://captureStream
- feat: Composer 支持通过右键发送按钮选择发送文件
- fix: 某些情况下解析配置规则里面的数据对象有误(v2.9.87版本引入)
- feat:
delete://reqType||resType|reqCharset|resCharset
- feat:
delete://resBody.xxx
删除响应的 JSON 数据可以 key - feat:
delete://reqBody.xxx
删除请求内容为表单或 JSON 的 JSON 数据对应 key - feat: Network 支持通过
/
快速聚集到搜索框
- feat: JSON View 右键菜单
Inspect Value
查看当前 key 对应的 Value 对象 - feat: JSON Dialog 添加前进和后退键查看历史记录
- feat: 通过 Whistle 构造的请求会在 Network 的 Order 里面加特殊标识
- feat: 支持显示 sse 内容(默认只对非 gzip 及 content-length 头小于 2m 的请求生效,其它类型请求可以通过
enable://captureStream
强制开启) - fix: avwo/whistle-client#60
- fix: #1145
- feat: 证书默认格式改成 cer 以适配更多机型(涉及:短链接,二维码,点击下载)
- fix: 某些浏览器没有发送
sec-fetch-site
导致内部请求误判为跨域请求问题
- fix: nodejs/node#52681
- fix: #1137
- feat: 新增参数
--allowOrigin
用于设置允许哪些第三方页面访问 Whistle 的内部接口 - feat: 插件的 rules.txt 文件支持引入 3 个远程规则
@path
,之前版本只支持1个
- feat: Overview、Inpsectors 支持自定义右键菜单
- feat: 支持通过
-M
dnsResolve
、dnsResolve4
、dnsResolve6
改 dns 方法 - refactor: 优化界面,
dns.lookup
失败使用dns.resolve
或dns.resolve6
重试
- feat: 支持设置 URL 列不显示请求参数
- feat: 域名为 IP 的 HTTPS 请求不解包
- fix: 远程部署可能出现
captureError
问题 - feat: 优化界面
- feat: 优化 Dark 模式样式,并重新调整为默认不跟随系统的 Dark 模式
- feat: 根证书过期后,可以通过
w2 ca
更新根证书
- feat: 保留无法识别的
accept-encoding
请求头 - feat: Rules 里面的规则如果未发生改变,点击 Save 也可以启用规则
- feat:
statusCode://401
默认会弹出输入用户名和密码的登录框,可以通过disable://userLogin
或lineProps://disableUserLogin
去掉登录框
- feat:
locationHref://url
和redirect://url
自动去重 - feat: 支持通过
jsPrepend://
设置window.__WHISTLE_PATH_PREFIX__ = '/path/to';
(可以配置规则或集成在插件) 修改 Whistle 内部路径/.whistle-path.5b6af7b9884e1165/
改成${window.__WHISTLE_PATH_PREFIX__}/.whistle-path.5b6af7b9884e1165/
,方便通过 ngnix 转发(ngnix 可以把/path/to
路径去掉再发送给 Whistle)
- refactor: 删除所有 q 模块,解决安装告警问题
- refactor: 优化 sse 请求的
resReplace
逻辑 - fix: 界面
Enable HTTP/2
报错问题 - feat: 新增
locationHref://url
和locationHref://js:url
协议,相当于在 html 页面或 js 文件返回window.location.href = url
1.fix: #1098
- feat: 新增启动参数
-M ipv4first|ipv6first
用于设置 dns.lookup的 options.order 参数 - feat:
localhost
的 dns.lookup 默认使用ipv4first
- feat: Online 支持设置
Verbatim
、IPv4-first
、IPv6-first
- feat: 支持
delete://query.xxx
删除请求 url 里面的参数
- fix: socks 代理无法获取 clientIp 及 IPv6 转发问题
- feat: 自动更新 Rules & Values
- feat: Mock 对话框新增 Create 按钮
- feat: 插件列表添加自定义右键菜单
- feat: 支持通过
pattern jsAppend://[value|file|url] linePropslineProps://nomodule lineProps://module lineProps://defer lineProps://async lineProps://crossorigin
设置标签属性
- fix: #1064
- feat: 支持通过
http://local.whistlejs.com/?dataUrl=encodeURIComponent(dataUrl)
导入dataUrl
返回的数据
- feat: 新增
enable://abortRes
在响应阶段中断请求 - feat: 优化界面展示
- feat: 新增
enable://requestWithMatchedRules
及enable://responseWithMatchedRules
支持在请求头或响应头带上当前匹配的规则 - feat: 调整 Tools/Console 日志的缓存大小
- feat: Values 的编辑器添加快捷键
Shift + Ctrl[Command] + F
、Shift + Ctrl[Command] + I
分别用来格式化和通过 JSONView 查看 JSON 数据 - feat: Whistle 默认会对 WebSocket 压缩包进行解压,有[用户反馈存在解压bug][https://github.com/avwo/whistle/issues/1048],故新增
wss://xxx disable://wsDecompress
禁止解压数据包 - feat: WebSocket Frames 列表添加右键功能
- feat: 支持通过正则表达式搜索日志
- feat: 支持通过
disable://captureHttp disable://captureHttps
关闭 http 或 https 的 TUNNEL 请求
- feat: 支持 Rules 里面的 Values 和临时文件通过 Ctrl[Command] + 鼠标点击快速修改
- feat: 新增默认临时空白文件
temp/blank
(支持自定义后缀temp/blank.xxx
)可以通过在 Rules 新建文件
protocol://temp/blank.xxx
再通过Ctrl[Command] + 鼠标点击快速修改生成新的临时文件 - feat: Values 右键菜单新增 JSON / Inspect 查看 JSON 数据对象
- feat: Mock 功能支持对临时文件添加注释
- feat: 优化 Rules & Values 的拖拽功能
- fix: #1040
- feat: 支持 Cookie 的
Partitioned
属性(该属性需要跟Secure
、SameSite=None
一起使用) - feat: Composer 添加
CopyAsCURL
按钮 - feat: Composer 添加
ProxyRules
选项,去选后可以禁用 Proxy (Whistle) 设置的所有规则(Proxy 里面的规则优先级高于 Composer Rules)
- chore: 更新 CodeMirror 版本
- feat: Network Settings 支持导入导出
- feat: Rules & Values 支持通过
b:keyword
搜索内容 - feat: Composer 支持导入导出
- feat: 插件 Option 支持设置
openInModal
以对话框形式打开 - feat: Network 列表新增
Back to the bottom
按钮
- fix: #1012
- feat: 支持 #978
- feat: 客户端支持直接使用 WebView 预览抓包内容
- feat: Network 右键菜单 Mock > Export,通过插件或拖拽导入 Mock 数据
- feat: 插件支持
window.whistleBridge.download({name, value[, base64]})
下载指定数据 - feat: 新增特殊路径
/_WHISTLE_5b6af7b9884e1165_/
,Whistle 会自动将url 里面第一个此路径片段替换成/
- feat: Composer 添加修改请求参数按钮
Params
- feat: Composer 面板优化
- feat: Composer 添加 Cookies 按钮方便获取当前抓包记录里面对应域名的 Cookie
- feat: 支持通过启动参数
uiExt
往页面注入 js 或 html (把 Whistle 作为第三方 npm 包使用时可用)uiExt?: { required?: boolean; htmlPrepend?: string; htmlAppend?: string; jsPrepend?: string; jsAppend?: string;
}; ```
- feat: 支持通过
Online / IPv6-only network
强制 dns 获取 ipv6(命令行版本还可以通过-M ipv6Only
开启) - feat:
w2 add
命令支持type: module
- feat: 显示
captureError
,且可以通过插件获取到这类型错误的抓包数据 - fix: 完善
refreshPlugins
方法(内部方法)
- fix: 修复 Dark Mode 模式下图片显示问题
- fix: JSON 过滤搜索时保留数组的 index
- feat: 支持通过
enable://forHttp|forHttps
设置enable://capture
只对 http 或 https 生效 - feat: 支持通过请求参数设置登录态
- feat: 支持
Dark Mode
,且可以通过界面Online -> 打开对话框 -> Disable dark mode
关闭自动切换Dark Mode
- feat: 跨域请求本地替换自动设置 cors,可以通过
disable://autoCors
或lineProps://disableAutoCors
关闭
- fix: #912
- fix: Node 20.1.0 版本
http.request
只支持通过options.search
设置参数问题 - feat: 支持通过
--uiport "127.0.0.1:8080"
限制 WebUI 只能通过指定网卡和端口访问
- fix:
headerReplace://req.host:pattern=value
无效问题 - feat: 插件添加
sharedStorage
方便插件在不同实例中共享存储数据 - style: #898
- feat: 插件扩展的右键菜单和 Tab 添加
exportSessions(sessions, type, name)
方法 - feat: 插件 server 的 options 添加
generateSaz(sessions): Buffer
和extract(saz: Buffer, cb(sessions))
方法 - refactor: 兼容 saz 的 comment,需要配合插件使用:https://github.com/whistle-plugins/whistle.comment.git
- fix: 修复访问 socks 代理可能出现 pending 的问题
- style: 界面优化
- refactor: 解决安装时依赖包安全警告问题
- feat: 支持自定义右键菜单获取树结点下的所有抓包数据
- feat: 扩展 Tab 支持
copyText
方法 - feat:
tpl
协议支持模板字符串语法
- feat: 插件界面提供
copyText
方法 - feat: 支持
lineProps://strictHtml
和lineProsy://safeHtml
只对当前行的规则生效 - style: Mock Dialog 支持直接保存 Value
- fix: 解决
qs
模块不存在问题
- feat: 允许通过
enable://capture
解析 socks 代理的 HTTPS 请求 - feat: 支持通过 Network 右键菜单
Mock
按钮快速创建规则:http://wproxy.org/whistle/webui/mock.html
- style: 支持自动提示 Values 的 Key
- style: Composer 的 History 选项改成箭头按钮
- feat: 支持批量删除 Rules & Values
- fix: Network Settings 列设置刷新失效问题
- style: WebForm 支持显示 JSON 对象
- style: Preview 优先显示 JSON View
- refactor:
Network / Tools / Console & Server
支持捕获unhandledrejection
的错误信息,且Console & Server
最大缓存日志条数调整为 230 - feat: 支持 earlyHints
- feat: JSONView 右键支持
Expand All
及Collapse All
- feat: JSON View 支持搜索
- feat: 自动记录用过的 npm registry
- feat: 模板字符串支持
${env.xxx}
获取环境变量xxx
对应的值 - feat: 支持通过环境变量
excludeFilter://env.xxx=pattern
- style: 匹配 map local 的抓包字体颜色显示成黑色
- refactor:
req.passThrough(handleReq?, handleRes?)
提供更多功能req.passThrough(function(rawBuffer, next, ctx) { ctx.getText((err, text) => { console.log(err, text); }, encoding?); // 自动 unzip 并转成字符串,字符编码 encoding 可选 ctx.getJson((err, text) => { console.log(err, text); next({ body: rawBuffer, rules: '* file://(abc)' }); }, encoding?); // 自动 unzip 并转成json }, function(rawBuffer, next, ctx) { ctx.getText((err, text) => { console.log(err, text); }, encoding?); // 自动 unzip 并转成字符串,字符编码 encoding 可选 ctx.getJson((err, text) => { console.log(err, text); next({ body: rawBuffer, rules: '* file://(abc)' }); }, encoding?); // 自动 unzip 并转成json });
- fix:
resCookies://
设置失败问题
- feat: 支持通过插件的配置
whistleConfig.networkColumn: { title: 'xxx', key: 'xxx', width: 90 }
扩展 Network 表格的列 - feat: 支持通过插件的配置
whistleConfig.webWorker: path
自定义脚本在界面中执行,可以结合自定义列的功能实现查看接口返回错误码(后续补例子) - feat: 插件处理非 WebSocket 及 Socket 请求的
req.passThrough(handleReq?, handleRes?)
支持传人两个方法(可选)获取请求或响应内容并返回请求内容及规则req.passThrough(function(buffer, next) { next({ body: buffer, rules: '* file://(abc)' }); }, function(buffer, next) { next({ body: buffer, rules: '* resCookies://x-test=123' }); });
- refactor:
delete://resCookie.xxx
和delete://cookie.xxx
可以删除浏览器中的 cookie(只支持path: /
及Domain=父代
或本域名) - style: Network 右键菜单支持
Copy Cell Text
- feat: Netwok 的 table 表头支持通过右键调整列宽度
- feat: Network / Settings 自定义列支持设置关联的
Data Key
,可以在界面获取抓包数据,无需配置style
> 可以通过 Network 抓包列表右键菜单 / Open / Source 获取想要的Data Key
- fix: 复制 curl 命令是请求内容换行符处理有误的问题
- fix:
Network / Tools / Console
的 Filter 问题,及 Console 采用浏览器的时间 - refactor: 远程 rulesValue 加载异常记录日志
- feat: 支持通过
delete://urlParams.xxx
删除名称为xxx
的请求参数 - feat: 支持通过
delete://reqCookie.xxx
删除名称为xxx
的请求 cookie - feat: 支持通过
delete://resCookie.xxx
删除名称为xxx
的响应 cookie - feat: 支持通过
delete://cookie.xxx
删除名称为xxx
的请求及响应 cookie上述删除 cookie 操作只会上述请求或响应阶段的 cookie,不会影响已存在浏览器的 cookie
- fix: 路径有特殊字符的域名通配规则可能导致启动失败
- refactor: 彻底删除 Files 菜单
- style: 添加删除整个分组的按钮
- style: 优化 Composer 交互及修复界面的一些问题
- fix: #789
- refactor: 优化插件的环境变量,支持通过
hintSuffix
自定义提示信息
- feat: 支持通过插件设置规则模板,详见:https://wproxy.org/whistle/plugins.html
- fix: 修复代理响应 407 问题:#776
- fix: 导出 har 后再导入改 har 时请求内容可能发生变化问题
- feat: headless 模式支持加载插件及抓包数据
- feat: 支持通过
-M agent
启动复用连接模式
- fix: #759
- style: 支持在
Request / WebForms
显示上传表单数据 - style: 弱化有新版本时的界面提醒
- refactor: 减少安装包体积
- fix: 分组状态下保留数据发送两次请求导致无法一直启用规则问题
- fix: 导出 saz 后原始 url 可能无法正常显示问题
- refactor: 优化插件开发调试,参见:https://github.com/avwo/lack
为跟 Homebrew 版本保持一致,跳过此版本
- refactor: 设置代理只需输入一次 root 密码:#746
- fix: M1 Pro 上执行
brew install whistle
安装 Whistle 失败问题
- fix: 修复部分插件规则优先级问题
- feat: 支持通过
pattern operation lineProps://important
提升规则的优先级
- feat: Rules 与 Values 支持分组
- fix:
resCors://origin=xxx
失效问题
- fix:
resCors://*
失效问题
- feat: 支持自定义
Upgrade
请求协议 - fix:
enable://proxyFirst
可能出现重复请求问题
- fix: 请求经过代理后
x-whistle-client-id
丢失问题 - feat: 支持在
Network / Tools
里面自定义 Tab,详见:https://github.com/whistle-plugins/examples/tree/master/whistle.view-md5
- fix: 规则列表无法拖动排序问题
- refactor:
enable://clientId
对所有请求生效(之前只对批评设置代理规则的请求生效) - docs: 调整 README
- style: 添加
Replay Times
和Repeat Times
菜单,最多可以重放请求 100 次 - refactor:
compose
cgi 支持设置repeatTimes
(不能超过 100 次) - feat: 新增 CGI
/rules
/values
/rules?name=xxx
/values?name=xxx
获取 Whistle 的当前启用的规则和指定规则
- feat: 支持通过
w2 ca [host:port]
安装对应 Whistle 代理的根证书(不填参数,默认加载当前本机运行版本) - feat: 支持通过
w2 start[restart|run] --init [bypass]
启动时同时设置代理和安装根证书,利用此特性可以实现通过npm i -g whistle && w2 restart --init
一键安装 Whistle - feat: 支持上传
.cer
及.pem
证书 - feat: 支持通过
process.env.WHISTLE_MODE
定义启动参数-M xxx
- fix:
utf8
编码不支持0x7f
字符问题
- feat: 支持通过命令行
w2 proxy [off] [port] [host:port] [-x bypass]
设置系统的全局代理w2 proxy
: 设置全局代理127.0.0.1:port
,port 为运行的默认实例的端口(storage
为空),如果没有默认实例则为8899
w2 proxy -x "<local>, domain1, domain2"
: 设置全局代理127.0.0.1:port
,port 为运行的默认实例的端口(storage
为空),如果没有默认实例则为8899
,并设置不代理域名白名单w2 proxy 8899
: 设置指定端口的代理,host 默认为127.0.0.1
w2 proxy www.test.com:8080
或w2 proxy www.test.com:auto
: 指定代理的 host 和 portw2 proxy www.test.com:8080 -x "<local>, domain1, domain2"
: 组合应用w2 proxy off
: 关闭全局代理
- refactor: 内联规则
protocol://(key1=value1&key2=value2...)
不再自动decodeURIComponent
- refactor: 如果内联规则
protocol://key1=value1&key2=value2...
无()
,会先检测下对应文件是否存在,不存在就当成protocol://(key1=value1&key2=value2...)
处理
- fix: #726
- refactor: 优化
excludeFilter://host=pattern
- fix: 使用
https2http-proxy://host:port
时,某些post
请求无法正常发送问题 - fix: 确保模板字符串的
clientId
优先获取传过来的请求clientId
(需要用本地的clientId
可以使用localClientId
)
- feat: 添加
skip
协议, skip 与 ignore 的区别,ignore 是将匹配的规则删除掉,skip 是跳过指定的规则不做匹配 - fix: nodejs/node#42787
- feat: 支持通过
w2 i 任意url
安装插件 - feat: 支持插件通过
options.getPlugins(cb)
获取当前 Whistle 安装的插件信息 - feat: 支持通过
ignore://matcher=xxx
(等价于ignore://operator=xxx
)、ignore://pattern=xxx
删除指定匹配的规则 - style: 插件
Sync
功能支持获取历史记录列表
- fix: TUNNEL 代理的 HTTP 请求被拦截后一些代理请求头的透传问题
- feat: 支持通过
w2 i git-url
安装插件
- style: 下次打开 Plugins 页面自动打开之前已打开的插件 Tab
- refactor:
w2 add
可以设置的规则大小由 16k 改成 256k - fix: TUNNEL 请求帧数据可能显示不全问题
- fix: 长连接里面的帧数据可能展示补全问题
- fix: 经过插件转发后的请求 client id 丢失问题
- refactor: 如果启动绑定网卡,将网卡显示到 Online 里面
- style: Tunnel 代理,支持通过请求头或响应头的
x-whistle-transport-protocol
自定义Protocol
显示,响应头优先
- fix: auth 插件钩子可能对被拦截的 tunnel 请求不生效问题
- style: 支持导出的数据自带 Node 和 Whistle 的版本号
- feat: 插件支持通过 package.whistleConfig.peerPluginList 配置安装插件式自动加载的关联插件列表(最多不超过 15 个插件)
- feat:
redirect
归类为rule
与file
、statusCode
等协议同级别 - refactor: 添加 ts 描述文件
- refactor:
w2 i plugin
支持w2 i plugin@version
- fix: Node 16 引入
req.filter
方法引发的问题
- feat: 支持启动参数设置
options.server
方便第三方服务集成server
可以为http.Server
或events.EventEmitter
对象,在第三方应用中可以通过server.emit('request'| 'upgrade' | 'connect', req, res)
将请求交给 Whistle 处理 - feat: 支持通过插件引入远程 Value:
protocol://$plugin/xxx
,这种配置会自动从插件 whistle.plugin uiServer 的/api/key/value?key=xxx
获取对应的值 - refactor: 优化错误日志路径 &
w2 status --all
显示进程 id - refactor: 支持 HTTP2 的 Node 最低版本有 12 调整为 14(低版本的 HTTP2 模块存在一些 bug)
- fix: #697
- feat: 支持通过
pattern enable://clientIp
让 Whistle 自动设置x-forwarded-for
请求头 - style: Values 编辑器支持 JSON 对象折叠,详见:#683
- refactor: Whistle 的日志统一放
$WHISTLE_PATH/whistle.log
文件,默认为~/.WhistleAppData/whistle.log
- style: 修复禁用所有插件编辑器对应插件规则无法显示插件已失效的问题
- style:
Frames
移入Inspectors
- feat: 将请求匹配的 pattern 传给插件,可以通过
req.originalReq.isRegExp
及req.originalReq.pattern
获取 - feat: 支持自定义 Inspectors tab,详见:https://github.com/whistle-plugins/examples/tree/master/whistle.view-md5
- feat: 支持自定义 Composer tab,详见:https://github.com/whistle-plugins/examples/tree/master/whistle.view-md5
- refactor: 插件全局异常也会写入启动目录的日志文件
whistle.log
,且支持插件通过process.handleUncaughtPluginErrorMessage = (errMsg) => {}
获取全局异常信息,且可以通过return false
来禁止插件自动退出
- fix: 插件的 sniCallback 返回
false
请求没有重新走 TUNNEL 代理问题 - refactor: 如果插件接收到的请求是 https,则
req.url
将为完整的路径
- feat: 支持自定义
inspectors tab
,详见:https://github.com/whistle-plugins/examples/tree/master/whistle.view-md5 - feat: 支持通过
disable://abort
禁用enable://abort
- feat: Whistle 默认显示的抓包数据不超过 1.5m,可以通过
enable://bigData
扩大到2.5m
- feat: 支持通过
enable://useLocalHost
和enable://useSafePort
修改 log 和 weinre 请求 URL 的域名或端口 - style: 界面提供
api.selectIndex
选中指定下标的抓包数据 - feat: 支持插件获取
originalReq.remoteAddress
与originalReq.remotePort
- feat:
--httpsPort
启动的 HTTPS Server 支持从插件获取证书 - feat: 支持通过
excludeFilter://from=httpServer
、includeFilter://from=httpsServer
、excludeFilter://from=httpServer
、includeFilter://from=httpsServer
过滤请求
- refactor: 禁止通过页面上传根证书
root.key & root.crt
- refactor: Whistle 自动生成的证书过期时自动续期(有效期一年)
- feat: 支持通过
ignore://-*
过滤ignore://*
- feat: 支持
proxy
和pac
配置lineProps://proxyHostOnly
,当用户配置了host
代理才会生效 - feat: 非 SNI 请求也支持通过插件自定义证书,且支持直接上传和删除用户自定义证书
- fix: 可能无法导入 saz 文件问题
- fix: #657
- feat: 插件
server
钩子支持通过req.setReqRules & req.setResRules
设置动态规则 - feat: 支持通过
enable://forceReqWrite
和enable://forceResWrite
强制reqWrite
、reqWriteRaw
和resWrite
、resWriteRaw
- feat:
reqWrite:///path/to/
和reqWrite:///path/to
加以区别,前者会自动把根路径补成index.html
- feat: 插件的 auth hook 默认情况下如果开启了捕获 https,则对这部分请求只会对解析后的 https 请求生效,如果需要对隧道代理生效可以设置
enable://authCapture
- feat: 默认不启用
x-forwarded-host
和x-forwarded-proto
直接放过,可以通过以下方式启用:- 启动参数
-M x-forwarded-host|x-forwarded-proto
- 请求进入 Whistle 之前设置请求头
x-whistle-forwarded-props: host,proto,for,clientIp,ip
- 启动参数
- feat:
resMerge://json1 resMerge://json2
默认采用extend({}, json1, json2)
,新版支持通过resMerge://json1 resMerge://json2 resMerge://true
开启extend(true, {}, json1, json2)
- refactor: 插件规则里面的 req 和 res rules 分开执行
- refactor: 优化获取证书逻辑,合并多次相同请求
- refactor: 处理
unhandledRejection
事件 - feat: 支持通过请求头设置响应规则
- fix: sniCallback 内存泄露问题
- feat: 支持启动
--cluster [workers]
模式,通过该方式可以启动多进程模式(worker 为 Whistle headless) - fix: 启动时绑定非
127.0.0.1
网卡,插件远程规则访问失败问题
- fix: #643
- fix: WebSocket 无法抓包问题
- fix: 插件用到
storage.setProperties
失效问题 - feat: 插件
whistleConfig
支持配置inheritAuth
复用 Whistle 的登录账号
- feat: 支持通过插件
sniCallback(req, options)
hook 获取远程证书 - feat: 支持通过
--config localFile
加载启动配置,优先级高于命令行
- fix: 某些情况下响应 stream pause 问题
- refactor: 优化
w2 stop
,找不到指定实例时自动显示当前所有运行的实例 - style: 支持将 Rules 添加到最前面
- refactor: 优化
lineProps://proxyHost|proxyTunnel|proxyFirst
- style: 优化显示 Composer 历史记录列表
- style: 禁用 Rules、Plugins 显示小黄条提醒
- feat: 插件 auth 方法支持
req.setRedirect(url);
- perf: 优化启动速度
- fix: 修复第三方集成时,一些内部请求转发问题
- fix: 清除搜索框历史记录 js 报错问题
- feat: 普通 HTTP 请求也支持
customParser
(或customFrames
):https://github.com/whistle-plugins/whistle.custom-parser
- fix: Cannot read property 'headers' of undefined
- feat: HTTP2 支持非 HTTPS 请求
- feat: 插件支持通过
options.getCert(domain, (cert || '') => {})
获取指定域名证书 - refactor: 优化
reqDelay
和resDelay
实现
- feat: 支持插件设置
tunnelKey
将指定的隧道代理请求头带到解开后的 http/https/ws 请求头 - feat: 插件
auth
方法支持处理 Whistle 的内部请求 - feat: 插件
auth
支持设置req.showLoginBox
弹出登录框 - style: 显示 UI 请求情况
- refactor: 优化内部请求转发逻辑的实现方式
- feat: WebSocket 和 Tunnel 请求支持
replaceStatus
- fix: Maximum call stack size exceeded
- perf: 去掉
Empty Request
,减少内存及 CPU 占用 - style: Network 的
Body
支持显示请求内容大小
- feat: 插件支持通过
options.require
直接引用 Whistle 里面的第三方模块或文件 - refacto: 插件在不同实例使用不同的存储目录
- fix: 特殊情况下 Whistle 无法展示 WebSocket 前几个请求帧问题
- feat: 支持在模板字符串里面通过
clientPort
和serverPort
分别获取客户端和服务端端口 - refactor:
alert
、confirm
、prompt
等浏览器内置的窗口改用自定义实现,防止 https://www.chromestatus.com/feature/5148698084376576
- fix:
reqReplace
及resReplace
可能因为拆包导致匹配不准确问题 - fix: Rules 编辑器行首字母输入
!
报错问题
-
feat: 插件 hook 支持
async-await
:``` js module.exports = async (server, options) => { // ... do sth }; ```
-
feat:
pipe://xxx
支持插件内部通过req.originalReq.ruleValue
获取xxx://value
的value
值
- feat: 支持通过
-M disableForwardedHost
禁止 Whistle 使用x-forwarded-host
请求头,默认 Whistle 会用该请求头作为请求 URL 的域名 - feat: 支持通过
-M disableForwardedProto
禁止 Whistle 使用x-forwarded-proto
请求头,默认当该请求头值为https
时, Whistle 会把请求当成 HTTPS 处理 - feat: 第三方通过
const proxy = startWhistle(options);
启动 Whistle 时,可以通过proxy.on('perfDataChange', (perfData) => {})
获取 cpu、内存、请求量等数据 - refactor: 第三方通过
const proxy = startWhistle(options);
启动 Whistle 时,可以通过proxy.on('pluginLoad', child, name, moduleName);
、proxy.on('pluginLoadError', err, name, moduleName);
监听插件启动信息
- feat: 支持
pattern %plugin=xxx
- feat: 支持插件通过
options.getTop(data => data && console.log(data))
获取所在 Whistle 的 CPU、内存及请求量等信息
- feat: 源码目录添加 Dockerfile: #601
- feat: 支持在插件的根目录执行
w2 run
时自动加载该插件 - refactor: 设置
resCors://enable
如果请求头不存在origin
则自动忽略该设置 - fix: #600
- fix: pipe 无法直接透传 WebSocket 的二进制包问题
- style: 支持显示自定义根证书及删除自定义证书导引
- style:
pipe
支持智能提示
- feat: 支持通过类似
--dnsServer http://dns.alidns.com/resolve
自定义dns-over-https
服务: #439 - style: 优化错误提示
- feat: 支持通过
disable://interceptConsole
禁止log://
拦截console
的请求,用户只能通过代码window._whistleConsole && _whistleConsole.xxx(a, b, ...)
记录日志 - feat: 支持在规则里面同时设置多个s
%plugin-name=xxxx
(最多 10 个),Whistle 会自带将这些值带到插件的对象:req.originalReq.pluginVars
- refactor: 显示插件转发的 HTTP 协议
- refactor: 调整
delete://reqH.xxxx
的时机
- style: 优化左侧菜单
- styl: 修复 Values 右键菜单 Copy / Key 弹出创建新 key 输入框问题
- feat: 支持设置
-M shadowRules
(抓包 + 设置 shadowRules) 或-M shadowRulesOnly
(无法查看抓包)
- feat: 支持通过命令行参数
--dnsServer "1.1.1.1,8.8.8.8,10.3.2.1:8080"
自定义 DNS server > 如果需要请求自定义 DNS server 出错时自动转成默认可以用:--dnsServer "1.1.1.1,8.8.8.8,10.3.2.1:8080,default"
> 自定义 DNS server,默认是获取 IPv4,如果需要获取 IPv6,要手动指定--dnsServer "2001:4860:4860::8888,[2001:4860:4860::8888]:1053,ipv6"
- fix: 修复 List View 通过表头排序后无法 Reset 的问题
- fix: Tree View 抓包数据满了后无法自动更新问题
- feat: Network 支持 Tree View 展示
- feat:
pac
支持设置用户名密码:pac://user:pass@pacPath
- style: 支持显示
Raw Url
详见:#572
- fix: 解决规则文件名称过长保存失败的问题
- feat: 域名统配也支持获取子匹配内容
- refactor: 优化命令行启动输出的信息
- feat: 编辑器
Show Line Number
时,双击行数可以注释或取消注释 - feat:
Network / Tools / Toolbox
支持将对象转成Query
参数 - style: 支持扩展
util.openEditor(value)
方法
- chore: #559
- style: Network 搜索框支持最多3个关键字过滤
- style: Network 右键菜单新增
Open/Source
查看当前抓包数据的源码 - refactor:
onSocketEnd
添加timeout
事件,兼容各种诡异行为 - refactor: 优化内部连接管理
- feat: 支持通过 url 参数的 clientId 过来抓包数据
- feat: 支持通过
disable://proxyConnection
将代理转发头改为Proxy-Connection: close
- perf: 确保及时关闭无用连接,减少内存占用
- style: Online 支持显示 QPS,及 内存、CPU、QPS 的最大值
- refactor: 处理处理请求过程中无法捕获的异常
- feat: 支持导出 har 文件
- feat: 支持设置
-M "disabledBackOption|disabledMultipleOption|notAllowDisableRules"
- feat: 内部路径
/...whistle-path.5b6af7b9884e1165...///
支持设置域名/...whistle-path.5b6af7b9884e1165...///__domain__port__/path/to
(port__
可选) 或/...whistle-path.5b6af7b9884e1165...///path/to?_whistleInternalHost_=__domain__port__
(port__
可选)
- feat: 支持通过
--shadowRules jsonString
导入规则到 Rules - style: 支持通过设置请求参数
disabledEditor=1
将 Rules & Values 编辑框设置为只读模式
- fix:
excludeFilter
includeFilter
混合配置时结果错乱问题 - feat: 支持 -M
rulesOnly
及pluginsOnly
- fix: #540
- fix: 管理界面 CGI 路径可以随意拼接问题
- fix: 部分 Node 版本可能卡死问题
- fix: pipe 可能导致数据丢失问题
- fix: 编辑器高亮显示插件规则的一些问题
- feat: 本地文件替换的响应头头默认加入
content-length
字段,可以通过delete://resH.content-length
禁用 - feat: 支持通过 CGI 或 API 获取当前处理的请求总数
- style: 支持预览 SVG 文件
- feat: 支持通过
process.on('pforkError', (info) => {})
获取插件抛出的异常信息 - perf: 调整GC参数
--max-semi-space-size=64
- fix:
v15.5.0
版本界面无法打开问题
- fix:
v15.5.0
版本自动设置autoDestroy
导致无法请求的问题
- feat: 支持通过
Online
菜单查看当前进程的请求数、CPU、内存状态等 - feat: 支持通过
proxy.getRuntimeInfo()
获取当前进程的请求数、CPU、内存状态等 - feat: 添加回收站,删除的 Rules 或 Values 会先存放到回收站(最多缓存120条),并可以点击恢复
- feat:
Network > Tools > ToolBox
支持通过域名生成对应的证书,方便开发其它 https 服务使用
- feat: tunnel 代理支持确认机制,详见:https://github.com/avwo/lack-proxy/blob/master/lib/proxy.js#L100
- fix: http 请求走 tunnel 代理没有主动调用
socket.resume()
,可能导致用 lack-proxy 代理的部分请求超时 - style: 插件禁用后在页面的标签显示
Disabled
- fix: 页面 Content Encoding 显示错误问题
- feat:
enable://servername
删除 https 请求的 sni - feat: 支持
w2 run -M prod
方便 docker 部署 - refactor: 自动简称请求或响应内容是否支持gzip
- feat: 新增
lineProps://proxyHost|proxyTunnel
只对当前行生效
- feat: 以
/...whistle-path.5b6af7b9884e1165...///
路径开头的内部请求也支持enable://proxyTunnel
- style: JSONView 的右键菜单新增
Collapse Parent
- feat: 添加
enable://proxyTunnel
,支持两层http代理 请求 -> http 代理 -> http 代理txt www.test.com proxy://10.0.0.1:5566 10.1.2.3:8080 enable://proxyHost|proxyTunnel
上述表示请求将通过 http 代理10.0.0.1:5566
转发到上层 http 代理10.1.2.3:8080
- feat: 支持通过
-M useMultipleRules
启用多选,相当于在 Rules/Settings 勾选Use multiple rules
- fix: 解决
https2http-proxy
部分请求无法正常转换问题,该协议主要是将请求自动转成http,并代理到指定http proxy
,功能同internal-proxy
,但internal-proxy
无法同时设置host
- feat: 添加 cipher 支持自定义兜底加密算法
- fix: 代理请求头
Host
错乱问题(不影响正常使用)
- refactor: 更新 node-forge 解决安全问题
- fix: h2 请求转成 https 请求时,界面显示响应头大小问题
- feat: 启动参数
options
支持通过字段allowPluginList
和blockPluginList
分别设置可加载的插件及不可加载的插件列表
- style: Overview 规则列表 hover 上去可以点击查看帮助文档
- style: Network 搜索框添加历史记录功能
- fix:
reqHeaders://cookie=xxx
和reqCookies://test=123
无法同时生效问题 - feat: 支持通过请求参数
hideLeftMenu=true
或启动参数-M hideLeftMenu
隐藏左菜单
- feat: 插件自动添加trailers,可以通过
res.disableTrailer
禁用 - refactor: 优化监听
res.on('end', cb)
事件,确保事件触发
- feat: 支持传递
trailers
- feat: 支持通过
delete://trailer.xxx|trailer.yyy
删除指定tailer(如果存在) - feat: 支持通过
headerReplace://trailer.key:pattern=value
及trailers://json
修改tailers - fix: 自动修改 websocket origin 问题
- feat: 支持
includeFilter://reqH.cookie=pattern
等价与includeFilter://reqH:cookie=pattern
- style: 调整Network字体加粗效果
- fix: 配置hosts的websocket的https请求无法自动转http请求问题
- fix: #462
- fix: #464
- feat: 支持自定义 plugins 列表的卸载及安装命令名称
- chore: 优化界面及依赖
- feat: 支持通过
delete://body
删除请求及响应内容,或delete://req.body
删除请求内容,delete://res.body
删除响应内容 - feat: 支持通过
reqBody://()
或resBody://()
分别清空请求或响应内容(不影响reqPrepend、reqAppend 等注入的内容) - fix: #456
- refactor: 新增访客模式可以访问的接口
- style: 页面时间支持显示毫秒
- style: 加粗 Composer 里面的 whistle 自定义请求头
- fix: #451
- refactor: 减少暴露无登录态的接口
- feat: 支持显示 websocket 关闭的错误码
- style: 支持将请求头以 JSON 文本拷贝
- fix:
--addon "path1,path2"
无法填多个路径问题 - fix: 某些服务没按http标准执行,如
302
返回内容,可能导致页面或下游代理 pending问题
- style: Frames 里面支持快捷键
Ctrm[Cmd] + R
重放请求 - refactor: 插件里面可以通过
req.originalReq.ruleUrl
获取 rule 匹配结果 - feat: 拦截 https 请求后,会保留 tunnel 代理请求头
x-whistle-tunnel-data
的数据 - feat: 去掉同步系统hosts设置,且左侧菜单新增 checkbox 可以快速禁用或启用 Rules/Plugins
- perf: gzip 返回抓包数据的 cgi
- fix: Composer 构造没有body的请求不设置
content-length: 0
问题 - style: 添加快捷键
ctrl[cmd] + r
或ctrl[cmd] + shift + r
重放请求
- fix: 通过 urlParams 和 pathReplace 修改请求URL参数的问题
- style: Network 右键菜单添加
Actions>Mark
标记抓包数据 - refactor:
statusCode
移入rule
里面跟file
等协议同级
- style: Plugins 添加
ReinstallAll
按钮,可以copy插件安装命令 - fix: 还原匹配顺序,修复:#421
- fix:
Node >= 14.1
无法使用http2问题 - fix: 某些规则可能会被插件返回的规则覆盖问题
- feat: 模板字符串支持通过
${hostname}
获取系统的os.hostname()
- fix: 请求包含匹配的插件规则时,可能导致 Overview 界面脚本报错问题(可能导致某些配了请求映射及包含插件规则的请求 Overvew 出现空白)
- refactor: 优化
resCors://enable
支持自动设置OPTIONS
请求的access-control-request-headers
,access-control-request-method
字段 - fix: #412
- feat: 支持
-M proxifier
开头proxfifier
模式,该模式下会 whistle 会对所有请求域名为ip
且端口为80
,443
的请求进行 https 拦截,并判断是否有上传自定义证书 - fix: Node13~14 开启 http2 功能
- feat: 支持 json5 配置(Node版本最低要求改为 6)
- fix:
includeFilter://h:key=pattern
只能匹配请求头,无法匹配响应头问题 - feat: JSON Tree 支持 Copy 字节点数据
- feat: Composer 支持上传本地文件
- feat: 支持自定义客户端证书:https://wproxy.org/whistle/custom-certs.html
- refactor: 优化建立连接时的错误处理
- style: 现在 Composer 输入的文本长度防止浏览器卡死
- fix:
includeFilter://b:pattern
失效问题 - refactor: 鉴于低版本 Node 的 HTTP/2 模块 bug比较多,统一调整为
Node v12.12.0
及以上版本才会支持 HTTP/2
- chore: 去掉安装过程中的
warning
- style: Frames 页面新增 Overview Tab 用于查看帧数据的基本信息
- style: Frames 里面二进制数据字体加粗
- fix: Express 框架默认添加的
x-powered-by
响应头:#395
- fix: 部分网站可能出现的
ERR_HTTP2_SESSION_ERROR
- feat: 支持 post 等包含请求内容的https请求自动降级到http请求(如果不支持https服务的话)
- refactor: 优化远程规则更新机制,防止误判拉取失败,导致远程规则被情况
- feat: 支持通过
-M disableUpdateTips
禁用版本升级通知(一般用于集成 whistle 的第三方应用)
- fix: 本地 hosts 文件没配
127.0.0.1 localhost
可能导致https请求失败问题 - feat: HTTP2 的
DELETE
请求如果携带请求内容,则自动降级为 http/1.1,否则会出现 400 或 忽略请求内容
- fix: #383
- refactor: HTTP/2 支持 delete 请求携带 body
- style:
HTTPS > View all custom certificates
支持高亮显示过期证书,且支持 copy 证书安装路径 - fix: 设置
reqBody://(xxxx) method://post
无法同时生效问题
- fix: #380
- feat: 添加
internal-http-proxy
大致功能与internal-proxy
一致,只是前者针对 websocket 请求使用的是 tunnel 代理,而后者使用直接 upgrade 请求
- refactor: 传给 Composer 的响应数据改成 base64
- refactor: 支持从请求 headers 里面的规则解析出 pipe 规则
- fix: 使用
pipe
时请求异常导致没有捕获问题,及 http 请求 pipe 失效问题 - style: 支持在 Overview 里显示 HTTPS 自动转 HTTP 所消耗的时间
- fix: 调整
includeFilter
和excludeFilter
匹配方式,需要满足所有includeFilter
中的一个,且不能匹配到任何excludeFilter
,即excludeFilter://p1 excludeFilter://p2 includeFilter://p3 includeFilter://p4
相当于!(p1 || p2) && (p3 || p4)
- fix: 启用
--socksServer port
后请求出现异常可能导致程序 crash 问题
- refactor: 支持显示saz文件里面的非文本内容
- feat: 添加启动参数
-M safe
开启安全模式,安全模式下会对服务端的证书进行校验,如果本地的根证书链不支持,则请求会报unable to verify the first certificate
,参见:#368 - fix: Network 搜索过滤可能出现重复数据的问题
- fix: 上个版本引入的配置 host 出错问题
该版本有bug,请用最新版本
- refactor: 优化 IPv6 配置
- refactor: 去掉多余的接口
- style: Network 的
URL
支持修改宽度(个人体验考虑其它列暂时不支持修改宽度) - refactor: websocket 如果返回非 101 状态,则透传给浏览器
- refactor: 添加
package-lock.json
- perf: 引入 react-virtualized 极大提升列表性能,详见:#358
- feat: 调整列表长度,默认支持同时显示 1500 条抓包数据,可以通过 Network > Filter > Max Rows Number 调整大小
- refactor: 在之前版本设置
log://xxx weinre://xxx
时,为了防止把注入都js缓存到浏览器,whistle 会自动删除缓存的响应头,即使设置了cache://xxx
也无用,新版以cache://xxx
优先级最高,并支持通过设置cache://reserve
强制保留原来的请求头 - refactor: 某些 Node 版本会出现某些 socket 没有没有监听
error
事件,这里会强制设置一个空的 errorHandler,防止异常抛出 - fix: 非 SNI 的 https 请求无法解包问题
- fix: 设置代理重试后重复添加路径问题
v2.3.3
- style: 修复同时安装的插件可能出现排序跳动问题
- fix: WebSocket 请求采用
internal-proxy://host:port
时无法准确带上 clientIp 的问题 - feat: 支持通过设置
enable://strictHtml
可以在使用htmlXxx, jsXxx, cssXxx
注入内容到html页面时,会先判断是否第一个非空白字符是<
才会注入 - feat: 支持通过设置
enable://safeHtml
可以在使用htmlXxx, jsXxx, cssXxx
注入内容到html页面时,会先判断是否第一个非空白字符不是是{{
才会注入 (用于统一给某个域名的页面注入脚本等时,防止一些非标准等接口响应类型设置为html,导致误注入的问题) - feat: 支持通过启动参数
-M noGzip
禁用所有请求的gzip
功能 - perf: 限制 zlib 的并发量,减少内存泄露(原因参见: nodejs/node#8871 (comment))
- fix: 修复
x-forwarded-for
混乱问题,直接请求默认不带x-forwarded-for
(代理转发会自动带上非本地IP),可以通过forwardedFor://ip
或reqHeaders://x-forwarded-for=ip
自定义x-forwarded-for
- style: #354
- feat: 插件新增方法
optins.isEnable((enable) => {})
获取插件是否处于启用状态 - feat: 插件的
rules.txt
、_rules.txt
、values.txt
、resRules.txt
文件支持设置占位符{{whistlePluginName}}
获取插件的短名称(不包含whistle.
), 以及通过{{whistlePluginPackage.xx.yy.zzz}}
获取插件package.json
的值
- feat:
@url
请求时自动带上x-whistle-runtime-id
便于插件判断请求是否来自宿主代理 - fix: #352
- fix: 修复 HTTP2 模块对http2请求响应格式要求过于严格,导致某些网站http2请求失败问题
- feat: 支持通过启动命令行参数添加规则
# 从 https://xxx 加载规则,如果远程规则有更新也会自动同步更新 w2 start -r "@https://xxx" # 从本地绝对路径 filepath 加载规则,如果文件有更新也会自动同步更新 w2 start -r "@filepath" # 直接设置规则 w2 start -r "www.test.com/path/to reqHeaders://x-test=1"
组合设置 JSON.stringify('@https://xxx\n@filepath\nwww.test.com/path/to reqHeaders://x-test=1')
- feat: 部分在响应阶段才会执行的规则放到请求响应后再做匹配
- style:
Networt > HTTPS > Enable HTTP/2
去选后接收和发送请求的方式都改用非 H2
- fix: nodejs/node#27384
- refactor: 优化 H2 session 缓存策略
- refactor: 去掉请求超时设置
- feat: 支持通过
Network -> HTTPS -> Enable HTTP/2
关闭或开启 HTTP/2 请求,可以通过pattern enable://h2
局部开启 HTTP/2 - refactor: 支持自动检测
xxx.har
文件是否使用base64编码 - fix: 修复了内部请求重试可能导致死循环的问题
- style: Composer 里面支持自定义方法
- perf: 减少h2的session数,每个客户端到h2 session可以完全复用
-
feat: 多行形式的 JSON 对象支持设置数组及多层嵌套的值
v2.1.1
及以前版本以下内联对象文本不支持数组及多层嵌套``` test [1]: "test" [10]: 1 ```
xxx.test.com resMerge://{test}
上述文本会转成对象:
{ "[1]": "test", "[10]": 1 }
而
v2.1.2
版本开始,上述文本会转成var arr = []; arr[1] = 'test'; arr[10] = 1;
更复杂的规则:
``` test [a.b[3].c]: abc ```
等价于
{"a": { b: [undefined, undefined, { c: "abc" }]}}
如果不希望进行自动转义,可以使用双引号
"[xxx.yyy[n]]"
- feat: 添加在域名中
.
匹配方式.test.com 表示匹配 x.test.com 与 test.com *.test.com 表示匹配 x.test.com,不匹配 test.com **.test.com 表示匹配 x.test.com 及其所有子孙代域名 ***.test.com 表示匹配 test.com 及其所有子孙代域名 上述匹配可以加协议及路径进行更精确代匹配 `http://.test.com/path/to/*`
- feat: 添加在域名中
- fix: 修复自定义插件hint时,如果只有一个补全数据不显示的问题,以及请求和响应内容为空时不显示大小的问题
- style: Overview 里面支持显示gzip前后的大小
- feat: 支持通过环境变量
env.WHISTLE_PLUGIN_EXEC_PATH
或启动参数-M buildIn
设置 fork whistle 插件进程的 Node 路径 (默认为全局 Node )
- fix: 修复url替换
url replacementUrl
path取错问题
- feat: 支持 HTTP2 功能
请确保运行的 Node 版本为 LTS(>= 10.16.0) 或 Stable(>= 12.12.0) 的最新版本,否则可能会出现一些异常,如:#24037、#24470
- feat:
**/path/to
如果path/to
里面包含*
,如*/cgi-*
,则等价与^*/cgi-*
- fix: 引入Http2导致请求abort后浏览器无法收到断开的指令
- refactor:
enable://proxyHost
支持显示真实的请求ip
- feat: 浏览器和 whistle 之间支持通过 HTTP2 建立连接,(需要把 Node 更新到
v10.16.0
及以上版本) - refactor: 调整连接缓存策略,任何连接不做长缓存,减少内存占用
- fix: 长连接获取clientIp失败问题
- fix: 模板字符串
${whistle.xx.repalce(p,v)}
失效问题
- feat: 支持通过
reqRules://file|values|inlineValues
及resRules://file|values|inlineValues
批量设置规则 - fix: Composer切换到 pretty 模式时无法设置换行符问题
- fix: 某些Node版本(如:
v10.16.2
在部分Mac机型上)可能存在bug,会出现一些异常无法让程序捕获捕获导致程序crash问题
- fix: #329
- refactor: 优化后缀匹配规则
^.js
,避免匹配域名,且支持直接配置.js
- feat: 支持扩展Network的右键菜单,具体参见:插件开发
- fix:
head
请求按规范不允许注入及返回响应内容,详见: https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4 - feat: 模板字符串支持通过
${{key}}
的方式自动encodeURIComponent
内容 - feat: 支持通过
^.xxx
匹配url文件后缀为xxx
的请求
- fix: 无法用
/...whistle-path.5b6af7b9884e1165...///
内部路径访问插件的 WebSocket 服务问题 - perf: 减少轮询接口输出的无用内容
- feat: 插件新增
options.updateRules()
用于立即更新通过@whistle.xxx/path/to
引入的规则 - feat: 新增方法
proxy.setUIHost(host)
、proxy.setPluginUIHost(name, host)
方便第三方动态设置whistle或其插件ui的域名
- feat: 支持在插件到
server
hooks 到req.request([uri, ]cb[, opts={host, port, rules}])
到方式自定义请求目标及设置响应rules - perf: WebUI到js文件开启gzip压缩,减少传输的文件大小,提升页面打开速度
- refactor: 调整UI展示的js文件内容大小(0.5m -> 1.5m)
- fix: 修复
WebSocket Proxy
及includeFilter://xxx excludeFilter://xxx
但一些bug
- feat: 插件列表添加
Sync
按钮可用于获取插件的规则或值并设置到界面的Rules或Values - feat: 支持通过插件 package.json 配置
"whistleConfig: { "hintUrl": "/cgi-xxx/xxx" }"
等方式自定义自动补全列表功能 - feat: 支持通过
req.sessionStorage.[get|set|remove]
实现插件各个server hooks之间的数据传递
- fix: #316
- fix: #316
- fix: 通过
w2 i @org/whistle.xxx
安装的插件无法执行w2 run xxx
的问题 - fix: 安装插件可能导致whistle crash问题
- fix:
Composer
面板里面的Rules
禁用后无法开启的问题 - feat: 支持通过
w2 run --inspect
或w2 run --inspectBrk
开启调试模式
- feat: 支持通过 uiurl#network?name=h&value=v&name1=h1&value1=v1&...&name5=h5&value5=v5 根据多个请求头过滤抓包数据
- refactor: 支持
pattern host proxy://xxx enable://proxyHost
如果出现tls错误自动降级到http请求
- feat: 支持插件通过
options.getRules(cb), options.getValues(cb), options.getCustomCertsInfo(cb)
,分别获取插件Rules、Values、自定义证书信息 - style: HTTPS菜单的对话框添加
View all custom certificates
按钮,用于查看自定义证书状态(是否过期等) - fix: WebSocket请求无法设置
reqDelay://msNum
的问题
- fix: http请求访问某些上游代理服务器返回400问题
- fix: #310
- feat: 插件新增
req.originalReq.relativeUrl
获取匹配后拼接的url
- feat: 支持
^***/path/to
及***/path/to
匹配所有类似https://www.test.com/xxx/.../path/to
的url - fix: 使用代理及
x-whistle-real-host
穿透nginx时出现的nginx可能读取原始host的问题
- feat: 支持通过
x-forwarded-host
或x-whistle-real-host
自定义请求的host,方便通过Nginx的反向代理到whistle - feat: 支持通过
enable://proxyFirst
调整 proxy 配置的优先级高于 host (默认:host > proxy)
- perf: 优化请求失败重试机制
- fix: 解决插件里面调用
req.request(options)
时再次触发statsServer
等问题
- refactor: 支持捕获插件的
unhandledRejection
异常 - refactor: 调整url匹配的请求参数追加方式:
# 配置 www.test.com?2 www.abc.com?abc www.test.com www.abc.com?abc # 原来的效果 www.test.com?123 -> www.test.com?abc123 www.test.com?234 -> www.test.com?abc34 # v 1.15.11+ 的效果 www.test.com?123 -> www.test.com?abc&123 www.test.com?234 -> www.test.com?abc&34
- feat(#303): 支持通过
style://color=!xxx&fontStyle=xxxxx&bgColor=red
设置请求的字体颜色/样式/背景颜色 - style: Frames 支持通过
Ctrl[Command] + X
清空列表
- fix: 解决在Windows系统里面无法用
w2 install whistle.xxx
安装插件的问题,以及异步加载插件顺序问题
- refactor: 支持通过自定义相对路径加载插件,
w2 start -A ./plugins
- style: 修复界面checkbox对齐问题
- refactor: 优化默认超时时间 3m -> 1h
- refactor: 调整最大连接数 60 -> 256
- perf: 优化重试逻辑,减少内存占用
- perf: 优化监听连接的关闭事件,减少内存占用
- refactor: 使用Values设置rawfile时,自动删除
content-encoding
响应头 - fix: 安装插件
w2 i @org/whistle.xxx
出现报错问题
- perf: 优化搜索框的性能
- refactor: 优化
w2 install
和w2 uninstall
,避免卸载失败 - perf: 解决了一些长连接无法及时清理导致的内存占用过高问题
- fix:
w2 uninstall
在windows里面无法执行的问题
- fix: 修复
w2 install
会删除其它已存在插件的问题
- style:
Frames
搜索支持忽略大小写 - refactor: Node 11及以上版本禁用请求连接复用,这些版本在复用请求连接时会导致复用的连接意外断开
- refactor: 启动时如果不设置
-H boundHost
,默认检测在127.0.0.1
的端口是否被占用,如果被占用会报错(可以通过启动参数-M INADRR_ANY
禁掉) - feat: 支持通过命令行参数
-M rules
启动无抓包页面模式,这种模式下UI将看不到Network,无法抓包且插件无法通过req.getSession(cb)
获取抓包数据 - feat: 支持通过
w2 install xxx
或w2 i xxx
的方式安装插件,如果用 cnpm 或 tnpm 安装可以采用w2 ti xxx
或w2 ci xxx
,也可以指定 registry:w2 i xxx --registry=https://r.npm.taobao.org
- feat: 支持通过
w2 uninstall xxx
的方式卸载通过w2 install xxx
安装的插件 - feat: 支持通过
w2 run xxx ...
或w2 exec xxx ...
执行命令行命令
- fix: 页面脚本错误(该错误不影响使用)
- refactor: Node 11及以上版本禁用请求连接复用,这些版本在复用请求连接时会导致复用的连接意外断开
- refactor: 优化搜索whistle插件的路径,增加搜索目录,减少插件搜索不到的问题
- feat: 支持通过命令行参数
--socksPort 1080
启动指定监听端口的socks v5服务(目前只支持普通tcp请求,udp请求还有ftp请求的带来暂不支持) - feat: 插件server添加了
req.passThrough()
,req.request(url/options, cb)
,req.writeHead(code, message, headers)
等方法用于将插件里面的请求转发到指定服务
- refactor: 调整
pipe://plugin
的实现,支持通过pipe获取请求或响应内容,再传给rulesServer
或resRulesServer
- perf: 优化 Network 列表的性能
- feat: 新增命令行参数
--httpPort
和--httpsPort
,分别用于启动普通的 http 和 https server,方便做反向代理,且可用于再启动一个http proxy
(跟默认的 http 代理功能一致)和https proxy
(可作为https代理服务器) 功能应用实例:
w2 restart --httpPort 80 --httpsPort 443
,这样通过配系统host就可以抓包到无法设置代理的 app 请求包 - feat: 支持将自定义证书或根证书(
root.crt
&root.key
) 存在~/.WhistleAppData/custom_certs
目录里面,whistle会优先使用该目录的证书也可以通过命令行参数
-z /custom/certs/dir/xxx
指定自定义证书的目录 - feat: 支持在插件所在目录启动
w2 run
时,自动加载当前目录的所有插件,方便调试插件 - fix: #292
- refactor: 优化启动参数 --max-http-header-size=size
- fix:
querystring.parse('+')
自动转转成空格 ' ' 或 %2B 问题 - refactor:
w2 add
如果当前规则已存在,则选中该规则 - feat: 支持通过请求头
x-forwarded-proto
设置http
或https
请求
- fix:
jsPrepend://url
、cssPrepend://url
无法同时设置多个的问题 - feat: 支持通过设置
pattern disable://hide
禁用pattern enable://hide
- feat: 新增
headerReplace://
协议,用来通过字符串或正在替换指定关键字,详见:headerReplace - perf: 优化内存占用
- perf: 固定的缓存长连接数,减少大规模访问是连接数缓存太多导致的内存占用过多问题
- fix(pipestream): stream内部缓存堆积问题
- fix:
stream.write()
无返回缓存状态导致缓存堆积问题
- refactor: 请求上游代理的
UA
默认使用当前请求的UA
- refactor: 通过命令行
-M strict
设置的严格模式下,限制每个包的缓存大小 (这个参数一般用于部署访问量比较大的公共服务时使用,一般用户不要设置)
- fix: #285
- feat:
Log
改成Tools
,并新增ToolBox
里面集成:生成二维码、查看JSON对象、生成图片生成Base64的工具 - feat: 新增 pipe 功能,可以把http[s]、websocket、tunnel请求数据流pipe到插件,插件可以自定义对数据流的解包及组包,具体参见:http://wproxy.org/whistle/rules/pipe.html
- fix: 上个版本导致的tunnel代理path设置出错问题
- style: Plugins添加
UpdateAll
按钮,方便获取更新所有有新版本插件的命令 - fix: whistle集群内部路径跳转问题
- fix: 设置代理时SNI出错问题
- feat: 支持通过日志级别过滤日志内容
- style: 支持设置
pattern enable://clientId|mutilClient
启用请求带上clientId - style: log 添加钩子
window. onBeforeWhistleLogSend(result, level)
用于自定义显示的日志内容,可以用来添加一些自定义详细日志信息 - feat: 支持通过
pattern enable://gzip
强制开启gzip
模式
- feat: 支持上传文件作为规则配置,解决远程部署是无法在Values设置大块内容的问题,详见:http://wproxy.org/whistle/webui/files.html
- feat: 支持显示包含WebSocket帧数据的saz文件
- feat: Log里面支持设置是否展开json对象的根节点
- fix: 将weinre或log注入到缺少分号的js文件中出现的脚本错误问题
- refactor: 插件里面每个钩子占用一个随机端口改成整个插件最多只占用一个随机端口
- refactor: 优化插件配置
whistle.xxx://value
与xxx://value
等价(无实现server钩子的情况下) - refactor: 优化 excludeFilter 和 includeFilter
- feat: 插件的uiServer支持WebSocket连接
- fix: 重新设置port可能导致插件里面的
req.getSession(cb)
的回调无法执行问题
- fix: #271
- fix: http协议的websocket请求无法获取真实clientIp问题
- feat: webui直接复用whistle的端口,不再独占一个端口,所以默认不再支持通过类似
http://127.0.0.1:8900
的方式访问ui,只能通过类似http://127.0.0.1:8899
的方式访问(其中8899
为代理端口),如果需要ui另起一个端口,可以通过启动命令行参数-P xxxx
设置 - feat: 直接通过whislte模块起服务时,支持获取server对象
const startWhistle = require('whistle'); const proxy = startWhistle({...}); console.log(proxy.server)
- feat: 显示所有响应内容(之前版本对二进制内容默认不显示)
- perf: 优化内部请求解析流程,提升whistle处理性能
- fix: 替换带端口的url后
req.headers.host
的显示问题
- feat: 命令行添加
--no-prev-options
启动选项,支持通过w2 restart
时不复用先前设置的选项 - refactor: 插件的内部规则
_rules.txt
改成reqRules.txt
- fix:
www.test.com http://127.0.0.1:3000 log://
log不生效问题
- feat: 本地替换新增响应206功能,支持iOS播放本地替换的视频文件
- fix: jsBody失效问题
- style: 精简Network的右键菜单
- fix: 页面设置
<meta http-equiv="Content-Security-Policy" content="script-src *.qq.com *.gtimg.cn *.gtimg.com 'unsafe-inline' 'unsafe-eval';"/>
,导致 log 和 weinre 失效 - fix:
ServerPort
显示问题及设置proxy://host:port?host=ip:port2 pattern
时带上默认端口号问题(https: 443,http: 80)
- style: HexView添加
CopyHex
按钮,支持Copy纯二进制 - feat: Frames/Composer支持输入HexText
- feat: 插件支持通过package.json配置
"pluginHomepage": "http://xxx.xxx.com/"
自定义UI URL - fix: 在iOS12里面log无法显示
error.message
的问题,参见:#257 - refactor: 优化插件错误输出,支持显示初始化错误
- feat: 支持通过请求内容过滤
pattern operation filter://b:pattern
- feat: log支持注入
whistle.onWhistleLogSend(level, logStr)
获取页面日志信息自己做上报 - perf: 去掉本地请求的连接缓存,优化本地请求速度
- fix:
pattern host://{key1}
和pattern proxy://{key2}
失效问题
- refactor: 解决log里面显示循环引用对象的问题
- feat: 支持
Stop Record
(默认)与Pause Record
,前者已存在,会忽略后续的抓包数据,后者只是暂停
- fix: includeFilter、excludeFilter无法匹配请求头问题,已经里面正则导致子匹配失效问题
- perf: 优化界面性能
- style: Frames里面的
AutoRefresh
改为Record
- fix: 页面Frames里面数据帧可能丢失的问题
- style: Log里面的
AutoRefresh
改为Record
- refactor: 不导出被过滤掉的日志
- refactor:
reqCors://*
等价于reqCors://origin=*
- feat: Network里面的右键菜单添加过滤快捷键,可以快速过滤指定域名或url
- feat: Network里面的Filter拆分成
Exclude Filter
和Include Filter
,分别用于设置不显示的抓包数据和要显示的抓包数据,具体功能参见:webui/filter - feat: filter 分拆成语义更明确的 excludeFilter 和 includeFilter,且新增了通配符匹配
- fix: 导入saz文件
Set-Cookie
等重名头部覆盖问题 - feat: 支持导入导出日志文件
- feat:
AutoRefresh
改成Record
,可以手动关闭请求后台数据
- fix: Network隐藏是按F12切换详情面板时高度可能变成0
- refactor: 支持插件更新提醒
- feat: Composer新增历史记录按钮,可以查看在Composer里请求过的记录
- feat: 避免一行配置过程,该版本引入换行功能
www.test.com file://(test) filter://*/cgi-bin # 等价于 line` www.test.com file://(test) filter://*/cgi-bin ` # 或 line` www.test.com file://(test) filter://*/cgi-bin `
- feat:
***.xxx.com
(3个*
及以上功能相同) 等价于**.xxx.com
+xxx.com
,^***.xxx.com
同理 - feat: 模板字符串支持通过
${xxx.replace(,defaultValue)}
设置默认值 - feat: 支持切换详情右侧详情面板到底部
- perf: 缓解页面切换Inspectors时卡顿问题
- style: 调整
AutoRefresh
的位置,Abort
按钮图标加警告色 - feat: 在顶部菜单栏的
Replay
按钮下拉菜单添加Abort
按钮,支持Abort掉处于pending状态的请求
- fix: 启用
customParser
且延迟延迟响应可能导致连接自动断开的问题 - style: 高亮显示插件的
EnableAll
按钮
- feat: 支持通过插件的
tunnelServer
及设置enable://customParser
对tunnel请求(即:tpc请求或未拦截的https、websocket请求)自定义解包组包,参见:whistle.custom-parser - feat: 支持在插件里面添加
resRules.txt
文件,用于设置静态规则,功能相当于resRulesServer
吐出的规则 - feat: 支持在模板字符串里面获取插件规则的值
pattern whistle.xxx://ruleValue
,可以在插件的_rules.txt
的模板字符串里面${whistle.xxx}
获取ruleValue
,具体参见:whistle.inspect
- feat: 插件列表添加
Uninstall
按钮,用于展示协助插件的方法 - refactor: 搜索列表时暂停自动滚动
- fix:
reqHeaders://Host=xxx.com
的Host
不支持忽略大小写的问题 - fix: 内联
Value
可能被清空的问题
- fix:
www.test.com file:///User/xxx/test/
配置http://www.test.com/?id=xxx
无法匹配/User/xxx/test/index.html
问题
- fix:
ignore://host|xxx
用|
同时配置多个忽略属性失效的问题 - fix: 启用
Back rules first
且规则配置为空导致启动失败的问题#230)
- feat: 支持从本地路径自动加载规则
@~/xxx/test.txt
- feat: 支持从插件接口加载规则:
@whistle.nohost/cgi-bin/global-rules
- feat: 支持禁用响应内容压缩
pattern disable://gzip
- feat: 模板字符串支持
replace
,且支持子匹配pattern protocol://`${search.replace(pattern1,replacment)}` www.test.com file://`${search.replace(/Course_(id)\,?/ig,$1cid)}${test.html}`
pattern1
为正则或普通字符串(不需要加引号)
其它功能参见:@
-
feat: 支持在Rules里面通过以下方式内联多行的Value:
``` test.js alert(1); console.log(2); // do sth ```
上述配置表示key为
test.js
,value为:alert(1); console.log(2); // do sth
这样可以通过类似以下方式引用该Value:
pattern protocol://{test.js}
- refactor: reqCookies、resCookies里面的Value如果都为latin1字符则不进行encodeURIComponent
- refactor: debug状态下插件支持输出异步错误
- feat: 支持通过在Rules配置中
@https://rules.host.com/xxx
的方式远程自动加载规则(支持http和https请求,直接返回规则配置) - feat: 支持启动参数设置
shadowRules
(只支持作为第三方模块传入,不支持命令行方式传入) - fix: 修复 filter://pattern 只能同时生效两个的问题
- feat: 支持在规则里面用模板字符串,具体内容参见:操作值
- style: 修改编辑器的字体,以便更好显示模板字符串
- fix: Composer和Inspectors里面的Response可能出现联动的问题
- feat: resCookies支持设置SameSite
- refactor: 调整抓包数据缓存策略,优化内存占用
- feat: 支持在Rules、Values、JSONView里面按住
Ctrl[Command]+鼠标点击
在新窗口打开链接 - feat: resScript协议支持
filter://s:404
、filter://resHeader:key=value
、filter://serverIp:ip
- style: 优化Composer,支持展示
Response
数据 - feat: 支持通过
filter://m:methodName
、filter://i:clientIp
、filter://h:key=subValue
过滤规则,及支持取非filter://m:!methodName
、filter://i:!clientIp
、filter://h:key!=subValue
,value
也可以用正则/xxx/
或/xxx/i
替代 - feat: 删除对
whistle-ssl
特性的支持
- refactor: 支持
delete
请求传递请求body - feat: 支持配置IPv6的host,如:
pattern [fe80::2c6a:87c9:2ceb:d047]:8099
或pattern fe80::2c6a:87c9:2ceb:d047
- fix: proxy设置的用户名和密码无法生效的问题
- perf: 优化显示大文本的性能
- feat: 添加https-proxy协议,支持设置请求转发到上游https代理服务器
- feat: 为简化whistle的规则配置,该版本会删除以下使用比较少或配置比较复杂,且可以用其它方案替代的协议,点击链接可以查看替代方案:
- fix: 选中状态自动更新可能会自动切换Changed状态
- style: 微调背景色,保持与
Chrome 69+
主色调一致 - refactor:
^/cgi-
等价于^**/cgi-
- style: Composer失败时会弹框提醒
- feat: 支持在
Rules > Settings > Back rules first
调整规则的优先顺序,默认从上到下,其中Default里面的规则优先级最低,这个设置只对在Rules配置的规则生效,对reqScript和插件设置的规则不生效
- feat: 删除协议
exports://
和exportsUrl://
,请用更灵活方便的插件获取:插件开发 - feat: 支持插件里面获取WebSocket和socket请求的帧数据,详见:插件开发
- style: 解决Mac下
Ctrl+F
冲突问题 - feat: Overview支持只显示匹配的规则
- feat: 支持在插件获取请求数据,具体参见:插件开发
- fix: 处理
socket hand up
错误
- feat: 调整规则匹配机制,一些协议支持同时匹配多个:ignore, enable, filter, disable, plugin, delete, urlParams, params, reqHeaders, resHeaders, reqCors, resCors, reqCookies, resCookies, reqReplace, urlReplace, resReplace, resMerge, reqBody, reqPrepend, resPrepend, reqAppend, resAppend, resBody, htmlAppend, jsAppend, cssAppend, htmlBody, jsBody, cssBody, htmlPrepend, jsPrepend, cssPrepend,更多协议参见:协议列表
- feat: 支持给上游代理转发的请求设置hosts:
pattern proxy://ip:port?proxyHost
或pattern enable://proxyHost
或pattern proxy://ip:port?host=ip:port
- feat: 添加
xhost://...
功能同host://...
,前者如果发现服务没起来,会自动请求现网 - refactor(UI): 默认主题的host高亮显示,判断离线机制等,WebSocket返回失败预览等。
- fix: 精确匹配无法带上请求参数的问题
- fix: Network空白处无法弹出右键菜单问题
- feat: 支持右键菜单打开预览图片
- feat: websocket和socket请求支持Pause、Ignore、Composer、Replay, Abort操作
- feat: https请求自动降级(#176)
- feat: 支持显示HexView(二进制)
- feat: 支持远程导入Sessions/Rules/Values,通过
Shift + Export按钮
- feat: 支持在新窗口预览HTML页面
- fix: 导入saz文件时把https请求自动转成http请求的问题
- refactor: 导致saz文件时也会保留whislte的一些特有信息
- style:
Request
和Response
统一放到Inspectors
显示,详见:#180
- feat: 支持显示图片
- feat: 通过
w2 status [-S storage]
或w2 --all
显示当前whistle运行状态 - refactor: WebSocket请求贞数据二进制显示格式
- feat: 添加更新插件的按钮,点击该按钮弹出更新命令
- feat: 支持通过命令行
w2 use
或w2 enable
获取当前目录.whistle.js
输出的规则配置,具体参见:命令行参数
- refactor: 放宽对json格式的要求
- refactor: resMerge支持返回类型为html的请求
- fix: 127.0.0.1请求无法发出去的问题
- chore: 修复README没发布出去的问题
- fix: 编辑器搜索问题
- feat: 支持设置多个访问webui的域名
-l "webui1.example.com|webui2.example.com"
- fix: 用proxifier代理http post请求可能会卡住的问题
- refactor: 自动检测是否支持sni
- fix: reqScript和resScript里面换行自动变成空格问题
- feat: 支持域名为ip的https请求
- feat: 全面支持proxifier代理请求
- feat: 自动切换web请求和普通的socket请求
- feat: 支持tunnel代理http请求
- feat: 支持通过设置
tunnel://host enable://inspect
后在Network -> Response -> Frames
查看tunnel请求的内容 - feat: 过滤pattern支持简单的通配符
filter://*/xxx
- feat: 支持端口匹配
:12345 operatorURI
- refactor: IE9+及WebKit、Gecho默认支持SNI技术
- feat: 通过命令行参数
-z 证书目录
设置自定义证书对应的域名将自动启用拦截https请求 - feat: weinre支持通过js文件注入
- refactor: 调整的weinre和log请求路径及禁用缓存
- feat: Network的右键菜单新增
QR Code
用于生成指定URL的二维码 - fix: saz文件导入如果不存在host无法显示的问题
- fix: 使用xxxPrepend注入html、js、css到页面是可能出现非严格模式的问题
- fix: Network中如果请求被选中右键菜单中
按住Shift + 点击Replay
无法弹出设置次数对话框的问题 - fix: 不支持多个filter的问题
- feat: ignore和filter支持忽略(过滤)
pattern
operator pattern1 pattern2 filter://reg1 filter://!reg2 ignore://!reg3 ignore://reg4
- feat: Values里面的右键菜单加入 JSON > Validate + Format 功能
该版本新增了一些比较有用的功能,建议大家及时更新
- feat: 右键 -> 按住
Shift
-> 点击Replay,可以输入Replay当前请求的次数(只支持Replay单个请求的情况) - feat: ignore和filter支持忽略(过滤)
pattern
pattern operator1 operator2 filter://reg1 filter://!reg2 ignore://!reg3 ignore://reg4
> 其中 `reg1~reg4` 为形如 `/xxx/` 或 `/xxx/i` 的正则表达式,`!reg` 表示 `reg` 取非, 该配置表示请求要匹配`pattern`,但要过滤掉【匹配 `reg1`或 `reg4`】、【不匹配`reg2`】、【不匹配`reg3`】的请求。
- feat: params改成reqMerge,并支持修改请求类型为json的数据,新增resMerge用于修改返回类型为json或jsonp请求的数据,直接可以通过设置json对象覆盖返回的json对象对应字段(深度合并)。
- fix: JSONView里面如果数值位数太大显示出现偏差的问题
- refactor: Network下方的搜索框支持正则过滤
/xxx/i
- fix: The fs.promises API is experimental (Node.js 10.1.0)
- refactor: 支持非过滤(#155)
- fix: 如果请求的域名为IP,则默认不进行解包,需要解包可以通过设置规则
tunnel://x.x.x.x enable://capture
实现 - fix: Node 10无法导入导出saz文档的问题
- fix: 某些包含
\x3f
等16进制转义字符无法解析成JSON对象的问题 - refactor: 支持通过url的hash请求参数设置
clearNetwork=true
让network不要加载缓存抓包数据 - feat: 支持设置log id:
pattern log://xxx
(logId长度不能超过36,且不能包含/
、\
、(
、)
、{
、}
、<
、>
),并通过log id过来日志
- feat: Composer自动保存已填写的数据
- fix: Composer里面如果头部出现JSON字符串可能导致无法解析请求头的问题
- fix: Node 10更新openssl带来的问题:error:0D0E20DD:asn1 encoding routines:c2i_ibuf:illegal
- fix: 启动时卡住命令行
- fix:
node v9.11.1
带来的bug
Node: v9.11.1
Date: 2018-4-23 19:22:33
TypeError: Cannot read property 'res' of null
at Socket.socketCloseListener (_http_client.js:355:11)
at Socket.emit (events.js:180:13)
at TCP._handle.close [as _onclose] (net.js:541:12)
- refactor: 去掉命令行里面
-A, --ATS
,whistle会默认自动检测 - refactor: 重新翻译命令行参数
- refactor: 优化log捕获错误的堆栈信息
- refactor: 调整界面轮询频率
- refactor: 如果tunnel请求被拦截,则不请求
plugins.tunnelRulesServer
- fix: Composer构造get请求时,如果出现
Content-Length
及请求内容导致请求无法正常响应的问题 - feat: 插件新增构造服务
plugin.initial(options)
用于初始化插件
- fix: 通过Composer构造的WebSocket请求是Client IP显示错误的问题
- fix: 设置log时可以出现的
Converting circular structure to JSON
异常 - feat: 支持
ignore://*|-yyy
等价与ignore://*|ignore.yyy
- feat: 添加钩子
plugin.resStatsServer
用于插件统计响应状态
- fix: 修改请求头可能导致
content-length
被自动删除的问题 - fix:
ignore://socks
、ignore://http-proxy
失效问题
- fix: JSONView里面点击AddToValues下载文件的问题
- refactor: 支持点击AddToValues或Download按钮时,根据当前url自动填写默认名称
- refactor: 去掉插件中没什么用处的statusServer,避免与statsServer混淆
- style: 界面修改为默认显示左侧菜单模式
- feat: 支持设置
disable://capture
及enable://capture
,这两个等价于原来的disable://intercept
及enable://intercept
- refactor: 界面微调,及Log界面的性能优化
- refactor: 去掉HTTPS里面
Hide TUNNEL CONNECTS
选项
- feat: 增强v1.8.9版本的
ignore://allRules
功能,支持双ignore的规则,即:ignore://allRules|ignore.host|ignore.whistle.script
或ignore://allRules|ignore:host|ignore:whistle.script
这个时候whistle会忽略host
和whistle.script
以外的所有规则 - perf: 优化了JSONView里面切换到Source模式时可能出现的卡顿问题
- style: 禁用所有Rules或Plugins时左侧按钮会自动变灰,修改Rules或Values时左侧按钮会加
*
- refactor: 默认不带
x-forwarded-for
,如果需要可以通过设置pattern forwardedFor://
实现
- feat: 界面Network右侧的Composer支持设置临时的Rules
- feat: 支持通过命令行
-M network
设置为抓包模式,该模式只能查看抓包不能设置规则及加载插件 - feat: 界面暴露了一些接口供第三方扩展,具体用法参见后续的插件nohost
- feat: 支持通过命令行
-L "script=a.b.com&vase=x.y.com&nohost=imweb.nohost.pro"
自定义访问插件的域名
- fix: 点击Network的Time表头时响应时间没有按数值大小排序的问题
- feat: Rules里面的
@
符号支持扩展 - feat: 支持通过设置
ignore://allRules
忽略掉所有配置的规则
- refactor: 避免url里面的参数自动转义,保留原有url的字符
- refactor: Offline状态下菜单栏灰显
- fix: 作为代理转发时,客户端ip可能传递出错的问题
- feat: 在Network中双击右侧的Tab按钮,可以将当前选择的行滚动到可视区域
- feat: 点击选中的请求数据不会因为请求列表的滚动导致被删除
- feat: 在 Plugins 里面新增
EnableAll
按钮
- fix: 导出Rules或Values时,只能导出全部的问题
- feat: 选择导出Rules或Values对话框里面添加
Export All
按钮 - feat: 添加右键菜单按钮
Remove -> Others
,删除其它抓包数据
- feat: 支持导入har文件
- feat: 支持JSON数据直接添加到Values中
- refactor: 优化界面性能#110
- feat: 添加命令行参数
-f, --secureFilter
用于过滤隐藏显示到界面的抓包数据,如cookie里面的登录态信息 - refactor: 支持同时根据多个ip过滤抓包数据
- perf: 大幅提升pac、reqScript、resScript的性能
- fix: RegUrl后面请求参数匹配问题,
^ke.qq.com/?*
与^ke.qq.com/?**
- feat: 支持
Copy As CURL
- fix: 无法清楚log的问题
- feat: Network、Rules、Values重新定义右键菜单
- feat: tunnel请求支持resScript、responseFor、resHeaders
- feat: 添加新协议:htmlPrepend、htmlBody、htmlAppend、cssPrepend、cssBody、cssAppend、jsPrepend、jsBody、jsAppend、其中:htmlAppend、cssAppend、jsAppend分别等价于 html、css、js
- feat: 支持匹配方式
www.*.com operator-uri
、www.**.com operator-uri
等:www.**.com/test 1.1.1.1
- feat: 支持匹配方式
^www.**.com/** operator-uri
、^www.**.com/** operator-uri
等:^www.*.com/*** file://E:\test/$2
- fix: 子匹配的一些问题
- feat: 支持通过
@xxx
设置变量值,插件(options.GLOBAL_VALUE_HEADER
)或reqScript、resScript(value
)可以读取到该值 - refactor: 启动时的数据备份问题
- refactor: 数据备份优化,如果原文件没有数据,重新用备份文件写入
- fix: reqScript的body为空的问题:issue#74,及render无法使用的问题,建议大家升级到最新版本
- refactor:
visitorName
改为guestName
- feat: 添加responseFor,功能与forwardedFor对应,用于在Network的severIp上显示真实的服务器环境
- feat: 将rulesFile 改为 reqScript,原来的rulesFile还可以使用,功能与reqScript一样
- feat: 添加resScript,支持在响应后修改通过脚本修改规则
- fix: 通过rulesFile设置proxy时会出错的问题
-
refactor: 调整证书策略,防止域名里面有不合规的字符,导致Chrome出现证书校验失败
-
refactor: rulesFile添加一些新的内置方法和对象:
var context = { url: req.fullUrl, method: util.toUpperCase(req.method) || 'GET', httpVersion: req.httpVersion || '1.1', isLocalAddress: function(_ip) { return util.isLocalAddress(_ip || ip); }, ip: ip, headers: extend(true, {}, req.headers), body: body, rules: [], values: {}, getValue: values.get, parseUrl: parseUrl, parseQuery: parseQuery, tpl: tpl };
- feat: 正则匹配和精确匹配支持非操作,可以通过
!/reg/i
或!$www.test.com/xxx
实现非匹配操作 - feat: 支持通过启动命令行参数选择监听的网卡
-H 127.0.0.1
或--host 192.168.0.100
- fix: 获取通过代理转发过来请求的clientIp错误的问题
- feat: 在Network的列表及Overview里面支持显示Content-Encoding
- feat: Rules里面支持Autocomplete,输入过程中如果有匹配的规则会自动显示,或者Windows按住
Alt+/
,Mac按住Option+/
可以手动调出可以选规则列表,且选择或hover到某个规则后按F1
(笔记本可能要按fn+F1
)可以自动打开对应的帮助文档 - feat: 支持通过按
F1
打开对应的帮助文档
- fix: 在Frames的列表没有加React的key导致性能比较差的问题
- fix: websocket设置代理后路径被改为根路径的问题
- feat: 支持
ws://www.test.com/xxx https://www.abc.com/a/b
匹配,whistle会根据匹配url的协议http
或https
自动转成ws
或wss
- feat:
hosts://
<=>host://
- feat: 支持websocket(socket)请求设置statusCode、reqDelay、urlParams、params、delete、reqHeaders、resHeaders、referer、referer、disable、reqCookies、reqCors、resCors
- refactor: Network -> Log -> Console支持JSONView的形式
- feat: 支持WebSocket的抓包与构造,详情参见WebSocket操作文档
- feat: 支持下载请求响应数据,hover到[Request|Response]/[TextView|JSONView]/ViewAll/Download
- feat: 导出的数据支持自定义文件名称
- feat: 原来的版本,如果请求的路径的ip和端口与whistle的ip和端口一样,或请求域名为localUIHOst,则都会转到whistle的UI,
v1.6.0
以后,如果路径为:http://localIP:whistlePort/_/xxx
的请求会自动转成 :http://localIP:whistlePort/xxx
,这样就可以通过在whistle上配置规则localIP:whistlePort/xxx 127.0.0.1:6001
实现反向代理的功能(_
也可以换成-
)。 - feat: 原来默认uiport为
port + 1
,且可以通过启动参数-P 9999
更改,v1.6.0
以后如果非自定义的uiport被占用会自动获取一个随机端口
- fix(#87): Node9启动失败的问题及zlib的bug
- feat: 支持Composer构造ws和tcp请求
- feat: 支持Replay带头部规则的请求
- feat: 支持双击
AutoRefresh
停止滚动,或双击顶部菜单栏空白位置滚动到顶部 - refactor: 优化文本显示的性能
- feat: rulesFile,支持通过body获取当前请求的内容(如果没有请求内容,则body='',如果请求内容大于16k,body内容可能比请求内容小)
- refactor:
pattern enable://abort
是抓包界面显示502的问题,改成aborted
- refactor: 在Values里面以js结尾的key的值支持通过快捷键
Ctrs[Command]+?
注释
- feat: 兼容Chrome浏览器的本地路径
file:///C:/Users/xxx/Downloads/jq221663.html
等价于file://C:/Users/xxx/Downloads/jq221663.html
- feat: 支持通过启动参数
-M pureProxy
将whistle设置为纯http代理的模式,这种模式下只能通过http://local.wproxy.org
访问配置界面 - feat: 支持通过
pattern http://local.whistlejs.com/xxx
或pattern http://local.wproxy.org/xxx
的匹配方式,把请求转到whistle的配置界面 - feat: 支持通过
pattern enable://abort
强制中断掉请求,如果你想延迟中断,可以通过pattern enable://abort reqDelay://3000
实现
- fix: 选择导出抓包数据的默认文件类型错误的问题(第一次使用Ctrl[Command] + S的方式导出,且没有手动选择类型时时会有这个问题)
- feat: 插件数据返回数据支持通过
options.ETAG_HEADER
、options.MAX_AGE_HEADER
两个字段设置etag或max-age,这样whistle会自动缓存数据,并判断过期时间,插件可以通过 请求头的options.ETAG_HEADER=x-whistle-etag
的字段来判断是否有缓存及通过响应304
来继续使用缓存的数据,具体参见nohost的用法 - feat(#72): 支持通过启动参数
-P 80
修改whistle操作界面的端口(其中P
为大写)
- refactor: 本地请求去掉
x-forwarded-for
请求头,防止后台通过x-forwarded-for
获取ip时不准确
- refactor: 获取真实的本机ip,防止通过
x-forwarded-for = 127.0.0.1
时访问某些服务会有问题。 - refactor: issue#68
- feat: 通过请求头
x-forwarded-for
带上真实的客户端ip - feat: 支持通过插件的根目录文件
_values.txt
设置插件私有的Values(不支持values.txt
),与私有规则_rules.txt
配套使用 - feat: 自动判断根证书格式是否正确,如果不正确会自动更新,安装新版本的whistle后出现证书不可用的情况请重新安装下根证书即可
- 自动对请求头的
x-whistle-rule-key
进行转码
- feat: 支持导入导出Rules和Values
- feat: 支持通过请求头
x-whistle-rule-key
或x-whistle-rule-value
设置规则,且支持通过x-whistle-rule-host
设置hosts,其中x-whistle-rule-key
将自动从Values里面加载规则,在设置代理pattern proxy://host:port?proxyHosts
时,后面新增的请求参数表示代理规则优先,且会通过x-whistle-rule-host
自动带上设置的hosts - feat: 界面支持切换到左侧菜单的简单模式,详见issue#64
- fix: reload rule或values时,可能出现的脚本错误
- feat: 显示请求客户端的端口号和服务器的端口号
- feat: 支持预览图片(目前没做缓存,直接通过请求的url加载)
- feat: Network->Log支持搜索过滤
- refactor: 编辑器的字体使用默认字体,bootstrap的字体空格宽度太小
- fix: 微信开发者工具https请求被误认为http请求的问题
- refactor(issue#36): 打开多个页面时操作时,把修改信息实时同步给其它页面
- refactor: 把列表选择信息存储到localStorage
- fix(issue#60): 建议大家升级到最新版本
- fix: 编辑器设置显示行数的问题
- refactor: 更改DNS的缓存策略,默认缓存30000ms,可以通过启动参数
-c 600000
修改缓存时间,时间单位为ms
- fix: 更新weinre,解决安装whistle提示[email protected]及[email protected] deprecated的提醒
- fix(#58):
w2 restart -S xxx -C
会导致文件被清空的问题 - fix: Settings的输入框按
Ctrl+D
清空后无法同步的本地存储的问题
- feat: 支持Network的表头及Rules、Values列表拖拽排序
- feat: 去掉
Filter
菜单,改为Settings
菜单,支持设置多种过滤条件及自定义表格字段,详见:Settings - feat(#56): Network多选是在Overview里面显示统计信息
- feat: ignore支持
pattern ignore://http|https|tunnel|ws|wss
等协议 - refactor: 支持同时设置 log 和 weinre
- fix: nodejs/node#13539
- feat:
- 支持插件通过${ruleKey}内联规则
- 命令行添加参数
-D, -baseDir
用于指定whistle的存储目录,默认为~/.WhistleAppData
- refactor: 优化导入导出saz文件的性能
- fix: 转发到插件请求头
x-forwarded-for
的问题 - refactor: Values中名称形如
xxx.rules
的key作为正常的rules文件处理 - style: Hover到顶部
Help
按钮显示帮助文档列表
- fix: 新增setTimeout导致无法后台运行的问题
- fix: getPluginByPluginRule返回undefined的问题
- refactor: 使用 delete:// 删除头部字段是忽略大小写
- style: 在Network下方过滤输入框输入内容高亮显示
- perf: 优化
os.networkInterfaces
的性能 - fix: 支持注入的文本根据响应头进行编码
- refactor: Values支持rules的快捷键操作
- refactor: 错误页面的 text/plain 改成 text/html
- feat: 在规则配置中如果单独一行
{xxx}
表示从Values对应的key(xxx)内联文本
-
fix: 加入用户名和密码时,log无法使用的问题
-
feat: 添加新的路径匹配方式:
# 对所有域名对应的路径 protocol://a.b.c/xxx[/yyy]都生效 ~/ ~/xxx tunnel://~/ # tunnel只支持根路径匹配 http://~/ https://~/xxx ws://~/xxx wss://~/xxx # 也可以指定路径,不包含该路径的子路径 $~/ $~/xxx $tunnel://~/ # tunnel只支持根路径匹配 $http://~/ $https://~/xxx $ws://~/xxx $wss://~/xxx
- fix: 通过
pattern cache://seconds
设置缓存时间单位出错的问题
- feat: 支持第三方应用在启动whistle时传人如下参数
-
disableAllRules
: 不设置表示使用默认设置或用户通过界面设置,如果设置为true
表示禁用所有规则,包括插件,如果设置为false
表示启用所有规则,如果设置了true或false会覆盖通过页面的设置 -
disableAllPlugins
: 不设置表示使用默认设置或用户通过界面设置,如果设置为true
表示禁用所有插件,如果设置为false
表示启用所有插件,如果设置了true或false会覆盖通过页面的设置 -
allowMultipleChoice
: 不设置表示使用默认设置或用户通过界面设置,如果设置为true
表示允许在Rules种同时启用多个规则,即允许多选,如果设置为false
表示只能启用除Default以外的一个规则,如果设置了true或false会覆盖通过页面的设置 -
rules
: 通过参数设置规则列表-
如果为string或数组,则表示只设置
Default
的规则 -
如果为对象可以设置多个规则,及决定使用哪些规则(要同时启用多个规则,需要
allowMultipleChoice
设置为true){ Default: { rules: ['fffffffffffff', '000000000000'], enable: false, replace: false }, test1: 'abc\n123', test2: { rules: 'www.test.com 127.0.0.1'. enable: true } }
-
-
values
: 为对象,{ test: 'abc', testJson: {abc: 123} }
-
-
feat: 支持通配符的匹配方式(配置两边位置可以调换)
# 匹配二级域名以 .com 结尾的所有url,如: test.com, abc.com,但不包含 *.xxx.com *.com file:///User/xxx/test //*.com file:///User/xxx/test # 匹配 test.com 的子域名,不包括 test.com # 也不包括诸如 *.xxx.test.com 的四级域名,只能包含: a.test.com,www.test.com 等test.com的三级域名 *.test.com file:///User/xxx/test //*.test.com file:///User/xxx/test # 如果要配置所有子域名生效,可以使用 ** **.com file:///User/xxx/test **.test.com file:///User/xxx/test # 限定协议,只对http生效 http://*.com file:///User/xxx/test http://**.com file:///User/xxx/test http://*.test.com file:///User/xxx/test http://**.test.com file:///User/xxx/test # 路径 *.com/abc/efg file:///User/xxx/test **.com/abc/efg file:///User/xxx/test *.test.com/abc/efg file:///User/xxx/test **.test.com/abc/efg file:///User/xxx/test http://*.com/abc/efg file:///User/xxx/test http://**.com/abc/efg file:///User/xxx/test http://*.test.com/abc/efg file:///User/xxx/test http://**.test.com/abc/efg file:///User/xxx/test
-
fix(#47): 证书被吊销过可能出现无法打开的问题
- fix: 解决Composer中url包含非ASCII字符时出现乱码的问题(如果请求头有非ASCII字符该字段将被忽略)
- refactor: 改善whistle的pac脚本解析,全面支持dnsResovler
- refactor:
- 优化转发到插件的请求头,支持把proxy和pac配置规则带过去
host://:port
===host://remoteServerIP:port
- fix: 在Rules或Values按
Ctrl + X
清空Network的问题
- refactor: 确保转发到插件的请求可以把一些用户配置的Rule带过去
- fix: 修复Mac上
Chrome>=59
出现的ERR_SSL_SERVER_CERT_BAD_FORMAT
的问题,需要启动时加w2 restart -A
重新生成根证书,并安装,具体参见:Https、关于iOS的ATS
- fix: 屏蔽Node8自身bug导致崩溃的问题: Assertion `(trigger_id) >= (0)' failed.
- fix: log的缓存问题
- fix: Header name must be a valid HTTP Token
- refactor:
Network -> Response -> TextView
的Editor按钮打开的url改成相对路径- Network表格中的
host IP
改成serverIP
,语意更明确
- refactor: 不区分第三人称和单复数,ruleFile和rulesFile等价、export和exports等价、 exportUrl和exportsUrl等价
- feat:
- 添加
https2http-proxy://
,whistle把该https转成http后发送到指定代理 - 添加
internal-proxy://
,功能和https2http-proxy://
一样,只是如果代理对象是whistle的话,会把http又转成https,主要用于whistle的扩展使用,一般用户无需了解 - 添加
http2https-proxy://
,whistle把该http转成https后发送到指定代理
- fix: 在Network -> Overview中content-length显示为0的问题
- fix:
- 更新内部的一些随机端口机制,防止监听某些特殊端口导致无法响应的问题
- 导出saz文件出现pending的问题
- feat:
- 把ui界面的所有链接都改成相对路径,方便使用ip或域名直接访问及集成到第三方应用
- 同时配置 host和 proxy(socks),host的优先级高于proxy(socks)
- refactor: 响应cookie的显示
- fix: Fiddler的saz文件格式不兼容的问题
- refactor: cgi改用相对路径,方便集成到其它应用中
- refactor: 导入saz文件时,支持自动解码
- refactor: 非文本或文本太大无法显示时给出提示
- feat:
- 支持拖拽请求到Composer
- 支持json-tree
- refactor:
- 修改Network/Log下面的Conosle和Server背景颜色,让两者区分开来
- 调整ATS参数的命令行提示
- fix: 设置
proxy://
第三方代理服务器返回的数据格式有问题会导致抛异常的问题
- fix:
- 新安装的插件内置规则文件
_rule.txt
无法自动生效的问题 - 注释快捷键(Ctrl + ? 或 Command + ?)与常用编辑对齐
- refactor:
-
支持切换properties到source模式,方便直接copy到Values里面使用
-
支持如下json格式设置同名属性,whistle自动解析成数组
Set-Cookie: a=b Set-Cookie: c=d test: 123
- refactor:
- 请求和响应保留原有头部字段的大小写
- 修改Network中匹配到规则是的url字体颜色
- fix: rawfile头部存在
content-encoding
导致解析失败的问题
- fix:
- 通过rulesFile设置host或proxy无效的问题
- Rules编辑器高亮显示的问题
- refactor:
- 提升https请求的响应速度
- 优化了证书生成,防止后续Chrome版本无法识别,如果发现手机或Chrome浏览器无法识别证书,参见:关于iOS的ATS,启动时带上参数
w2 start -A
,重新生成根证书,再安装新的根证书即可
- feat: 支持根据请求头的
content-encoding
解压请求内容 - refactor: 支持在rulesFile的脚本中执行
console.log
,并可以在Network->Log->Server
里面显示 - fix: Node v7.7.0+引入的
"listener" argument must be a function
问题
- fix: 导出Fiddler是saz文件时,响应的cookie合并在一起的问题
- refactor: 更新
tunnel-agent
- refactor: 防止获取不到外网ip可能导致代理无限循环的问题
- feat: 支持自定义插件目录列表
pluginPaths
,主要用于第三方模块使用,参见:koa-whistle
- fix: 如果获取本地获取不到外网ip会导致
http://externalIP:whistlePort/
访问时无限循环的问题 - style: 给Network菜单加title
双击删除所有sessions
- feat: 支持设置没有schema的url,如
//ke.qq.com/test file:///User/xxx/abc
与原来的ke.qq.com/test file:///User/xxx/abc
等价
- fix: 某些服务器未按标准实现,导致无法识别纯小写的请求头,v1.3.7版本开始统一转成
Xxx-Yxx
的形式 - style: 把Rules里面的
Edit
菜单名称改成语义更明确的Rename
- fix: 无法修改
connection
请求头的问题 - fix:兼容Fiddler某些情况导出的请求url无法显示域名的问题
- feat: 支持iOS的ATS安全标准,把RSA加密算法的密钥长度修改为2048(安装运行的Node版本不能小于
v6.0.0
),参见:关于iOS的ATS - fix: 把请求头
proxy-connection
转成connection
- fix: 导入导出saz文件的一些小问题
- fix: 去掉socksv5的空闲超时设置,感谢 @echopi 反馈
- fix: 导出saz文件时,如果res为空报错的问题
- fix: 导出非utf8编码的内容为saz文件时出现的的乱码问题
- feat: 支持在规则中设置局部变量,
pattern file:///User/xxx/${filename}
或直接拼接Values的值pattern file://(${key1},${key2},${keyN})
,具体功能参考:Values - feat: 支持通过Network下拉菜单或者快捷键(
Ctrl[Command] + i
、Ctrl[Command] + S
)、拖拽文件导入导出Fiddler2、Fiddler4的saz文件 - feat: 支持tunnel请求设置
statusCode://xxx
- refactor: 新增
status://xxx
等价于statusCode://xxx
- refactor: 支持ip:port映射到ip:port,即:
127.0.0.1:6001 127.0.0.1:7001
,访问http://127.0.0.1:6001
会转发到http://127.0.0.1:7001
- refactor: 加入agent的连接池中空闲连接的超时机制,防止请求某些情况下无法触发
free
事件,导致连接无法释放
- refactor: 方便手动输入url,把安装根证书的url修改为http://rootca.pro/
- fix: tunnel代理中通过插件设置tunnelProxy无效的问题
- fix: websocket映射没有同步修改请求path的问题
- fix: 兼容大量不规范的头部处理方式,将输出的响应头的字段名称的首字母及
-
后面的字母都转成大写
- feat: 支持自定义根证书及特定域名的证书、通配证书
- feat: 插件新增statsServer,可以用于统计请求及获取所有请求的参见就头信息,详见插件开发
- fix: Buffer.from兼容性问题,在node v5上不支持字符串参数
- refactor: 去掉head这个老协议,可以使用跟方便的reqXxx,resXxx协议
- fix: #16
- feat: 支持通过
Ctrl + Shift + /
切换Rules编辑框的注释状态,选中的行中如果注释将解除注释,如果没有注释,则会注释掉这行 - feat: 新增rulesFile,可以批量设置规则或者通过脚本动态设置规则
- refactor: 支持通过(
whistle.xxx://
、whistle.yyy://
)同时匹配多个插件 - refactor: 调整pac逻辑,让替换后的请求也有作用
- refactor: 把socks、proxy协议作为一个独立的协议,使得给匹配的规则设置代理
- chore: 调整协议列表的顺序
- docs: 修改帮助文档链接,提升访问速度: https://avwo.github.io/whistle/
- feat: 新增精确匹配(原来也可以通过正则实现,只是对这种情形用这方式比较方便),
$url operator-uri
详见匹配方式 - feat: 支持各个rules server(pluginRulesServer, rulesServer, tunnelRules, resRulesServer)传values过来,详见插件开发
- style: 添加双击
Network
按钮情况请求列表的快捷方式 - style: 添加输入系统或插件没有对应的协议时加中划线及字体颜色变红
- chore:处理了所有eslint错误
- fix: 修复了匹配顺序的bug,如下配置访问http://test.com:8080会匹配到下面的规则: test.com operator-uri /./ operator-uri
- fix: 插件相关的一些绝对路径的问题,用到插件最好升级到最新版本
- feat:新增pac用于设置pac脚本
- feat: 新增delete可用于delete请求或响应的头字段,而通过reqHeaders或resHeaders只能设置为空字符串
- style: 把删除选中或非选中的数据及清空整个列表的按钮放到Network按钮的菜单列表里面
- style: 在Network下拉菜单里面新增
查看选中数据
,可以获取当前选中数据的json格式化数据。
- feat: plugin新增tunnelServer,支持把tunnel请求转发到tunnelServer
- feat: 新增协议plugin.xxx、whistle.xxx,whistle.xxx://value <=> plugin.xxx://value <=> plugin://xxx://value
- refactor: 优化了
socks
和proxy
的代理设置,新增socket复用及请求头的修改
- refactor: 把ruleValue传给tunnelRulesServer
- refactor: 把cgi和正常请求的客户端ip透传给插件
- feat: 支持local.whistlejs.com与xxx.local.whistlejs.com带端口访问
- feat: 支持plugin://name(ruleValue)或plugin://name://ruleValue的方式传值个插件的除server和uiServer以外的server
- feat: 新增命令行参数
-l, --localUIHost
支持修改访问配置页面的域名,默认为local.whistlejs.com
- fix:windows的默认换行符导致命令行在Mac会Linux上不可用,请更新到最新版本即可:更新whistle
- fix: https代理可能出现异常的问题
- feat: 新增plugin.tunnelRulesServer用于在插件上设置代理tcp请求的规则
- feat: 通过https代理过来的请求,没被拦截的请求都认为tunnel协议,如: tunnel://www.baidu.com:443,具体参加:注意事项
- feat: 代理请求新增
x-whistle-policy
用于设置whistle策略,目前只tunnel
让whistle不要拦截https代理。 - test: 新增对https代理的一些测试用例
- fix: Linux设置开机启动无法找到homedir的问题
- feat: 新增开机启动脚本,如何设置开机启动,请参考开机启动
- feat: plugin中新增statusServer,用于获取请求的状态: 请求开始、请求结束或请求出错,具体参见插件开发
- fix: 修复插件的plugin.rulesServer可能导致whistle crash的问题
- feat: 新增plugin,用于实时通知指定插件请求状态的变化及动态修改rules,如果匹配了插件的协议,则会忽略plugin的配置
- feat: 加入urlReplace支持类似字符串的replace方法,替换请求url的路径内容
- style: 在Overview里面精确显示匹配
pattern matcher
,并在title里面显示配置规则的原始配置
- test: 加入自动化持续集成travis,并修复了一下bug
- fix: 响应有错误信息直接显示在抓包列表上
fix: 修复请求头有非法字符导致程序奔溃的问题
- feat: 支持配置配置ip:port,如:
pattern host://ip:port
(port可选),这与pattern ip:port
的区别是:后者会把请求头的host
字段修改为ip:port
(ip为IPv4或IPv6) - feat: 支持同一个用户启动多个whistle服务
w2 start -S newStorageDir -p newPort
,具体参见安装启动 - docs: 修改页面中帮助文档的链接
- fix: 重写文档的过程中把所有功能都人肉跑了一遍,修复了一下问题,后续版本把自动化持续集成的功能加上
- feat: 新增hostname用于修改
req.headers.host
- feat: 支持通过
WHISTLE_PLUGINS_PATH
配置插件路径,whistle会优先从join(WHISTLE_PLUGINS_PATH, 'node_modules')
加载插件 - fix: 修复在overview中优先显示插件私有规则的问题(PS:在Rules中配置的规则优先级最高)
- fix: post请求超时时间太短的问题,并把表单上传的请求的默认timeout时间加倍,减少上传失败的概率
fix: statusCode < 100 || statusCode > 999
会抛出异常导致程序crash
if (statusCode < 100 || statusCode > 999)
throw new RangeError(`Invalid status code: ${statusCode}`);
PS:看了下提交记录,是2016年4月20号提交的代码:eee69b81faf2df406ac3c571bee31ebd501cfd9d
- fix: 修复在https请求中使用log可能出现
Mixed Content
警告的问题 - feat: log支持同时输出多个参数
console.log(location.href, a1, a2, ...)
的写法 - fix: 清空请求数据的快捷键为
Ctrl+X
(mac也可以用Command+X
),但原来在Clear按钮上的title提示错了 - feat: 加入快捷键
Ctrl+D
或Command+D
(Mac),用于删除请求列表中选中的条目、选中的rule、选中的value - feat: 加入快捷键
Ctrl +向上箭头
和Ctrl +向下箭头
(Mac用Command+向上箭头
和Command +向下箭头
) 用于调整Rules(Values)列表的顺序 - feat: 支持点击请求列表的表头重新对列表进行重新排序
- feat: 把下一个匹配到的Rule通过NEXT_RULE_HEADER(x-whistle-next-rule)的头字段传到rulesServer,这样可以判断是否执行下一个规则
- fix: 修复在调整窗口大小是没有重绘的问题
- feat: 把官网网址(官网还在开发中...)改为:http://wproxy.org
- feat: 新增replaceStatus用于修改服务器响应的状态码,与statusCode的区别是,后者不会请求到后台服务器,而是直接根据设置的状态码响应
- feat: 新增location用于修改或添加响应头的location字段,一般与replaceStatus的
replaceStatus://301
、replaceStatus://302
配合使用
-
feat: 检测并提示代理服务器被切换
-
feat: 界面上同时展示的请求数,由360调整为560
-
perf: 极大提升UI界面的性能
-
fix: 可能出现的如下异常
Date: 2016-06-22 00:47:13.466 RangeError: out of range index at RangeError (native) at StringDecoder.fillLast (string_decoder.js:94:9) at StringDecoder.write (string_decoder.js:73:14) at PassThrough. (/Users/xxx/whistle/lib/util/index.js:931:33) at emitOne (events.js:96:13) at PassThrough.emit (events.js:188:7) at readableAddChunk (_stream_readable.js:172:18) at PassThrough.Readable.push (_stream_readable.js:130:10) at PassThrough.Transform.push (_stream_transform.js:128:32) at afterTransform (_stream_transform.js:77:12) at TransformState.afterTransform (_stream_transform.js:54:12)
- refactor: 去除自动同步v0.3.0之前版本数据的逻辑(v0.3.0及以后版本的whistle数据存储目录做了一次修改)
- style: 替换全新的logo,感谢部门的视觉设计同事**@wjdgh1031(鬼刀)**帮忙设计了新logo
- feat:新增Server Log,用于记录服务端的日志:Network -> Log -> Server
- refactor: 调整log的加载逻辑,确保在打开Network -> Log前记录的log都能看到
- fix: 修复log协议出现请求被gc的情况
- fix: log可能导致页面出现的样式问题
- feat: 新增规则包,可以在插件加入全局及内部的规则包,详见:自定义插件
- feat: 新增
rawfile
、xrawfile
的功能,详见:rule - fix: 修复headers里面的set-cookie可能导致页面js出错的问题
- refactor: 更新页面用到的react到最新版本,提升前端性能
- fix: 如果插件的package.json格式有问题会导致无法自动加载插件
- fix: 修复reqAppend、resAppend无效的问题
refactor: 详细的启动提示信息兼容node v0.10.x
- feature: 加入
disable://ajax
,用于删除请求头x-requested-with
- feature: 新增accept用于修改请求头的accept字段
- feature: 加入插件开发过程中输出详细日志,#3
- feature: 新增菜单栏 -> Rules -> Setting -> Disable all rules的选项,用于禁用所有规则
- refactor: 修改
reqType
,resType
的默认行为,如果reqType
,resType
没有带charset的时候,保留原有的charset - refactor: 新增详细的启动提示信息
refactor: 限制starting的版本为0.1.1,后面发布的starting版本和现有的不兼容
bugfix:修复keepAlive可能导致请求无法响应的问题
- 新增reqCharset和resCharset两个协议,分别用于快速修改请求、响应的编码
- bugfix:修复可能出现请求出错的情况,nodejs/node#4482
- **重要bugfix:**Fix https post数据时可能出现pending的问题
- 新增etag协议,用于修改请求头的etag
- 支持通过
ua://
、referer://
、reqType://
、resType://
等,把对应的字段置空
- 修复自定义插件不能获取values的值,即
pattern plugin://{key}
无法正确获取ruleValue的问题 - 限制自定义插件的名称不能与内置的协议名称冲突,如果冲突则该自定义插件将无效
- whistle ui -> about -> 插件列表:插件列表显示按ascii码排序
- 缓存dispatch的script,提升速度
- 新增attachment用于设置下载文件的响应头
content-disposition: attachment; filename="attachment"
- 新增插件机制,可以很方便的自定义插件,并提供了平时开发中有用的插件作为例子,具体请参考请查看:自定义whistle插件
- 加入请求失败自动重试机制,减少请求出错的情况
bugfix: Cannot read property 'dist-tags' of null
新增 dispatch 协议,主要用途:某些情况需要我们根据用户的ip、或ua、或cookie等来动态决定匹配规则,这时可以利用 dispatch
来执行自定义脚本来修改url里面的请求参数从而修改请求的url,最后达到修改请求url匹配的规则的目的。
- 支持通过插件开启在网页的右下角显示访问的真实ip,需要安装最新版的Chrome插件:https://github.com/avwo/whistle-for-chrome
- 支持
exportsUrl
,可以把匹配到的请求url导出到指定的文件 - 新增功能
resCors://use-credentials
(等价于resCors://enable
),让语义更清晰 - 新增更简洁的命令行命令
w2
,新版的whistle同时支持whistle xxx
和w2 xxx
,如w2 start
、w2 restart
、w2 stop
、w2 --help
等
新增 exports
功能,用于把请求导出到指定文件(如果该文件不存在,则会自动创建),每一行都是如下json对象(第一行可能为空):
{
startTime: '请求的开始时间',
dnsTime: 'dns结束时间',
requestTime: '请求结束时间',
responseTime: '开始响应的时间',
endTime: '响应结束的时间',
url: '请求的url',
realUrl: '实际请求的url(一般设置了替换规则,才会有realUrl,否则不会显示该字段)',
method: '请求使用的方法',
httpVersion: 'http版本号',
clientIp: '用户ip',
hostIp: '服务器ip',
reqError: '是否请求阶段出错',
reqSize: '请求内容的长度',
reqHeaders: '请求头',
reqTrailers: '请求的trailers',
statusCode: '响应状态码',
resError: '是否在响应阶段出错',
resSize: '响应内容的长度',
resHeaders: '响应头',
resTrailers: '响应的trailers',
rules: '匹配到的规则'
}
- 新增
reqWriter
、resWrite
分别用来把请求内容和响应内容写入到本地文件 - 新增
reqWriterRaw
、resWriteRaw
分别用来把请求完整信息和响应的完整信息写入到本地文件(包括路径、协议、方法、响应状态码、头部、内容等) - bugfix: 使用
reqReplace
改变了请求内容长度没有同步处理headers的content-length的问题 - 支持通过
params
替换上传表单的字段 - 对形如
[a-z]:\*
、[a-z]:/xxx
、/xxx
自动识别为file://...
即:
www.text.com/ /User/xxx # 或 www.text.com/ D:\workspace
# 等价于
www.text.com/ file:///User/xxx # 或 www.text.com/ file://D:\workspace
1. 修复使用log的时候,多次注入脚本导致console的时候会重复打印多次
2. 增加repReplace、resReplace的缓存字符串大小
- bugfix:
修复前:
/(.*):8899(\/.*)/ $1$2
结果: http://xxx:8899 http://http://xxx
修复后:
/(.*):8899(\/.*)/ $1$2 --> http://xxx:8899 http://xxx
- 加入小版本更新时给出小提示
- 添加
disable
的新功能:301、dnsCache、keepAlive、intercept - 新增
reqReplace
和resReplace
两个功能:类似js字符串的replace
方法,分别用来替换请求和响应的文本内容
-
新增了
disable
协议,用来禁用cache、cookie、referer、ua、timeout、csp,具体参考:功能列表 -
纠正了解析配置操作符使用拼接后url的问题
-
原来通过filter启用HTTPS,推荐改用这种方式:启用HTTPS
bugfix:修改了路径匹配可能多加一个 /
的问题
形如:
http://www.test.com/index.html http://www.test.com:8888/index.html
# http://www.test.com/index.html?query --> http://www.test.com:8888/index.html/?query
bugfix:修改v0.5.7版直接访问http://local.whistlejs.com/index.html脚本出错的问题
新增快捷键:ctrl[command]+鼠标点击:快速打开rules设置的key(点击形如:
xxx://{key}` 的规则)在values中的位置(如果values中不存在对应的key,则会自动创建),更多内容请参考:界面操作
修复低版本的node在拦截https时,有可能产生的重复关闭server会抛出异常的情况
新增支持配置模式:pattern operator-uri1 operator-uri2 ... operator-uriN (原来只支持operator-uri pattern1 pattern2 ... patternN)
这种情况下 pattern
和 operator-uri1
不能同时为形如这种形式的uri:[http[s]|ws[s]://]www.example.com/*
,否则会忽略后面的 operator-uri2 ... operator-uriN
微调parseInlineJSON的实现
新增:支持 www.qq.com resHeaders://(content-type=text/plain)格式
修复:本地调试时,https的根证书可能被开发目录的根证书自动覆盖问题
- JSON对象的一种inline写法,可以直接写在协议的uri里面,形如:
protocol://name1=values&name2=value2&name3&name4=&name5=value5&nameN=valueN
- 加入了如果有大版本的更新,会自动提醒(一般有新功能加入或修复致命bug才会有大版本的更新)
bugFix:
修改了一些子匹配的问题,及urlParams,params可能无效的问题
修改快捷键 ctrl + /
的小bug:没有选中,及从后往前选择会导致聚焦有点问题。
- 菜单
Rules
、Values
、Weinre
,hover出现列表(原来需要点击才能出现列表) - 新增快捷键
ctrl + /
来注释(取消注释)选中的行 - 新增
css
、html
、js
3个协议,分别用来注入css、js、html到html页面,或css代码到css文件,js代码到js文件的底部。这个与resPrepend、resBody、resAppend的区别是:系统会自动判断响应的类型来选择注入
fix如果请求包含content-length导致weinre无法注入的bug
fix配置某些带端口号正则的时候可能导致系统奔溃的情况