Sunny 网络中间件 v3.1.0 实战:5步实现HTTP/HTTPS/WS/WSS/TCP全协议拦截与修改
1. 环境准备与工具配置
在开始之前,我们需要确保开发环境已经正确配置。aardio作为一款轻量级的脚本语言,与Sunny网络中间件的结合能够为开发者提供强大的网络调试能力。
1.1 安装aardio开发环境
aardio的安装非常简单,只需从官网下载最新版本并安装即可。安装完成后,我们可以通过以下命令验证安装是否成功:
import console; console.log("aardio环境已就绪");1.2 获取Sunny网络中间件
Sunny网络中间件的最新版本可以从其官方GitHub仓库或官方网站获取。下载后,将相关库文件放置在aardio的lib目录下:
/lib/godking/sunny/1.3 基础依赖检查
确保系统中已安装必要的运行时库,特别是与网络通信相关的组件。可以通过以下代码检查基础依赖:
import sys; if sys.get("network") == null { console.log("需要安装网络组件"); } else { console.log("网络组件已就绪"); }2. Sunny核心功能解析
Sunny网络中间件提供了8项核心功能,理解这些功能是进行网络拦截和修改的基础。
2.1 协议支持矩阵
Sunny支持的协议及其特性如下表所示:
| 协议类型 | 数据拦截 | 数据修改 | 代理设置 | 连接重定向 |
|---|---|---|---|---|
| HTTP | ✔ | ✔ | ✔ | ✔ |
| HTTPS | ✔ | ✔ | ✔ | ✔ |
| WS | ✔ | ✔ | ✔ | ✔ |
| WSS | ✔ | ✔ | ✔ | ✔ |
| TCP | ✔ | ✔ | ✖ | ✔ |
2.2 关键API说明
Sunny的核心API主要包括以下几类:
- 数据获取与修改:
httpRequest,httpResponse,webSocket等 - 代理设置:
setProxy,setGlobalProxy - 连接控制:
redirect,blockConnection - 数据处理:
decodeGzip,encodeDeflate
3. 实战:构建网络调试工具
现在我们将通过5个步骤,构建一个功能完整的网络调试工具。
3.1 初始化Sunny实例
首先创建一个基本的Sunny实例并设置回调函数:
import godking.sunny; var sunny = godking.sunny(); // 设置HTTP回调 sunny.callback_http = function(winform, context, id, msgid, msgtype, mod, url, err, pid) { // 处理HTTP请求和响应 }; // 设置WebSocket回调 sunny.callback_websocket = function(winform, context, id, msgid, msgtype, mod, url, err, pid, wsDataType) { // 处理WebSocket消息 };3.2 配置代理端口
设置代理端口并启动服务:
if sunny.start(2021, // 代理端口 true, // 启用全局代理 , // 上游代理 , // 代理规则 , // 脚本 , // 强制TCP true, // 禁用压缩 winform) { console.log("代理服务启动成功"); } else { console.log("代理服务启动失败"); }3.3 实现请求拦截与修改
以下是一个修改HTTP请求头的示例:
sunny.callback_http = function(winform, context, id, msgid, msgtype, mod, url, err, pid) { if msgtype == godking.sunny.msgType.http_request { var request = godking.sunny.httpRequest(msgid); // 修改User-Agent request.setHeader("User-Agent", "MyCustomAgent/1.0"); // 重定向特定请求 if string.find(url, "example.com") { request.setUrl("http://redirect.target.com"); } } };3.4 处理WebSocket消息
WebSocket消息的拦截和修改示例:
sunny.callback_websocket = function(winform, context, id, msgid, msgtype, mod, url, err, pid, wsDataType) { if msgtype == godking.sunny.msgType.ws_send { var ws = godking.sunny.webSocket(msgid); var data = ws.getBodyText(); // 修改发送的数据 ws.setBody(data + "[modified]"); } };3.5 特殊配置:自身进程代理
要拦截自身进程的网络流量,需要进行特殊配置:
// 设置自身进程代理 sunny.setIeProxy(false); sunny.process.start(); sunny.process.addPid(process.getpid()); // 对于web.view组件 var wb = web.view(winform,, `--proxy-server="socks://127.0.0.1:2021"`);4. 高级应用场景
Sunny网络中间件在实际项目中有多种应用场景,下面介绍几个典型案例。
4.1 API测试与Mock
通过拦截和修改API响应,可以方便地进行接口测试:
sunny.callback_http = function(winform, context, id, msgid, msgtype, mod, url, err, pid) { if msgtype == godking.sunny.msgType.http_response { var response = godking.sunny.httpResponse(msgid); if string.find(url, "/api/user") { response.setBody(`{"id": 123, "name": "测试用户"}`); } } };4.2 爬虫调试
在爬虫开发中,Sunny可以帮助调试请求和响应:
// 记录所有请求 sunny.callback_http = function(winform, context, id, msgid, msgtype, mod, url, err, pid) { winform.log.addRow(msgtype, mod, url); };4.3 安全分析
分析应用中的网络通信是否存在安全隐患:
sunny.callback_http = function(winform, context, id, msgid, msgtype, mod, url, err, pid) { if msgtype == godking.sunny.msgType.http_request { var request = godking.sunny.httpRequest(msgid); var headers = request.getAllHeaders(); // 检查敏感信息 if string.find(headers, "Authorization") { console.log("发现认证信息:", headers); } } };5. 性能优化与最佳实践
为了确保网络调试工具的高效运行,需要注意以下几点。
5.1 回调函数优化
回调函数应尽可能高效,避免执行耗时操作:
// 不推荐的写法 sunny.callback_http = function(winform, context, id, msgid, msgtype, mod, url, err, pid) { // 避免在回调中执行复杂计算或IO操作 }; // 推荐的写法 sunny.callback_http = function(winform, context, id, msgid, msgtype, mod, url, err, pid) { // 只做必要的处理 if needProcess(url) { processRequest(msgid, msgtype); } };5.2 内存管理
及时释放不再使用的资源:
sunny.callback_http = function(winform, context, id, msgid, msgtype, mod, url, err, pid) { var request = godking.sunny.httpRequest(msgid); // 使用完毕后及时释放 request = null; };5.3 多线程注意事项
Sunny的回调函数在多线程环境中执行,需要注意线程安全:
// 使用线程安全的方式更新UI sunny.callback_http = function(winform, context, id, msgid, msgtype, mod, url, err, pid) { winform.invoke( function() { winform.log.addRow(msgtype, mod, url); } ); };