在开发测试WebSocket过程中,经常需要模拟WebSocket的一些行为,如:延迟、忽略、修改或构造发送到服务器或客户端的数据包,以及主动断开WebSocket连接等,本文将讲下如何用抓包调试工具whistle实现上述操作。
准备工作
如果你还不知道whistle是什么,可以访问whistle的Github了解及安装:https://github.com/avwo/whistle。
如果你已经安装过whistle,需要升级到最新版本(w2 -V
>= v1.11.1
),具体参见:whistle帮助文档。
基本功能
安装配置启动好最新版本whistle后,在whistle的抓包界面Network上点击要操作的WebSocket请求,可以在右侧 Frames
看到如下界面:
Replay
重发选中的WebSocket数据包。
Composer
构造数据包,支持手动输入数据包文本,并通过按钮 Send to client
或 Send to server
把数据分别发送到客户端(浏览器)或服务器,也支持通过上传本地文件的方式发送(接收)数据。
Frames上方的
Composer
按钮用于把选择的数据包填充到下方Composer的文本框
Send
用于暂停或忽略发送到服务端的数据包,包含3种状态:
- Send:默认状态,表示对请求不做额外操作
- Pause:暂停发送数据,所有后续发送的数据会被阻塞住
- Ignore:忽略发送数据,所有后续发送的数据会被忽略
Receive
用于暂停或忽略发送到客户端的数据包,包含3种状态:
- Send:默认状态,表示对请求不做额外操作
- Pause:暂停接收数据,所有后续接收的数据会被阻塞住
- Ignore:忽略接收数据,所有后续接收的数据会被忽略
如果需要在建立连接的时候就设置Pause或Ignore状态,可以通过
pattern enable://ignoreSend|ignoreReceive|pauseSend|pauseReceive
设置所需的状态,如:ws://echo.websocket.org enable://ignoreSend|pauseReceive
Abort
断开连接。
例子
延迟发送
通过在 Send
或 Receive
按钮里面选择 Pause
状态,这时发送到服务器或客户端的数据包会把阻塞住,等待时间到后,再切换到 Send
或 Receive
状态。
断点调试
通过 Ignore
-> Pause
-> Replay
-> Send
(Receive
) 状态的切换实现对指定数据包进行修改。
Replay
这步操作一般不需要用到,主要是用来解决忽略数据包时把其它不该忽略的数据包也忽略掉的问题
最好用,没有之一
@udbmnm 多谢支持
数据加密,校验,你是改了,也没有用
来自酷炫的 CNodeMD
这个不错
@4176244 如果业务自己对数据包做了加密,那当然不能用上述的方式,除非你拿到密钥并用whistle插件自己实现加解密,但很少遇到有业务直接对WebSocket数据包加密,一般是采用https协议对请求做加密处理。
感谢分享
@4176244 whistle的插件是针对特殊业务场景扩展功能的,不是用在生产环境加密数据;你这种场景上https比自己实现加解密来的简单靠谱。
@avwo 你搞错了。我说的是针对websocket,这个和https是没有关系的吧。实际上生产环境中,要想修改数据,几乎是不太可能的。当然,刚入行的新手会犯这样的错误。
@4176244 哪个网站对WebSocket数据包做了加密,举一个我看下他们怎么处理的?
@4176244 莫非你的aes比https和wss还牛逼?
不管了 先收藏了。。
@avwo 我按照 GitHub安装了whistle 但是为什么一直在请求一个api.infura.io的域名的数据,我后台都关了所有应用
@Faithree 这个应该是你浏览器里其它页面发出的请求,把浏览器的其它页面都关掉看看
@avwo 还有个问题,我设置了系统代理,但是小程序发出的请求在network面板好像看不到,但是浏览器和postman的请求可以看得到,这是为什么?
@avwo 我要提需求,不用proxifier 也能看到小程序的请求。嘿嘿嘿
@Faithree 微信开发者工具菜单栏–》设置–》代理设置:
@mu-yu 这就说明了你对OSI每层的不了解了。 OSI 7层,你可以根据需要选择加密方式 https是基于哪一层的加密? 我用aes加密是数据层,在TCP上面的那一层。和你采用http也好,https也好,都无关。必须双方有钥匙才行。
@avwo 我自己的系统就是。你要是需要,我可以发加密后的字段给你,没有私钥,128位加密。
@avwo 没必要非要抱着https不妨。所谓靠谱这个事情仁者见仁智者见智。关于加密的方式太多了,合适就好。
@mu-yu aes不是我的,aes算法早就有了。
用状态2,二进制传输
来自拉风的 Taro-cnode