实现原理
whistle的插件是一个独立运行的进程,这样是为了确保插件不会影响到whistle主进程的稳定性,并通过暴露一些http server的方式实现与whistle的交互,whistle会在特定阶段请求特定的server,具体看下面的原理图:
图一:表示http(s)、WebSocket请求涉及到的插件内置server
图二:表示tunnel请求涉及到的插件内置server,tunnel请求如上图指没有开启https捕获,或代理到whistle的Socket请求
从上面几个图可以知,whistle插件会设计以下7种server:
- statsServer:统计请求信息的服务
- resStatsServer:统计响应信息的服务
- rulesServer:设置请求规则的服务(支持http/https/websocket请求)
- resRulesServer:设置响应规则的服务(支持http/https/websocket请求)
- tunnelRulesServer:设置tunnel请求规则的服务
- server:whistle会把指定请求转发到该server
- uiServer: whistle插件的界面,可以通过特定的url访问
插件就是通过上述中的0-N个server实现相应的功能,并通过配置规则将请求转发到插件的各个server:
pattern whistle.your-plugin-name://xxx
# 或
pattern your-plugin-name://xxx
只要匹配pattern的请求才会转到插件的各个server,上述两种配置的区别是:
pattern whistle.your-plugin-name://xxx
:请求默认不会走到插件里面的server
服务
可以通过在
rulesServer
里面重新设置pattern your-plugin-name://xxx
把请求转发到server
里面
pattern your-plugin-name://xxx
:默认会经历所有server
除了用户手动配置,插件也可以自动规则,只需在插件模块的根目录新建一个 rules.txt
文件,里面可以设置所有whistle规则,包括当前插件的添加的新协议,这个文件的规则是公共的,相当于在:
# rules.txt
www.test.com/cgi-bin whistle.your-plugin-name://xxx
如果规则是跟具体请求无关,也可以在 rules.txt
里面设置定时从插件、或远程、或本地更新规则:
@whistle.your-plugin-name/cgi-bin/xxx
这样whistle会定时请求插件 whistle.your-plugin-name
uiServer里面的 /cgi-bin/xxx
的接口。
上述配置表示所有 www.test.com/cgi-bin
路径下的请求都会转到插件来。
除了 rules.txt
外,根目录还可以建插件私有规则:
_rules.txt
:whistle规则,相当于rulesServer
返回的规则_values.txt
:json对象,相当于rulesServer
返回的Values
也可以在rules里面设置Values:操作值
为了方便各个server直接的通讯及初始化插件配置,可以在插件根目录创建一个 initial.js
的文件,插件首先加载该文件,另外还可以通过插件直接获取抓包数据等,具体插件API及如何开发插件参见:插件开发Demo
学员评价