资讯专栏INFORMATION COLUMN

whistle - 跨平台(Win/Mac/Linux)的 Fiddler

Keagan / 3730人阅读

摘要:想了解调试代理工具的原理可以看这篇文章代理原理及实现。说点什么如果什么问题或建议可以给我提或加群也欢迎大家直接如果觉得好用且对大家有帮助,帮忙分享给你所在的团队及别忘了给加个

web调试代理工具是web开发人员必备的工具,它在发起web请求的客户端与服务器之间充当中间人角色,可以用于查看、修改或替换HTTP、HTTPS、Websocket请求(响应)数据,协助我们做本地开发调试、构造数据、定位问题等等,业界已有一些比较优秀的web调试代理工具,特别是Windows上的Fiddler,由于其出色的功能设计,俨然成为了web调试代理工具的代名词。但Fiddler只能在Windows系统上使用,当我们换上Mac或者开发环境限制必须使用Linux时,我们很难在这些平台上找到类似Fiddler的工具,这个时候可能被提起最多的是Charles,Charles是用Java实现的跨平台web调试代理工具,理论上可以在安装java虚拟机的桌面系统上使用,用过Fiddler的人普遍觉得Charles难用,不管是性能、体验、界面都无法跟Fiddler相提并论(事实上Fiddler本身也是很耗内存),更重要的是Charles不是免费的,价格也不菲,这也可能是因为在Mac、Linux平台上可以选择的web调试代理工具也不多,下面我要给大家详细介绍的是本文的主角,开源免费且持续在维护的whistle--全新的跨平台web调试代理工具。

Note: 想了解调试代理工具的原理可以看这篇文章:HTTP 代理原理及实现。

whistle

Github: https://github.com/avwo/whistle

whistle是用NodeJS实现的跨平台web调试代理工具,可以安装部署在装有NodeJS的操作系统上(包括Windows、Mac、Linux等桌面或命令行系统),并可以通过Chrome浏览器访问本地或远程whistle的管理配置界面:

查看、修改或替换HTTP、HTTPS、Websocket请求(响应)数据(包括url,host,方法,状态码,头部及内容等)

设置延迟请求(响应)

限制请求(响应)速度

在Composer里面构造请求

可以把请求代理到其它服务器(支持socks和http代理)

查看请求列表的Timeline

查看页面JS脚本执行过程中抛出的异常(可以用在调试终端页面或远程调试)

查看JS中的console[info, log, warn, error, fatal](这些方法在IE也可以使用)打印出来的数据对象(可以用在调试终端页面或远程调试)

利用whistle集成的weinre查看或修改页面的DOM结构(可以用在调试终端页面或远程调试)

使用通过插件的形式扩展的功能(插件可以用来扩展whistle的功能,特别是集成本地开发环境,方便开发人员使用),如:处理combo请求

whistle借鉴了Fiddler的一些优秀的设计,比如请求列表及其详细内容的展示(即Network),但whistle不是Fiddler的复制品,除了请求列表的展示外,whistle在操作请求及功能扩展上有着自己独特的方式,让修改请求(响应)操作变得更简单,并集成了终端(远程)调试工具。

Note:为了让大家能对下面内容更好的理解及快速上手whistle,请先按步骤安装好whistle:安装node、安装whistle、配置代理、启动whistle

规则原理

Fiddler修改请求(响应)的数据时,需要对每个请求设置断点后-->手动修改-->手动放开请求,如果是同时修改多个请求或者多次修改某个请求时,体验不是很好;而whistle把对请求(响应)的操作分类,每一类对应一种协议(如:替换本地文件 file://),每个具体操作要用到的参数值放到协议后(如:file:///User/xxx/test.html中的/User/xxx/test.html),这样whistle把每个操作抽象成一个uri

问题来了,如果参数值有空格或需要多个参数(比如修改头部的一些字段),这个whistle是怎么处理的?

上述问题包含两个问题:

如何参数值有空格的问题?
在单参数情形下,如果是文件路径或者是下面第二个问题要提到的请求参数类型(如:file://filepathresAppend://filepathreqHeaders://test=a%20b&referer=test等),可以用%20来代替,其它情形,可以用{key}的形式把参数值存到whistle的Values系统,如:ua://{chrome-ua},whistle会自动到Values里面找chrome-ua对应的值。

如何处理多个参数的情形?
为方便用户使用,whistle尽可能把一些常用的操作精简到只有一个参数的情形(如请求头部字段,可以用协议req这种多参数的形式来新增或修改,对里面常用的字段,如refererua等也可以用独立的协议(refererua)来设置),但不可能把把所有操作都抽象成单个参数的情形。对于多参数情形,有如下3种方式:

直接用请求参数的方式转成单参数的情形: reqHeaders://test=a%20b&referer=test,如果里面有空格要用%20替换

按问题1的方式,用key代替,把value写到whistle的Values里面(reqHeaders://{test-reqHeaders}),而Values里面reqHeaders的值也可以有两种方式具体参考:JSON格式

直接把值写到本地文件(reqHeaders:///User/xxxx/test.json),文件/User/xxxx/test.json里面reqHeaders的值也可以有两种方式具体参考:JSON格式

上面解决了把每个对web请求的操作用一个uri来表示的问题, 现在我们把对web请求的操作都可以抽象成一个operator-uri,如何用这些operator-uri来操作具体请求呢?

处理这个问题,whistle扩展了传统hosts配置方式,采用匹配请求url到operator-uri的映射:

pattern  operator-uri

pattern可以以下三种方式:

域名匹配:www.example.com operator-uri

路径匹配:www.example.com/... operator-uri

正则匹配:/example/ operator-uri

为了兼容hosts的配置方式:

# 单个匹配
127.0.0.1 www.example.com

# 多个匹配
127.0.0.1 www.example1.com www.example2.com www.exampleN.com

whistle默认匹配顺序是从上到下,从左到右,多个匹配也可以写成

# 多个匹配
pattern operator-uri1 operator-uri2 operator-uriN

如果whistle可以判断operator-uri不可能为web请求的url,即不是如下uri形式:

# operator-uri协议为http, https, ws, wss之一
pattern http://xxxx

# operator-uri不包含协议,又不是ip
pattern xxxxx

或者pattern为正则表达式,满足这两种情况下,patternoperator-uri的顺序是可以调换的:

# 单个匹配
operator-uri pattern
# 多个匹配的情况
operator-uri pattern1 pattern2 patternN

上面讲了Rules的一些配置规则原理及Values的用途,包括:operator-uri设计原理,规则的匹配顺序(从上到下,从左到右),匹配方式,什么情况下可以对调等等。

一些例子

下面举一些例子,让大家快速上手whistle(规则中用#作为注释符号,如果要查看或修改HTTPS、Websocket的请求(响应)数据,要开启HTTPS拦截功能:启用HTTPS):

host
host的配置方式不仅完全兼容系统自带的配置方式,而且支持路径、正则匹配:

# 传统的配置方式
# 单个匹配
127.0.0.1 www.ifeng.com
# 多个匹配
127.0.0.1 www.ifeng.com www.qq.com
    
# 路径(顺序可以调换)
# 单个匹配
127.0.0.1 http://www.ifeng.com/xxx
# 多个匹配
127.0.0.1 http://www.ifeng.com www.qq.com/xxx
    
    
#正则(顺序可以调换)
# 单个匹配
127.0.0.1 /ifeng/
# 多个匹配
127.0.0.1 /ifeng/ /qq/
    
    
# whistle也支持如下方式,在ip前面加个协议(顺序可以调换)
# 单个匹配
host://127.0.0.1 www.ifeng.com
# 多个匹配
host://127.0.0.1 www.ifeng.com www.qq.com

端口映射(下面举得例子都是用域名匹配的方式,其它方式同理)

# 本地调试
www.example.com 127.0.0.1:8080
    
# 映射到线上
www.example.com www.qq.com
www.example.com:8080  www.qq.com

本地替换

# 下面用`|`来分隔目录或文件,从左到右依次找到存在的文件为止
www.example.com file:///User/xxx/test|/User/xxx/test/index.html

上述配置,如果我们访问http://www.example.com/,则whistle会先找是否有/User/xxx/test这个文件,如果没有就会匹配/User/xxx/test/index.html;如果我们访问http://www.example.com/test.html,则whistle会先在找文件/User/xxx/test/test.html,再找/User/xxx/test/index.html/test.html,如果没就返回404

这里只是举了几个小例子,whistle还有非常多的功能,如:reqHeadersresHeaderslogdisablefilterweinre等等,而且还支持插件扩展,更多功能请参考:Wiki,功能列表

后续规划

whistle是我业余时间在维护且会长期维护的项目,一般来说新版本(如果有)的发布放在周日晚上(修复影响功能的bug的版本不受时间限制,有新版本发布界面中的About菜单现会有红点提醒或者大版本发布则是直接弹框提醒,大家按提示更新就可以),下面是一些后面的规划内容:

插件whistle.websocket开发:用于查看websocket的请求内容

插件whistle.img开发:用于查看抓包到的图片内容

插件whistle.settings开发:用于一键安装系统代理及安装根证书(如果根证书不能一键安装,至少要做到点击能弹出根证书的安装对话框),也为后面的客户端版本做准备

whistle的客户端开发:有打算把一些自动化测试的功能集成进来,设想的交互功能也会比Node强很多,因为可以直接操作本地文件

官网http://wproxy.org及文档建设:打算用Gitbook把文档重新整理,然后再i18n下及官网陆续建立起来

上面面规划的功能都只是在业余时间做,所以不能给出确切的完成时间,前面两个插件会尽快开发出来,想关注进度可以 Follow me:https://github.com/avwo。

PS:为什么不把websocket、img、settings这几个插件功能集成到whistle里面,而要以插件的形式多带带存在?主要是考虑到这几部分功能用到的时候相对比较少,及减少安装whistle过程中出现错误及运行过程中的内存问题,像处理websocket用到的中间件体积比较大且需要本地编译,img功能有比较耗内存和硬盘,而且把这部分功能放在独立的页面可能体验更好,综上考虑没有把这部分功能集成到whistle里面,但后续的客户端版本会直接集成进来。

说点什么

如果什么问题或建议可以给我提issue或加QQ群462558941

也欢迎大家直接PR

如果觉得whistle好用且对大家有帮助,帮忙分享给你所在的团队及别忘了给whistle加个Star

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/9366.html

相关文章

  • whistle--平台网络抓包调试工具

    摘要:跨平台网络抓包调试工具简介是一款跨平台的网络抓包调试工具,基于开发。支持抓包,重放,替换,修改等方式来调试请求,也可以作为普通的代理。 whistle--跨平台网络抓包调试工具 showImg(https://segmentfault.com/img/remote/1460000014891585?w=160&h=160); [TOC] 简介 whistle是一款跨平台的网络抓包调试工...

    CrazyCodes 评论0 收藏0
  • 99%程序都没有考虑网络异常

    摘要:本文由云社区发表绝大多数程序只考虑了接口正常工作的场景,而用户在使用我们的产品时遇到的各类异常,全都丢在看似的中。在面板,还可以对请求进行暂停延迟等网络异常的模拟。小程序实现最后,留一道思考题。 本文由云+社区发表 绝大多数程序只考虑了接口正常工作的场景,而用户在使用我们的产品时遇到的各类异常,全都丢在看似 ok 的 try catch 中。如果没有做好异常的兼容和兜底处理,会极大的影...

    HollisChuang 评论0 收藏0
  • whistle真机调试

    摘要:所有域名下的请求,都会根据响应类型,将处理好的文本注入到响应内容里面,如是请求,和会分别自动加上和标签后追加到内容后面。查看请求响应的详细信息及请求列表的,还有请求匹配到的规则用来重发请求构造请求,可以自定义请求的请求方法请求头请求内容。 系列文章 真机联调常用方式和强大的Fiddlerwhistle真机调试 前言 之前发表过一篇文件关于真机调试的几种方式,但是都各自有些不便的地方,最...

    Taonce 评论0 收藏0
  • whislte抓包

    摘要:作用显示设备访问信息,设备可以访问抓包机器本地的项目一般在设备自带浏览器中访问本地项目对调试界面有好处安装全局安装记得查看命令启动项目查看常用启动项目后根据给的地址在网页打开界面通常为了防止避免设备默认访问自身,一般给抓包机器设置代理域名 作用:GUI显示设备访问信息,设备可以访问抓包机器本地的项目tips:一般在设备自带浏览器中访问本地项目对调试界面有好处 1.安装:sudo npm...

    raledong 评论0 收藏0
  • windows/mac系统下常用SSH工具软件收集整理

    摘要:工欲善其事,必先利其器,买了一款之后,就要选用一款好用的工具远程连接登录你的服务器了。鉴于目前已经是年了,系统自带的终端也是可以连接的工欲善其事,必先利其器,买了一款VPS之后,就要选用一款好用的SSH工具远程连接登录你的服务器了。当然SSH工具有很多,你可以选用自己觉得的顺手的,虽然FinalShell和MobaXterm也非常好用,但是感觉JAVA写的东西,启动总是慢半拍。 此外,...

    ZweiZhao 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<