aardio - 【库】sunny网络中间件

33 篇文章 17 订阅

本库封装心得:

1、aardio回调函数是被dll用线程启动的,所以在声明回调函数时,不能用 ..raw.tostdcall() ,而是要用 ..thread.tostdcall()。

2、因为线程安全的原因,回调函数不能访问主线程的成员,比如窗口组件。所以在定义回调函数时,给他指定一个owner(比如 winform 或 {form=winform} ),在回调函数中,就可以用 owner 或 owner.form 来访问主窗口对象 winform 了。

3、本库所用sunny.dll不支持内存加载。

4、进行函数功能分类(模块化),以方便调用。

一、SUNNY网络中间件是什么:

Sunny网络中间件 和 Fiddler 模块类似。是可跨平台的网络分析组件。可用于 HTTP / HTTPS / WS / WSS / TCP 网络分析,无内存泄漏,为二次开发量身制作。

Sunny项目主要用于易语言 (其他语言也可使用)目前免费且开源。应dio友需求,我将他封装为aardio库,供有此功能需求的dio友们下载使用。

Sunny官方网站:http://esunny.vip/

SDK功能:

1.支持 获取/修改 HTTP/HTTPS/WS/WSS/TCP 发送及返回数据

2.支持 HTTP/HTTPS/WS/WSS 设置全局代理(上游代理)

3.支持 对 HTTP/HTTPS/WS/WSS 指定连接使用指定代理

4.支持 对 HTTP/HTTPS/WS/WSS 链接重定向

5.支持 对 TCP链接进行IP重定向

6.支持 gzip, deflate, br 解码

7.支持 WS/WSS 主动发送数据

8.支持 TCP 主动发送数据

二、运行效果截图:

三、库文件下载:

解压后放到 /lib/godking/ 目录。

chengxu.online  → aardio资源下载 → sunny.rar

四、库结构:

 五:部分解释:

1、消息类型 msgType 分为三类,http_(含https)、ws_(含wss)、tcp_ 。

2、传输模式 mod 分为两类,http类(POST、GET、PUT等)、ws类(WS、WSS)。

3、一条request(或send)消息可能对应着与其相同id(不是msgid)的多条response(或received)消息,代表这些请求(发送)与响应(接收)是对应的因果关系。

4、在http_request消息里面,可以直接返回response数据。其实应该解释为“伪造”更容易理解,因为这时候还没有接收到response,却已经提前造好了response数据 ^-^。

5、sunny正常情况下不拦截自身进程数据,即使开启进程代理并使用process.addPID将自身pid添加进去也不行。但是可以通过使用sunny.start()指定代理端口,达到拦截自身进程数据的目的。只拦截自身进程不用开全局代理。用法如下:

        5.1、为实现拦截自身 web.view 数据,需要在web.view参数中使用代理。

                 端口号要与sunny.start() 中指定的代理端口号一致:

                 var wb = web.view(winform,,`--proxy-server="socks://127.0.0.1:2021"`);

        5.2、如果要拦截自身 inet.http 数据,设置代理方式如下:

                 inet.http(,"HTTP=HTTP://127.0.0.1:2021").get("http://www.baidu.com");
6、回调函数均为多线程函数,非主线程函数,对aardio来说,使用时要注意因线程安全所产生的各种“问题”。

六:调用示例:

import win.ui;
import godking.vlistEx
/*DSG{{*/
var winform = win.form(text="aardio form";right=929;bottom=609;topmost=1)
winform.add(
button={cls="button";text="开始HTTP拦截";left=380;top=540;right=537;bottom=593;db=1;dr=1;z=1};
button2={cls="button";text="停止";left=560;top=540;right=717;bottom=593;db=1;dr=1;z=2};
button3={cls="button";text="打开ws测试网站";left=200;top=540;right=357;bottom=593;db=1;dl=1;z=4};
button4={cls="button";text="打开wss测试网站";left=20;top=540;right=177;bottom=593;db=1;dl=1;z=8};
button5={cls="button";text="设置进程PID";left=820;top=540;right=910;bottom=580;z=10};
edit={cls="edit";left=740;top=540;right=810;bottom=580;edge=1;multiline=1;z=9};
rb1={cls="radiobutton";text="替换图片";left=90;top=500;right=243;bottom=528;checked=1;db=1;dl=1;font=LOGFONT(h=-16);z=5};
rb2={cls="radiobutton";text="阻止图片";left=270;top=500;right=423;bottom=528;db=1;dl=1;dr=1;font=LOGFONT(h=-16);z=6};
rb3={cls="radiobutton";text="图片放行";left=440;top=500;right=593;bottom=528;db=1;dr=1;font=LOGFONT(h=-16);z=7};
vlist={cls="win.ui.ctrl.vlistEx";text="自定义控件";left=10;top=8;right=920;bottom=490;db=1;dl=1;dr=1;dt=1;z=3}
)
/*}}*/

winform.vlist.setColumns({"序号","协议类型","消息类型","传输模式","url"},{40,70,120,70,-1});
 
import godking.sunny;
var sunny=godking.sunny();
sunny.callback_http = function(winform,context,id,msgid,msgtype,mod,url,err,pid){
	// 注意:1、回调函数为线程函数;2、要重新引用godking.sunny
	import godking.sunny
	// 将部分内容写入窗口虚表中
	winform.vlist.addRow("[@rowindex]","http/s",godking.sunny.msgType.getName_http(msgtype),mod,url)
	winform.vlist.ensureVisible(winform.vlist.count)
	// 将图片请求进行替换
	if msgtype==godking.sunny.msgType.http_request and !winform.rb3.checked {
		var request = godking.sunny.httpRequest(msgid);
		var t = request.getHeader("Content-Type")
		import string
        if ..string.find(url,"@@.jpg") or ..string.find(url,"@@.jpeg") or ..string.find(url,"@@.png"){
            if winform.rb1.checked request.setUrl("http://chengxu.online/images/banner.gif");
            if winform.rb2.checked request.setUrl("");
        }
	}
	// 过滤掉图片的正文消息
	if msgtype==godking.sunny.msgType.http_response and notice {
		var request = godking.sunny.httpResponse(msgid);
		var t = request.getHeader("Content-Type")
		if #t{
			import string
        	if ..string.find(t,"@image/"){
				return true; 
        	}
        }
	}
}
 
sunny.callback_websocket = function(winform,context,id,msgid,msgtype,mod,url,err,pid,wsDataType){
	// 注意:1、回调函数为线程函数;2、要重新引用godking.sunny
	import godking.sunny
	// 将部分内容写入窗口虚表中
	winform.vlist.addRow("[@rowindex]","websocket",godking.sunny.msgType.getName_ws(msgtype),mod,url)
	winform.vlist.ensureVisible(winform.vlist.count)
	// 拦截发送数据
	if msgtype==godking.sunny.msgType.ws_send {
		var ws = godking.sunny.webSocket(msgid);
		var t = ws.getBodyText();
		winform.vlist.addRow("[@rowindex]","websocket","发送数据",mod,t)
		winform.vlist.ensureVisible(winform.vlist.count)
		t = t++"(已修改)"
		ws.setBody(t)
   	}
   	// 拦截接收数据
	if msgtype==godking.sunny.msgType.ws_received {
 		var ws = godking.sunny.webSocket(msgid);
		var t = ws.getBodyText();
		winform.vlist.addRow("[@rowindex]","websocket","接收数据",mod,t)
		winform.vlist.ensureVisible(winform.vlist.count)
  	}
}	
 
winform.button.oncommand = function(id,event){
	if sunny.start(2021/*代理端口*/,true/*开启全局IE代理*/,/*上游代理*/,/*上游代理规则*/,/*脚本*/,/*强制TCP*/,true/*禁止压缩*/,winform){
		..win.msgbox("已开启!",,,winform.hwnd);
	} else {
		..win.msgbox("开启失败!",,,winform.hwnd);
	}
}
 
winform.button2.oncommand = function(id,event){
	sunny.stop();
	..win.msgbox("已停止!",,,winform.hwnd);
}
 
winform.button3.oncommand = function(id,event){
	import process
	process.execute("http://coolaf.com/tool/chattest")
}
 
winform.button4.oncommand = function(id,event){
	import process
	process.execute("https://www.idcd.com/tool/socket")	
}
 
winform.button5.oncommand = function(id,event){
	if winform.edit.text!=="" {
		sunny.setIeProxy(false);
		var pid = tonumber(winform.edit.text);
		sunny.process.start()
		sunny.process.addPid(pid)
		..win.msgbox("已加入!",,,winform.hwnd);
	}
}
 
winform.show();
win.loopMessage();

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Sunny-Ngrok是一个将本地web应用程序公开到公共互联网上的工具。使用过程中可能会遇到一些常见错误,以下是一些常见的错误及其解决方法: 1. "Permission Denied"(权限被拒绝)错误 这种错误通常是由于没有足够的权限运行sunny-ngrok,或者没有正确地设置权限。在Linux系统上,您可能需要使用sudo来运行sunny-ngrok,或者将sunny-ngrok添加到PATH变量中。在Windows系统上,您可能需要右键单击sunny-ngrok并以管理员身份运行。 2. "Connection Refused"(连接被拒绝)错误 这种错误通常是由于您的本地web服务器没有正确地配置或运行。您应该检查您的本地web服务器的日志文件,以查看是否有任何错误消息。您也可以尝试使用不同的端口号来启动本地web服务器。 3. "Invalid Subdomain"(无效子域名)错误 这种错误通常是由于您选择的子域名已经被其他人使用了。您应该选择一个独特的子域名来避免此问题。 4. "Failed to Establish Connection"(无法建立连接)错误 这种错误通常是由于网络问题或sunny-ngrok服务器不可用。您可以尝试重新启动sunny-ngrok,并确保您的网络连接正常。 5. "Invalid Authtoken"(无效的Authtoken)错误 这种错误通常是由于您的Authtoken无效或已过期。您可以在sunny-ngrok的网站上重新生成一个新的Authtoken,并将其输入到sunny-ngrok中。 6. "Invalid Hostname"(无效主机名)错误 这种错误通常是由于您输入了错误的主机名。您应该确保您输入的主机名是正确的,并包含正确的域名后缀。 希望这些解决方案可以帮助您解决sunny-ngrok中的常见错误。 ### 回答2: Sunny-Ngrok是一个非常有用的工具,用于将本地主机暴露到公网上,方便其他人访问。然而,在使用Sunny-Ngrok的过程中,可能会遇到以下几种常见错误: 1. 连接错误:有时候在启动Sunny-Ngrok时,可能会出现无法连接的错误。这通常是因为网络连接有问题,或者是由于防火墙或路由器配置的限制导致的。解决这个问题的方法是检查网络连接是否正常,并确保没有任何防火墙或路由器配置导致的限制。 2. 认证错误:在使用Sunny-Ngrok时,用户需要提供正确的认证令牌。如果提供的认证令牌不正确,可能会遇到认证错误。解决这个问题的方法是检查认证令牌是否正确,并确保没有任何拼写错误或其他错误。 3. 端口冲突:Sunny-Ngrok使用指定的端口将本地主机暴露到公网上。如果指定的端口已经被其他进程占用,可能会出现端口冲突的错误。解决这个问题的方法是更换一个未被占用的端口,或者关闭占用该端口的其他进程。 4. 速度缓慢:有时候在使用Sunny-Ngrok时,可能会遇到速度缓慢的问题。这通常是由于网络连接不稳定或带宽限制导致的。解决这个问题的方法是检查网络连接是否稳定,并确保带宽没有被其他大量占用的任务所限制。 总而言之,尽管Sunny-Ngrok是一个很有用的工具,但在使用过程中仍然可能会遇到一些常见的错误。通过仔细检查网络连接、认证令牌、端口和带宽等因素,可以解决这些问题,并确保Sunny-Ngrok正常运行。 ### 回答3: Sunny-Ngrok是一款提供内网穿透服务的工具,常见的错误包括: 1. 连接错误:当使用Sunny-Ngrok进行内网穿透时,有可能出现无法连接的错误。这可能是由于网络设置的问题,或者是由于Ngrok服务器的负载过高导致的连接失败。解决这个问题可以尝试更改网络设置或者尝试连接其他Ngrok服务器。 2. 认证错误:在使用Sunny-Ngrok时,有时会出现认证错误的问题。这通常是由于Ngrok令牌(token)无效或过期导致的。解决这个问题可以尝试重新生成Ngrok令牌,并更新到Sunny-Ngrok的配置文件中。 3. 服务端错误:有时候Sunny-Ngrok的服务端会出现错误,导致无法正常工作。这可能是由于服务器负载过高、网络不稳定或者其他原因引起的。解决这个问题可以尝试重启Sunny-Ngrok服务端,或者联系Sunny-Ngrok的技术支持寻求帮助。 4. 版本兼容性问题:使用较老版本的Sunny-Ngrok时,有可能会遇到与当前操作系统或其他软件版本不兼容的问题。解决这个问题可以尝试升级Sunny-Ngrok到最新版本,或者查找与当前环境兼容的旧版本。 总结来说,Sunny-Ngrok的常见错误主要包括连接错误、认证错误、服务端错误和版本兼容性问题。解决这些错误通常需要检查网络设置、更新Ngrok令牌、重启服务端或者升级软件版本。如遇到问题可以参考相关文档或者联系技术支持获取帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卢光庆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值