博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用whistle调试websocket和socket请求
阅读量:6367 次
发布时间:2019-06-23

本文共 4830 字,大约阅读时间需要 16 分钟。

v1.6.0 (Github地址:) 开始支持WebSocket和一般Socket的抓包、构造请求、以及修改发送或接收的数据。

请求抓包

打开whistle的Network,选中左侧请求列表中的WebSocket(Socket)请求,点击右侧的 Response -> Frames

WebSocket抓包:

WebSocket

Socket(TCP)请求,需要通连接whistle,再通过whistle转发,未避免whistle把普通Socket请求当成https或websocket请求,需要代理请求头添加个字段 x-whistle-policy: tunnel,下面以Node为例说明如何通过whistle转发Socket(TCP)请求(其它语言同理:先发一个http请求给whistle代理把请求信息带给whistle,whistle请求目标服务器成功后把连接返回):

模拟后台Socket Server代码:

const net = require('net');const server = net.createServer();server.on('connection', (client) => {  client.on('error', () => {});  client.on('data', (data) => {    client.write(`Response: ${data}`);  })});server.listen(9999);

客户端代码:

const http = require('http');const net = require('net');// whistle监听端口,根据实际情况设定const PROXY_PORT = 8899;// whistle所在服务器IPconst PROXY_HOST = '127.0.0.1';// 连接whistle代理const connect = (options) => {  options = {    method: 'CONNECT',    host: PROXY_HOST,    port: PROXY_PORT,    path: `${options.host}:${options.port}`,    agent: false,    headers: {      'x-whistle-policy': 'tunnel', // 必填,否则无法查看抓包数据    }  };  return new Promise((resolve, reject) => {    const client = http.request(options);    client.once('connect', (req, socket) => resolve(socket));    client.once('error', reject);    client.end();  });};const init = async () => {  const options = { host: '127.0.0.1', port: 9999 };  const socket = await connect(options);  let index = 0;  const send = () => {    ++index;    socket.write(`${index}. This is a JSON Object: {"test": "index=${index}"}`);  };  socket.on('data', (data) => {    setTimeout(send, 3000);  });  send();};init().catch(err => {  throw err;});

Socket

构造请求

在Network的右侧Composer可以构造各种请求,包括http、https、WebSocket、Socket请求,可以直接填写要请求的url、方法、请求头、请求内容等,也可以直接从左侧列表把对应的数据拖过来。

以WebSocket Demo网站为例(),建立如下连接,并发送数据(用Composer构造的WebSocket在Frames下面会出现一个Composer选项,用于向Server发送数据,也可以通过直接上传文件发送):

GET /echo HTTP/1.1WebSocket-Protocol: Sec-WebSocket-Protocol: Sec-WebSocket-Extensions: x-kaazing-idle-timeout,x-kaazing-ping-pong,x-kaazing-http-revalidate1

后面通过Frames里面的Composer发送什么数据后台就返回什么:

Build WebSocket

一般Socket请求只需把请求方法改为 CONNECT,或者用这些协议的url conn://connect://socket://、、tunnel://

Build Socket

修改数据

从上面的插图可以发现,如果请求不是通过whistle的Composer发送的,WebSocket和Socket请求都无法添加或修改接收及发送数据(Composer建立的连接可以发送数据到服务端),要修改WebSocket或Socket的发送或接收数据,需要借助whistle的插件,其原理是通过配置whistle规则把请求转发到whistle.script里面的WebSocket或Socket服务器,再通过whistle.script拦截或发送到指定后台。

安装:

npm i -g whistle.script# 或npm i -g whistle.script --registry=https://registry.npm.taobao.org

调试WebSocket请求,打开插件script的界面,新建名为handleWebSocket的script:

exports.handleWebSocket  = async (ws, connect) => {      // 将请求继续转发到目标后台,如果不加则直接响应    const res = await connect();      // 获取客户端的请求数据    ws.on('message', (data) => {      // 在script的Console打印出客户端发送的数据      console.log(`Client: ${data}`);       // 可以修改后再发送到Server       res.send(data);    });      res.on('message', (data) => {        // 在script的Console打印出服务端发送的数据        console.log(`Server: ${data}`);         // 可以修改后再发送到Server         ws.send(data);    });    // 接收通过whistle.script页面Console的dataSource.emit('toSocketClient', {name: 'toSocketClient'})的数据    ws.dataSource.on('toSocketClient', (data) => {      ws.send(data);    });   // 接收通过whistle.script页面Console的dataSource.emit('toSocketServer', {name: 'toSocketClient'})的数据      ws.dataSource.on('toSocketServer', (data) => {      res.send(data);    });};

在whistle上配置规则:

ws://demos.kaazing.com/echo script://handleWebSocket

打开,点击 Connect 按钮:

Handle WebSocket

调试Socket请求,同上操作在whistle.script插件上新建一个名为 handleSocket 的脚本:

exports.handleTunnel  = async (client, next) => {      // 将请求继续转发到目标后台,如果不加则直接响应     const res = await next();      // 获取客户端的请求数据    client.on('data', (data) => {      // 在script的Console打印出客户端发送的数据      console.log(`Client: ${data}`);       // 修改后再发送到Server       res.write(`Client>>>Server: ${data}+client`);    });      res.on('data', (data) => {        // 在script的Console打印出服务端发送的数据        console.log(`Server: ${data}`);         // 修改后再发送到Server         client.write(`Server>>>Client: ${data}`);    });    // 接收通过whistle.script页面Console的dataSource.emit('toSocketClient', {name: 'toSocketClient'})的数据    client.dataSource.on('toSocketClient', (data) => {      client.write(JSON.stringify(data));    });   // 接收通过whistle.script页面Console的dataSource.emit('toSocketServer', {name: 'toSocketClient'})的数据      client.dataSource.on('toSocketServer', (data) => {      res.write(JSON.stringify(data));    });};

在whistle上配置规则:

127.0.0.1:9999 script://handleSocket

启动文章刚开始的Socket连接的例子,打开whistle.script界面的Console,在里面分别执行下面两个语句:

dataSource.emit('toSocketClient', 'Mock Server');dataSource.emit('toSocketServer', 'Mock Client');

whistle.script会把对应的事件名称及参数值传给后台 ctx.dataSource 的对应监听方法。

Handle Socket

招聘信息

腾讯在线教育部前端团队急招大量优秀前端开发(Node、React、RN、Vue、weex等方面的人才,不管全栈还是只专注某个领域的都可以,了解职位信息),这边各方面(你懂的)在业界都是相当有竞争力,考虑大家年底换工作可能拿不到年终奖,老板说了入职后这边都会给相应的补偿,所以这点不需要太担心,有想换工作的或者追求更好发展平台把简历发我邮箱 avwu@qq.com,只要合适我们会立即安排面试。

相关文章

转载地址:http://zprma.baihongyu.com/

你可能感兴趣的文章
小程序 LRU 存储设计
查看>>
Android 多线程之阻塞队列
查看>>
Haskell 在 macOS 下的环境搭建
查看>>
适配mpvue平台的的微信小程序日历组件mpvue-calendar
查看>>
【Linux学习】 Redis常用的一些指令
查看>>
Spring Cloud 中使用Feign解决参数注解无法继承的问题
查看>>
数据迁移方案 + Elasticsearch在综合搜索列表实现
查看>>
干货 | 分分钟教你用Python创建一个区块链
查看>>
Angular开发实践(八): 使用ng-content进行组件内容投射
查看>>
canvas+websocket+vue做一个完整的你画我猜小游戏
查看>>
android复习清单
查看>>
工作代码备用
查看>>
spring cloud互联网分布式微服务云平台规划分析--spring cloud定时调度平台
查看>>
说说如何配置 Webpack
查看>>
小程序中使用箭头函数的问题
查看>>
走进 JDK 之 Long
查看>>
Android打地鼠游戏的修改和优化
查看>>
Java异常
查看>>
map、reduce、filter、for...of、for...in等总结
查看>>
html2canvas-实现页面截图
查看>>