-
Notifications
You must be signed in to change notification settings - Fork 1.1k
功能列表
以下功能只有最新版本的whistle才能保证全部支持,建议老版本用户及时升级到最新版本,如何升级,请参考: 更新whistle
whistle 可以用于查看http[s]、ws[s]请求,更有强大的配置功能; whistle 把对请求的操作抽象成一个个 uri
(每种功能对应一个协议、每个操作对应该协议的一个uri),所以通过类似传统hosts的简单配置即可实现对请求的操作,支持更灵活的匹配方式(域名、路径,正则),只需记住请求url的某个关键字即可设置匹配;可以做本地替换(支持jsonp请求的替换),请求替换,修改请求头、响应头,请求参数,注入内容,限制速度,设置代理,并集成了weinre用于调试移动端页面,且通过log协议,可以自动捕获手机端或ie6、7浏览器的js错误,且可以自动注入自定义脚本,调用console对象的各个方法调试js(ie6、7也支持),whistle 会把捕获到的错误及用户手动输出的错误输出到 whistle 的Network页面右侧的log标签页中等等丰富的功能,具体参考下面列表:
Note: 配置的注释跟hosts的配置的注释一样都是使用 #
,对https、ws、wss需要开启https拦截功能才能对上述所有功能生效,否则对这三种请求,只有host、proxy、socks三种协议生效,如何开启https拦截,请求参考: 启用HTTPS
- host (设置hosts)
- req (修改请求属性)
- rule (设置响应规则)
- res (修改响应属性)
- weinre (设置weinre,调试手机页面)
- filter (过滤规则,隐藏请求等)
- disable (禁用缓存、cookie等)
- log (打印网页js错误或者调试信息)
- exports (导出请求数据到指定文件)
- exportsUrl (把请求的url列表按顺序导出到指定文件)
- hostname (把请求的host字段)
- referer (修改请求referer)
- auth (修改请求用户名密码)
- ua (修改请求user-agent)
- etag (修改请求头部的etag)
- urlParams (修改请求url的参数)
- dispatch (动态修改请求url的参数)
- params (修改请求参数)
- statusCode (直接响应)
- replaceStatus (替换后台的响应状态码)
- redirect (302重定向)
- method (修改请求方法)
- cache (修改缓存策略)
- attachment (设置下载头部)
- location (设置响应头部的location字段)
- accept (修改请求头的accept)
- reqDelay (延迟请求)
- resDelay (延迟响应)
- reqSpeed (限制请求速度)
- resSpeed (限制响应速度)
- reqType (修改请求类型)
- resType (修改响应类型)
- reqCharset (修改请求的编码)
- resCharset (修改响应的编码)
- reqCookies (修改请求cookies)
- resCookies (修改响应cookies)
- reqCors (修改请求cors)
- resCors (修改响应cors)
- reqHeaders (修改请求头)
- resHeaders (修改响应头)
- reqPrepend (往请求内容前面添加数据)
- resPrepend (往响应内容前面添加数据)
- reqBody (替换请求内容)
- resBody (替换响应内容)
- reqAppend (往请求内容后面追加数据)
- resAppend (往响应内容后面追加数据)
- reqReplace (通过正则或字符串替换请求文本内容,类似str.replace)
- resReplace (通过正则或字符串替换响应文本内容,类似str.replace)
- reqWrite (将请求内容写入指定的文件)
- resWrite (将响应内容写入指定的文件)
- reqWriteRaw (将请求的完整内容写入指定的文件)
- resWriteRaw (将响应的完整内容写入指定的文件)
- css (往响应为html或css的内容后面追加数据)
- html (往响应为html的内容后面追加数据)
- js (往响应为html或js的内容后面追加数据)
下面各种协议的配置模式,除了 请求替换 以外,都可以采用下面三种配置模式(如果请求替换是采用正则匹配方式,也可以采用下面的三种模式):
# 普通模式
pattern operator-uri
# 兼容模式
operator-uri pattern
# 组合模式
operator-uri pattern1 pattern2 ... patternN
兼容传统的hosts配置模式(这种配置模式对所有下面域名的请求都生效,非默认端口号也生效):
# 普通模式
www.example.com 127.0.0.1
# 等价于(一对一的配置,两边位置可以对调)
127.0.0.1 www.example.com
# 组合模式(位置不能调换)
127.0.0.1 www.example1.com www.example2.com:8888 www.examplen.com
# 等价于:
127.0.0.1 www.example1.com
127.0.0.1 www.example2.com:8888
127.0.0.1 www.examplen.com
# 上述三种配置模式,同样适用于下述配置
# 也可以限制域名的端口号,只对该域名的8888端口请求生效
www.example.com:8888 127.0.0.1
# 也可以限制域名的协议,只对该域名的http请求生效
http://www.example.com 127.0.0.1
# 对默认端口号的限制,只对默认端口生效(http、ws的80端口,https、wss的433端口)
www.example.com/ 127.0.0.1
# 也可以协议和端口号一起限制
http://www.example.com:8888 127.0.0.1
路径匹配:
# 对该路径及该路径下所有子路径的http[s]、ws[s]请求都生效
www.example.com/xxx 127.0.0.1
www.example.com/xxx?yyy 127.0.0.1
# 也同样可以限制某个协议
http://www.example.com/xxx 127.0.0.1
# 限制端口号
www.example.com:8888/xxx 127.0.0.1
# 限制协议及端口号
http://www.example.com:8888/xxx 127.0.0.1
正则匹配:
# 匹配所有请求
/./ 127.0.0.1
# 匹配包含某个关键字的请求
/whistle/ 127.0.0.1
# 子匹配,这里用不到,后面讲其它协议都可以用到
下面功能同样适用上述三种匹配方式及三种配置模式,为方便描述,后面只以 域名匹配方式 及 普通配置模式 为例描述协议的功能(并在req统一给出如何使用 子匹配 的例子),其它方式及模式同理可得。
用于操作请求发送的头、内容、方法、速度等。
配置模式:
# 把操作内容放在本地文件(windows)
www.example.com req://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com req://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com req:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com req://{test.txt}
如何操作values系统,参考: values
test.txt可以有如下功能(后面会提供一系列协议,把这里面的一些常用功能拆出来,方便使用):
{
"method": "post",
"headers": {
"referer": "http://www.example.com/xxx"
},
"top": "preappend body",
"prepend": "/User/xxx/top.txt",
"body": "request body",
"replace": "/User/xxx/body.txt",)
"bottom": "append body",
"append": "/User/xxx/bottom.txt",
"delay": 6000,
"speed": 20,
"timeout": 36000,
"charset": "utf8"
}
如果不修改headers,也可以采用行写法(详细参考JSON格式):
method: post
top: /User/xxx/top.txt
prepend: path
body: request body
replace: /User/xxx/body.txt
bottom: append body
append: /User/xxx/bottom.txt
delay: 6000
speed: 20
timeout: 36000
charset: "utf8"
Note: :空格
分隔符为冒号+空格
也可以采用下面这种inline
www.example.com req://method=post&top=%2FUser%2Fxxx%2Ftop.txt
# 或
req://method=post&top=%2FUser%2Fxxx%2Ftop.txt www.example.com
# 或
www.example.com req://&method=post&top=/User/xxx/top.txt
其中:
-
method
: 替换请求的方法(不区分大小写),如:post、get等 -
headers
: 替换请求头(增量的方式):whistle会把配置里面的字段一一替换请求头 -
top
: 往请求内容的顶部注入该字段的文本内容 -
prepend
: 功能同top
,区别是这个字段对应的是文本文件的路径 -
body
: 用该字段的文本替换请求内容 -
replace
: 同body
,区别是这个字段对应的是文本文件的路径 -
bottom
: 往请求内容的底部部注入该字段的文本内容 -
append
: 同bottom
,区别是这个字段对应的是文本文件的路径 -
delay
: 延迟请求的毫秒数 -
speed
: 请求速度(单位:kb/s,千比特/每秒),只对有内容的请求生效(如:post等) -
timeout
: 对单个请求指定超时(可以不设置,系统有默认的超时时间,也可以在启动时统一修改) -
charset
: 指定编码,默认为utf8
,一般不用指定,如果发现有乱码再设置页面对应的编码
用于修改整个请求数据的来源,如:转发到其它域名路径、本地文件替换、替换本地模板文件、代理到其它代理服务器、如果这些还不能满足需求,也可以自定义协议进行扩展,比如我们部门内部用的开发环境 aeproxy 就是拓展了两协议 tianma:
和 alienv:
集成了公司内部的一个本地调试的前端静态服务,安全原因这个项目不能开源。
端口转发
www.example.com www.example.com:8888
www.qq.com:8888 www.qq.com
2). 请求转发
www.example.com www.qq.com
http://www.baidu.com https://www.baidu.com
替换本地目录或文件,请求会自动补全路径,替换对应目录里面的文件:
# windows
www.example.com file://D:/workspace/dir
# 也可以
www.example.com file://D:\workspace\dir
# 其它
www.example.com file:///User/workspace/dir
# 也可以同时配置多个目录,whistle会自动遍历,直到找到为止,分隔符为:`|`
www.example.com file:///User/workspace/dir1|/User/workspace/dir2|/User/workspace/dirN|/User/workspace/dirN/index.html
xfile
与 file
的功能一样,都是用来替换本地文件或目录,区别是:xfile
如果在本地找不到,会自动请求线上的资源
# windows
www.example.com xfile://D:/workspace/dir
# 也可以
www.example.com xfile://D:\workspace\dir
# 其它
www.example.com xfile:///User/workspace/dir
# 也可以同时配置多个目录,whistle会自动遍历,直到找到为止,分隔符为:`|`
www.example.com xfile:///User/workspace/dir1|/User/workspace/dir2|/User/workspace/dirN|/User/workspace/dirN/index.html
替换本地目录或http响应内容格式的文件(可以与resWriteRaw配合使用),请求会自动补全路径,替换对应目录里面的文件:
# windows
www.example.com rawfile://D:/workspace/dir
# 也可以
www.example.com rawfile://D:\workspace\dir
# 其它
www.example.com rawfile:///User/workspace/dir
# 也可以同时配置多个目录,whistle会自动遍历,直到找到为止,分隔符为:`|`
www.example.com rawfile:///User/workspace/dir1|/User/workspace/dir2|/User/workspace/dirN|/User/workspace/dirN/index.html
xrawfile
与 rawfile
的功能一样,都是用来替换本地http响应内容格式的文件或目录,区别是:xrawfile
如果在本地找不到,会自动请求线上的资源
# windows
www.example.com xrawfile://D:/workspace/dir
# 也可以
www.example.com xrawfile://D:\workspace\dir
# 其它
www.example.com xrawfile:///User/workspace/dir
# 也可以同时配置多个目录,whistle会自动遍历,直到找到为止,分隔符为:`|`
www.example.com xrawfile:///User/workspace/dir1|/User/workspace/dir2|/User/workspace/dirN|/User/workspace/dirN/index.html
tpl
与 file
的功能一样,都是用来替换本地文件,区别是:tpl
会解析url里面的请求参数成JSON对象,并自动替换文本里面的 {name}
占位符,这个可以用来构造 jsonp
请求数据。
# windows
www.example.com tpl://D:/workspace/dir
# 也可以
www.example.com tpl://D:\workspace\dir
# 其它
www.example.com tpl:///User/workspace/dir
# 也可以同时配置多个目录,whistle会自动遍历,直到找到为止,分隔符为:`|`
www.example.com tpl:///User/workspace/dir1|/User/workspace/dir2|/User/workspace/dirN|/User/workspace/dirN/index.html
test.txt
{callback}({ec: 0})
xtpl
与 tpl
的功能一样,都是用来替换本地文件或目录,区别是:xtpl
如果在本地找不到,会自动请求线上的资源
# windows
www.example.com xtpl://D:/workspace/dir
# 也可以
www.example.com xtpl://D:\workspace\dir
# 其它
www.example.com xtpl:///User/workspace/dir
# 也可以同时配置多个目录,whistle会自动遍历,直到找到为止,分隔符为:`|`
www.example.com xtpl:///User/workspace/dir1|/User/workspace/dir2|/User/workspace/dirN|/User/workspace/dirN/index.html
test.txt
{callback}({ec: 0})
把请求代理到其它http代理服务器(如:fiddler、charles等)。
# 把 www.example.com 的请求代理到本机的Fiddler或Charles
www.example.com proxy://127.0.0.1:8888
# 也可以直接用域名的方式
www.example.com proxy://www.httpproxy.com:8888
把请求代理的socks代理服务器。
# 把请求代理到socksv5服务器
www.example.com socks://www.socksproxy.com:1080
#如果需要用户名和密码
www.example.com socks://user1:pass1|user2:pass2|userN:[email protected]:1080
v0.8.0及以上版本,支持通过安装node模块的方式动态添加插件,请升级到最新版本,插件的使用与开发参考:自定义插件
这部分有疑问直接加群,人工解答:462558941
用于操作请求响应的头、内容、状态码、速度等。
配置模式:
# 把操作内容放在本地文件(windows)
www.example.com res://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com res://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com res:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com res://{test.txt}
如何操作values系统,参考: 界面操作
test.txt可以有如下功能(后面会提供一系列协议,把这里面的一些常用功能拆出来,方便使用):
{
"statusCode": "500",
"headers": {
"content-type": "text/plain; charset=utf8"
},
"top": "preappend body",
"prepend": "/User/xxx/top.txt",
"body": "request body",
"replace": "/User/xxx/body.txt",)
"bottom": "append body",
"append": "/User/xxx/bottom.txt",
"delay": 6000,
"speed": 20
}
如果不修改headers,也可以采用行写法(详细参考JSON格式):
statusCode: post
top: /User/xxx/top.txt
prepend: path
body: request body
replace: /User/xxx/body.txt
bottom: append body
append: /User/xxx/bottom.txt
delay: 6000
speed: 20
Note: :空格
分隔符为冒号+空格
其中:
-
statusCode
: 修改响应状态码,如果设置了statusCode,请求将不会发送到对应的服务器,whistle将直接按状态码响应后返回给浏览器,利用此功能可以用来模拟 4xx、5xx等响应 -
headers
: 修改响应头 -
top
: 往响应内容的顶部注入该字段的文本内容 -
prepend
: 功能同top
,区别是这个字段对应的是文本文件的路径 -
body
: 用该字段的文本替换响应内容 -
replace
: 同body
,区别是这个字段对应的是文本文件的路径 -
bottom
: 往响应内容的底部部注入该字段的文本内容 -
append
: 同bottom
,区别是这个字段对应的是文本文件的路径 -
delay
: 延迟响应的毫秒数 -
speed
: 响应速度(单位:kb/s,千比特/每秒),只对有内容的请求生效(如:post等)
weinre 主要用于调试移动端的网页,可以通过pc操作移动端网页,详细请参考: weinre,或者直接找度娘。
如何使用weinre:
-
配置手机代理:先把手机的请求代理到whistle,ip为whistle所在机器的ip,端口号为whistle的监听的端口号(默认为:
8899
) -
配置要注入的请求(系统会自动判断是否为html,如果不是则不会自动注入):
# xxx为对应的weinre id,主要用于页面分类,方便weinre查找,默认为anonymous www.example.com weinre://xxx
-
手机打开配置的页面,然后点击
network
页面顶部操作栏的 Weinre 按钮,在下拉列表就可以找到设置的weinre id的,点击会新开一个weinre调试页面,可以开始使用weinre -
手机调试或者远程访问时,可能会因为whistle所在机器的防火墙设置,导致无法远程访问,可以通过设置白名单,或者关闭防火墙:http://jingyan.baidu.com/article/870c6fc317cae7b03ee4be48.html
filter主要用来对某些请求做禁用工作的,可以把配置的协议禁用掉,或把禁用https拦截。
# 禁用拦截https(某些https请求需要客户端证书,对这类请求无法使用https拦截)
wwww.example.com filter://intercept
# 禁用配置的host
wwww.example.com filter://host
# 隐藏匹配的请求,功能和菜单栏的Filter相反,后者是显示匹配的请求
wwww.example.com filter://hide
# 也可以同时禁用一系列配置
www.example.com filter://intercept|host|weinre|req|res
用来禁用cache、cookie、ua、referer、csp、timeout、301、intercept、dnsCache、keepAlive。
# 禁用请求的缓存,只要经过代理且匹配到的请求都不会使用缓存
# 跟 cache 协议的区别是,cache 只是用来设置响应的缓存头
wwww.example.com disable://cache
# 禁用请求和响应的cookie
wwww.example.com disable://cookie # 也可以写成复数形式cookies
# 只禁用请求的cookie
wwww.example.com disable://reqCookie # 也可以写成复数形式reqCookies
# 只禁用响应的cookie
wwww.example.com disable://resCookie # 也可以写成复数形式reqCookies
# 删除ua
wwww.example.com disable://ua
# 删除referer
wwww.example.com disable://referer
# 删除csp策略
wwww.example.com disable://csp
# 禁用timeout,默认情况下whistle对每个请求如果36s内没有发生数据传输,会认为请求超时
wwww.example.com disable://timeout
# 把301转成302,防止cache
wwww.example.com disable://301
# 禁用https拦截,与filter://intercept相同
wwww.example.com disable://intercept
# 不缓存远程的dns(通过whistle配置的host是不会缓存),主要用于测试网页的极端情况的加载速度
wwww.example.com disable://dnsCache
# 禁用代理服务器请求链接复用
wwww.example.com disable://keepAlive
# 删除请求头 `x-requested-with`
wwww.example.com disable://ajax
# 也可以同时禁用多个
www.example.com disable://cache|cookie|ua|referer|csp|timeout|301|intercept|dnsCache|keepAlive
可以用来自动监控html页面或js文件出现的错误,这些错误会自动打印在whistle界面的log平台,还可以自动嵌入自定义的脚本调试页面,脚本可以直接调用console的各个方法,不会有兼容性问题。
支持的console方法有: console.log, console.debug, console.info, console.warn. console.error, console.fatal。
手机端和pc都需要提前设置好代理,规则配置如下:
# 把操作内容放在本地文件(windows)
www.example.com log://D:/workspace/test.js
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com log://D:\workspace\test.js
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com log:///User/xxx/workspace\test.js
# 把操作内容放在whistle的values系统
www.example.com log://{test.js}
Note:test.js为自定义脚本,whistle会自动注入到相应请求
whistle会自动判断是html还是js请求,如果是html则会自动把监听脚本及自定义脚本放在html最前面,用户可以通过监听html页面的加载事件决定什么时候执行自定义脚本的方法;如果是js页面会把监听脚本放在js文件的前面,自定义脚本放在js文件的最后面。
如何操作values系统,参考: 界面操作
用于把请求导出到指定文件(如果该文件不存在,则会自动创建):
# 把所有的请求数据导出到指定文件(windows)
/./ exports://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
/./ exports://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
/./ exports:///User/xxx/workspace\test.txt
# 也可以指定域名或路径、或通过正则来决定导出哪些数据
www.example.com exports:///User/xxx/workspace\test.txt
www.example.com/test exports:///User/xxx/workspace\test.txt
/example/i exports:///User/xxx/workspace\test.txt
每一行都是如下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: '匹配到的规则'
}
Note: 如果想把请求或响应的内容写入本地,可以使用 reqWrite
或 resWrite
用于把请求的url列表按顺序导出到指定文件(如果该文件不存在,则会自动创建):
# 把所有的请求的url导出到指定文件(windows)
/./ exportsUrl://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
/./ exportsUrl://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
/./ exportsUrl:///User/xxx/workspace\test.txt
# 也可以指定域名或路径、或通过正则来决定导出哪些数据
www.example.com exportsUrl:///User/xxx/workspace\test.txt
www.example.com/test exportsUrl:///User/xxx/workspace\test.txt
/example/i exportsUrl:///User/xxx/workspace\test.txt
每一行对应请求的url(第一行可能为空):
Note: 如果想把请求或响应的内容写入本地,可以使用 reqWrite
或 resWrite
直接修改请求头的 host
(修改请求头的host
只能用改协议,其它都无效):
www.example.com:8080 hostname://www.example.com
直接修改请求头的 referer
,这个是设置 req
头字段的快捷方式,优先级会高于在 req.headers
设置的referer。
www.example.com referer://http://www.test.com/
直接修改请求头的 authorization
,这个是设置 req
头字段的快捷方式,优先级会高于在 req.headers
设置的authorization。
# 把操作内容放在本地文件(windows)
www.example.com auth://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com auth://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com auth:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com auth://{test.txt}
如何操作values系统,参考: 界面操作
test.txt可以有如下功能(后面会提供一系列协议,把这里面的一些常用功能拆出来,方便使用):
{
"username": "myusername",
"password": "mypassword"
}
也可以采用行写法(详细参考JSON格式):
username: myusername
password: mypassword
Note: :空格
分隔符为冒号+空格
直接修改请求头的 user-agent
,这个是设置 req
头字段的快捷方式,优先级会高于在 req.headers
设置的user-agent。
www.example.com ua://Mozilla/5.0
直接修改请求头的 etag
,这个是设置 req
头字段的快捷方式,优先级会高于在 req.headers
设置的etag。
www.example.com etag://xxx
同下面的 params,urlParams
用于修改或追加url请求参数,如果是get请求,则 params
会覆盖 urlParams
的相同字段。
# 把操作内容放在本地文件(windows)
www.example.com urlParams://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com urlParams://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com urlParams:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com urlParams://{test.txt}
Note: 这个会展示在 Overview
的 Url
里面
某些情况需要我们根据用户的ip、或ua、或cookie等来动态决定匹配规则,这时可以利用 dispatch
来执行自定义脚本来修改url里面的请求参数从而修改请求的url,最后达到修改请求url匹配的规则的目的。
# 配置规则
/test=1/ operator-uri
/test=2/ operator-uri
/test=3/ operator-uri
# 配置dispatch
www.example.com dispatch://D:/workspace/test.js
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com dispatch://D:\workspace\test.js
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com dispatch:///User/xxx/workspace/test.js
# 把操作内容放在whistle的values系统
www.example.com dispatch://{test.js}
test.js内容:
var ua = headers['user-agent'];
if (/iphone/i.test(ua)) {
params.test=1;
} else if (/android/i.test(ua)) {
params.test=2;
} else {
params.test=3;
}
whistle会自动加载test.js的脚本,并把如下对象作为context传进来:
var context = {
url: //请求url,
method: //请求方法,
httpVersion: //请求http版本,
ip: //请求客户端的ip,
headers: //请求的头部,
params: //请求参数,可以动态修改
};
如何操作values系统,参考: 界面操作
修改请求参数,如果是get请求,则会自动修改url里面的请求参数;如果是表单或ajax的post,则会自动修改请求内容里面的参数。
# 把操作内容放在本地文件(windows)
www.example.com params://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com params://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com params:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com params://{test.txt}
如何操作values系统,参考: 界面操作
test.txt可以有如下功能(后面会提供一系列协议,把这里面的一些常用功能拆出来,方便使用):
{
"name1": "value1",
"name2": "value2",
"num": 1,
"bool": true
}
也可以采用行写法(详细参考JSON格式):
name1: value1
name2: value2
num: 1
bool: true
替换上传表单:
上传表单的内容分为两部分,正常的表单字段和上传的文件:
配置方式同上
test.txt:
{
"name1": "value1",
"name2": "value2",
"file1": {
"filename": "text.txt",
"content": "xxxxxxxxxxxxxxx"
}
}
- 替换正常的表单自动
- 替换上传的文件内容及文件名
- 如果没有对应的字段,则会自动生成设置的字段
Note: :空格
分隔符为冒号+空格
直接响应请求,与 res.statusCode
功能一样,优先级高于后者。如果设置了statusCode,请求将不会发送到对应的服务器,whistle将直接按状态码响应后返回给浏览器,利用此功能可以用来模拟 4xx、5xx等响应
www.example.com statusCode://500
修改后台响应的状态码,和上面的statusCode的区别是:statusCode是直接响应,请求不会到后台,而replaceStatus是把后台返回的状态码修改掉
www.example.com replaceStatus://500
直接302响应,相当于配置 res.statusCode = 302
及 res.headers.location = 'http://www.test.com/'
。
www.exammple.com redirect://http://www.test.com/
直接修改请求方法,这个与设置 req.method
效果一样,且优先级高于后者。
www.example.com method://post
设置响应的缓存头,可以设置 cache://no
(或 cache://no-cache
)、cache://no-store
、cache://200
(cache://maxAge
,maxAge为缓存的秒数)
www.example.com cache://no-store
延迟请求,可设置在多少毫米后再发送请求,与 req.delay
功能一致,优先级高于后者。
# 延迟3秒后请求
www.example.com reqDelay://3000
设置下载文件的头部attachment://filename
(默认filename
为url中对应的文件名称,如果没有、则为index.html
),让请求变成直接下载
#下载到文件index.html
www.qq.com attachment://
# 下载到指定文件 www.qq.com.html
www.qq.com attachment://www.qq.com.html
# 下载到文件名 api.html
http://www.expressjs.com.cn/4x/api.html attachment://
修改后台响应过来的http头部location字段,一般与replaceStatus配合使用,可以设置301
、 302
等,这个与redirect的区别是:redirect是直接响应,请求不会到后台
www.example.com/test.html replaceStatus://302 location://https://github.com/avwo
修改请求头的accept字段
www.example.com accept://image/*
延迟请求,可设置在多少毫米后再发送请求,与 req.delay
功能一致,优先级高于后者。
# 延迟3秒后请求
www.example.com reqDelay://3000
延迟响应,可设置在多少毫米后再响应,与 res.delay
功能一致,优先级高于后者。
# 延迟3秒后响应
www.example.com resDelay://3000
设置请求速度(单位:kb/s,千比特/每秒),与 req.speed
功能一致,优先级高于后者。
# 2kb/s
www.example.com reqSpeed://2
设置响应速度(单位:kb/s,千比特/每秒),与 res.speed
功能一致,优先级高于后者。
# 2kb/s
www.example.com resSpeed://2
设置请求请求头的 content-type
,与 req.headers['content-type']
功能一致,优先级高于后者,且前者提供了一些关键字用来设置一些常用的类型头:
{
'urlencoded': 'application/x-www-form-urlencoded',
'form': 'application/x-www-form-urlencoded',
'json': 'application/json',
'text': 'text/plain',
'upload': 'multipart/form-data',
'multipart': 'multipart/form-data',
'default': 'application/octet-stream'
}
配置模式:
# urlencoded
www.example.com reqType://urlencoded
# 相当于
www.example.com reqType://application/x-www-form-urlencoded
# 也可以自定义
www.example.com reqType://xxx/yyy
设置响应头的 content-type
,与 res.headers['content-type']
功能一致,优先级高于后者,且前者提供了一些关键字用来设置一些常用的类型头(html
, js
, css
, json
, jsonp
, txt
等等):
# urlencoded
www.example.com resType://html
# 相当于
www.example.com resType://text/html
# 如果需要设置charset(注意:中间不能有空格)
www.example.com resType://text/html;charset=utf8
设置或修改请求头 content-type
的 charset=xxx
:
www.example.com reqCharset://utf8
设置或修改响应头 content-type
的 charset=xxx
:
www.example.com resCharset://utf8
修改或添加请求的cookie:
# 把操作内容放在本地文件(windows)
www.example.com reqCookies://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com reqCookies://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com reqCookies:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com reqCookies://{test.txt}
如何操作values系统,参考: 界面操作
test.txt可以有如下功能(后面会提供一系列协议,把这里面的一些常用功能拆出来,方便使用):
{
"name1": "value1",
"name2": "value2",
"num": 1,
"bool": true
}
也可以采用行写法(详细参考JSON格式):
name1: value1
name2: value2
num: 1
bool: true
Note: :空格
分隔符为冒号+空格
修改或添加响应的cookie,响应的cookie比请求的cookie多了如下几个可以设置的属性,maxAge
, path
, domain
, httpOnly
, secure
# 把操作内容放在本地文件(windows)
www.example.com reqCookies://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com reqCookies://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com reqCookies:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com reqCookies://{test.txt}
如何操作values系统,参考: 界面操作
test.txt可以有如下功能(后面会提供一系列协议,把这里面的一些常用功能拆出来,方便使用):
{
"name1": "value1",
"name2": "value2",
"num": 1,
"bool": true
}
# 如要设置一些cookie属性可以采用如下方式:
{
"name1": {
"value": "value1",
"maxAge": 60,
"httpOnly": true,
"path": "/",
"secure": true,
"domain": ".example.com"
},
"name2": "value2",
"num": 1,
"bool": true
}
也可以采用行写法(详细参考JSON格式):
name1: value1
name2: value2
num: 1
bool: true
Note: :空格
分隔符为冒号+空格
修改或添加请求头的cors:
# 把操作内容放在本地文件(windows)
www.example.com reqCors://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com reqCors://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com reqCors:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com reqCors://{test.txt}
如何操作values系统,参考: 界面操作
test.txt可以有如下功能:
{
"origin": "*",
"method": "POST",
"headers": "x-test"
}
其中:
-
origin
表示请求头字段origin
-
method
表示请求头字段access-control-request-method
-
headers
表示请求头字段access-control-request-headers
。
也可以采用行写法(详细参考JSON格式):
origin: *
method: POST
headers: x-test
Note: :空格
分隔符为冒号+空格
修改或添加响应头的cors:
# 把操作内容放在本地文件(windows)
www.example.com resCors://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com resCors://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com resCors:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com resCors://{test.txt}
# 一些关键字
# `*` 表示设置 access-control-allow-origin: *
www.example.com resCors://*
# `enable` (v0.7.0及以上版本也可以用 `use-credentials`) 表示设置 access-control-allow-origin: http://originHost,
# access-control-allow-credentials: true
www.example.com resCors://enable
如何操作values系统,参考: 界面操作
test.txt可以有如下功能:
{
"origin": "*",
"methods": "POST, GET",
"headers": "x-test",
"credentials": true,
"maxAge": 300000
}
其中:
-
origin
表示响应头字段access-control-allow-origin
-
methods
表示响应头字段access-control-allow-methods
-
headers
表示响应头字段access-control-expose-headers
-
maxAge
表示响应头字段access-control-max-age
-
credentials
表示响应头字段access-control-allow-credentials
也可以采用行写法(详细参考JSON格式):
origin: * methods: POST, GET headers: x-test credentials: true maxAge: 300000
Note: :空格
分隔符为冒号+空格
修改或添加请求头,与 req.headers
的功能一致,优先级高于后者:
# 把操作内容放在本地文件(windows)
www.example.com reqHeaders://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com reqHeaders://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com reqHeaders:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com reqHeaders://{test.txt}
如何操作values系统,参考: 界面操作
test.txt可以有如下功能(后面会提供一系列协议,把这里面的一些常用功能拆出来,方便使用):
{
"content-type": "application/x-www-form-urlencoded; charset=utf8",
"name2": "value2",
"num": 1,
"bool": true
}
也可以采用行写法(详细参考JSON格式):
content-type: application/x-www-form-urlencoded; charset=utf8
name2: value2
num: 1
bool: true
Note: :空格
分隔符为冒号+空格
修改或添加响应头,与 res.headers
的功能一致,优先级高于后者:
# 把操作内容放在本地文件(windows)
www.example.com resHeaders://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com resHeaders://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com resHeaders:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com resHeaders://{test.txt}
如何操作values系统,参考: 界面操作
test.txt可以有如下功能(后面会提供一系列协议,把这里面的一些常用功能拆出来,方便使用):
{
"content-type": "text/html; charset=utf8",
"name2": "value2",
"num": 1,
"bool": true
}
也可以采用行写法(详细参考JSON格式):
content-type: text/html; charset=utf8
name2: value2
num: 1
bool: true
Note: :空格
分隔符为冒号+空格
往请求内容前面添加数据,与 req.prepend
功能一样,优先级高于后者。
# 把操作内容放在本地文件(windows)
www.example.com reqPrepend://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com reqPrepend://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com reqPrepend:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com reqPrepend://{test.txt}
如何操作values系统,参考: 界面操作
往响应内容前面添加数据,与 res.prepend
功能一样,优先级高于后者。
# 把操作内容放在本地文件(windows)
www.example.com resPrepend://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com resPrepend://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com resPrepend:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com resPrepend://{test.txt}
如何操作values系统,参考: 界面操作
替换请求内容,与 req.replace
功能一样,优先级高于后者。
# 把操作内容放在本地文件(windows)
www.example.com reqBody://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com reqBody://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com reqBody:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com reqBody://{test.txt}
如何操作values系统,参考: 界面操作
替换响应内容,与 res.replace
功能一样,优先级高于后者。
# 把操作内容放在本地文件(windows)
www.example.com resBody://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com resBody://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com resBody:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com resBody://{test.txt}
如何操作values系统,参考: 界面操作
往请求内容后面追加数据,与 req.append
功能一样,优先级高于后者。
# 把操作内容放在本地文件(windows)
www.example.com reqAppend://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com reqAppend://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com reqAppend:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com reqAppend://{test.txt}
如何操作values系统,参考: 界面操作
往响应内容后面追加数据,与 res.append
功能一样,优先级高于后者。
# 把操作内容放在本地文件(windows)
www.example.com resAppend://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com resAppend://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com resAppend:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com resAppend://{test.txt}
如何操作values系统,参考: 界面操作
利用正则或字符串来匹配替换请求文本内容请求的content-type必须为表单(application/x-www-form-urlencoded
)或其它文本类型:urlencoded、html、json、xml、text等);类似js字符串的replace方法
# 把操作内容放在本地文件(windows)
www.example.com reqReplace://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com reqReplace://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com reqReplace:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com reqReplace://{test.txt}
test.txt:
{
"/user=([^&])/ig": "user=$1$1",
"str": "replacement"
}
或
/user=([^&])/ig: user=$1$1
str: replacement
如何操作values系统,参考: 界面操作
利用正则或字符串来匹配替换响应文本内容(响应的content-type必须文本类型:html、json、xml、text等);类似js字符串的replace方法
# 把操作内容放在本地文件(windows)
www.example.com resReplace://D:/workspace/test.txt
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com resReplace://D:\workspace\test.txt
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com resReplace:///User/xxx/workspace/test.txt
# 把操作内容放在whistle的values系统
www.example.com resReplace://{test.txt}
test.txt:
{
"/user=([^&])/ig": "user=$1$1",
"str": "replacement"
}
或
/user=([^&])/ig: user=$1$1
str: replacement
例如给script外链加个随机数:
/<script(.*\s)src="([^"?]+)(?:\?*)([^"]*)"/ig: <script$1src="$2?t=1234567890&$3"
如何操作values系统,参考: 界面操作
Note: 如果要替换整个内容,请使用上面的reqBody、resBody;如果替换表单提交的字段,请使用上面的urlParams、params
将请求的内容(如果请求方法允许携带内容)写入的指定的文件夹或文件;如果是文件夹则whistle会根据请求的url和配置自动拼接成路径;如果指定或拼接所得的文件路径已经存在,则whistle不会覆盖已存在的文件
# 把请求的内容写入指定文件(确保原文件不存在,否则无法写入)(windows)
www.example.com/index.html reqWrite://D:/workspace/test.html
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com/index.html reqWrite://D:\workspace\test.html
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com/index.html reqWrite:///User/xxx/workspace/test.html
# 把请求的内容写入指定文件夹(windows)
www.example.com reqWrite://D:/workspace
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com reqWrite://D:\workspace
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com reqWrite:///User/xxx/workspace
例如把所有请求内容写到指定文件夹:
/^https?:\/\/(.+)/ reqWrite:///User/yourname/test-req/$1
# 在windows中如果用 `\` 作为路径分割符要注意下,由于 `\$1` 是一个转义,正则表达式不会替换,改成 `/$1`
/^https?:\/\/(.+)/ reqWrite://D:\test-req/$1
# 或
/^https?:\/\/(.+)/ reqWrite://D:/test-req/$1
将响应的内容(如果响应的状态码允许携带内容)写入的指定的文件夹或文件;如果是文件夹则whistle会根据请求的url和配置自动拼接成路径;如果指定或拼接所得的文件路径已经存在,则whistle不会覆盖已存在的文件
# 把响应的内容写入指定文件(确保原文件不存在,否则无法写入)(windows)
www.example.com/index.html reqWrite://D:/workspace/test.html
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com/index.html reqWrite://D:\workspace\test.html
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com/index.html reqWrite:///User/xxx/workspace/test.html
# 把响应的内容写入指定文件夹(windows)
www.example.com reqWrite://D:/workspace
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com reqWrite://D:\workspace
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com reqWrite:///User/xxx/workspace
例如把所有请求内容写到指定文件夹:
/^https?:\/\/(.+)/ resWrite:///User/yourname/test-res/$1
# 在windows中如果用 `\` 作为路径分割符要注意下,由于 `\$1` 是一个转义,正则表达式不会替换,改成 `/$1`
/^https?:\/\/(.+)/ resWrite://D:\test-res/$1
# 或
/^https?:\/\/(.+)/ resWrite://D:/test-res/$1
将请求的完整内容(包括请求方法、路径、协议、请求头、内容)写入的指定的文件夹或文件;如果是文件夹则whistle会根据请求的url和配置自动拼接成路径;如果指定或拼接所得的文件路径已经存在,则whistle不会覆盖已存在的文件
# 把请求的完整内容写入指定文件(确保原文件不存在,否则无法写入)(windows)
www.example.com/index.html reqWrite://D:/workspace/test.html
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com/index.html reqWrite://D:\workspace\test.html
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com/index.html reqWrite:///User/xxx/workspace/test.html
# 把请求的完整内容写入指定文件夹(windows)
www.example.com reqWrite://D:/workspace
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com reqWrite://D:\workspace
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com reqWrite:///User/xxx/workspace
例如把所有请求内容写到指定文件夹:
/^https?:\/\/(.+)/ resWrite:///User/yourname/test-req-raw/$1
# 在windows中如果用 `\` 作为路径分割符要注意下,由于 `\$1` 是一个转义,正则表达式不会替换,改成 `/$1`
/^https?:\/\/(.+)/ resWrite://D:\test-req-raw/$1
# 或
/^https?:\/\/(.+)/ resWrite://D:/test-req-raw/$1
将响应的完整内容(包括协议、状态码、状态信息、响应头、内容)写入的指定的文件夹或文件;如果是文件夹则whistle会根据请求的url和配置自动拼接成路径;如果指定或拼接所得的文件路径已经存在,则whistle不会覆盖已存在的文件
# 把响应的完整内容写入指定文件(确保原文件不存在,否则无法写入)(windows)
www.example.com/index.html reqWrite://D:/workspace/test.html
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com/index.html reqWrite://D:\workspace\test.html
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com/index.html reqWrite:///User/xxx/workspace/test.html
# 把响应的完整内容写入指定文件夹(windows)
www.example.com reqWrite://D:/workspace
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com reqWrite://D:\workspace
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com reqWrite:///User/xxx/workspace
例如把所有请求内容写到指定文件夹:
/^https?:\/\/(.+)/ resWriteRaw:///User/yourname/test-res-raw/$1
# 在windows中如果用 `\` 作为路径分割符要注意下,由于 `\$1` 是一个转义,正则表达式不会替换,改成 `/$1`
/^https?:\/\/(.+)/ resWriteRaw://D:\test-res-raw/$1
# 或
/^https?:\/\/(.+)/ resWriteRaw://D:/test-res-raw/$1
往content-type为html或css响应的内容后面追加数据(res.append
的追加是不区分类型),如果是html,则会自动加上 style
标签在追加到响应内容,如果是css,则会自动追加到文本后面。
# 把操作内容放在本地文件(windows)
www.example.com css://D:/workspace/test.css
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com css://D:\workspace\test.css
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com css:///User/xxx/workspace/test.css
# 把操作内容放在whistle的values系统
www.example.com css://{test.css}
如何操作values系统,参考: 界面操作
往content-type为html响应的内容后面追加数据(res.append
的追加是不区分类型)。
# 把操作内容放在本地文件(windows)
www.example.com html://D:/workspace/test.html
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com html://D:\workspace\test.html
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com html:///User/xxx/workspace/test.html
# 把操作内容放在whistle的values系统
www.example.com html://{test.html}
如何操作values系统,参考: 界面操作
往content-type为html或js响应的内容后面追加数据(res.append
的追加是不区分类型),如果是html,则会自动加上 script
标签再追加到响应内容后面,如果是js,则会自动追加到文本后面。
# 把操作内容放在本地文件(windows)
www.example.com js://D:/workspace/test.js
# 或(在windows路径分隔符可以用 `/` 及 `\`,两个是等价的)
www.example.com js://D:\workspace\test.js
# max 或 linux(注意协议与内容之计有三条斜杠)
www.example.com js:///User/xxx/workspace/test.js
# 把操作内容放在whistle的values系统
www.example.com js://{test.js}
如何操作values系统,参考: 界面操作