当前位置:   article > 正文

aardio - 【库】sunny网络中间件_sunny.dll

sunny.dll

本库封装心得:

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来说,使用时要注意因线程安全所产生的各种“问题”。

六:调用示例:

  1. import win.ui;
  2. import godking.vlistEx
  3. /*DSG{{*/
  4. var winform = win.form(text="aardio form";right=929;bottom=609;topmost=1)
  5. winform.add(
  6. button={cls="button";text="开始HTTP拦截";left=380;top=540;right=537;bottom=593;db=1;dr=1;z=1};
  7. button2={cls="button";text="停止";left=560;top=540;right=717;bottom=593;db=1;dr=1;z=2};
  8. button3={cls="button";text="打开ws测试网站";left=200;top=540;right=357;bottom=593;db=1;dl=1;z=4};
  9. button4={cls="button";text="打开wss测试网站";left=20;top=540;right=177;bottom=593;db=1;dl=1;z=8};
  10. button5={cls="button";text="设置进程PID";left=820;top=540;right=910;bottom=580;z=10};
  11. edit={cls="edit";left=740;top=540;right=810;bottom=580;edge=1;multiline=1;z=9};
  12. rb1={cls="radiobutton";text="替换图片";left=90;top=500;right=243;bottom=528;checked=1;db=1;dl=1;font=LOGFONT(h=-16);z=5};
  13. rb2={cls="radiobutton";text="阻止图片";left=270;top=500;right=423;bottom=528;db=1;dl=1;dr=1;font=LOGFONT(h=-16);z=6};
  14. rb3={cls="radiobutton";text="图片放行";left=440;top=500;right=593;bottom=528;db=1;dr=1;font=LOGFONT(h=-16);z=7};
  15. 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}
  16. )
  17. /*}}*/
  18. winform.vlist.setColumns({"序号","协议类型","消息类型","传输模式","url"},{40,70,120,70,-1});
  19. import godking.sunny;
  20. var sunny=godking.sunny();
  21. sunny.callback_http = function(winform,context,id,msgid,msgtype,mod,url,err,pid){
  22. // 注意:1、回调函数为线程函数;2、要重新引用godking.sunny
  23. import godking.sunny
  24. // 将部分内容写入窗口虚表中
  25. winform.vlist.addRow("[@rowindex]","http/s",godking.sunny.msgType.getName_http(msgtype),mod,url)
  26. winform.vlist.ensureVisible(winform.vlist.count)
  27. // 将图片请求进行替换
  28. if msgtype==godking.sunny.msgType.http_request and !winform.rb3.checked {
  29. var request = godking.sunny.httpRequest(msgid);
  30. var t = request.getHeader("Content-Type")
  31. import string
  32. if ..string.find(url,"@@.jpg") or ..string.find(url,"@@.jpeg") or ..string.find(url,"@@.png"){
  33. if winform.rb1.checked request.setUrl("http://chengxu.online/images/banner.gif");
  34. if winform.rb2.checked request.setUrl("");
  35. }
  36. }
  37. // 过滤掉图片的正文消息
  38. if msgtype==godking.sunny.msgType.http_response and notice {
  39. var request = godking.sunny.httpResponse(msgid);
  40. var t = request.getHeader("Content-Type")
  41. if #t{
  42. import string
  43. if ..string.find(t,"@image/"){
  44. return true;
  45. }
  46. }
  47. }
  48. }
  49. sunny.callback_websocket = function(winform,context,id,msgid,msgtype,mod,url,err,pid,wsDataType){
  50. // 注意:1、回调函数为线程函数;2、要重新引用godking.sunny
  51. import godking.sunny
  52. // 将部分内容写入窗口虚表中
  53. winform.vlist.addRow("[@rowindex]","websocket",godking.sunny.msgType.getName_ws(msgtype),mod,url)
  54. winform.vlist.ensureVisible(winform.vlist.count)
  55. // 拦截发送数据
  56. if msgtype==godking.sunny.msgType.ws_send {
  57. var ws = godking.sunny.webSocket(msgid);
  58. var t = ws.getBodyText();
  59. winform.vlist.addRow("[@rowindex]","websocket","发送数据",mod,t)
  60. winform.vlist.ensureVisible(winform.vlist.count)
  61. t = t++"(已修改)"
  62. ws.setBody(t)
  63. }
  64. // 拦截接收数据
  65. if msgtype==godking.sunny.msgType.ws_received {
  66. var ws = godking.sunny.webSocket(msgid);
  67. var t = ws.getBodyText();
  68. winform.vlist.addRow("[@rowindex]","websocket","接收数据",mod,t)
  69. winform.vlist.ensureVisible(winform.vlist.count)
  70. }
  71. }
  72. winform.button.oncommand = function(id,event){
  73. if sunny.start(2021/*代理端口*/,true/*开启全局IE代理*/,/*上游代理*/,/*上游代理规则*/,/*脚本*/,/*强制TCP*/,true/*禁止压缩*/,winform){
  74. ..win.msgbox("已开启!",,,winform.hwnd);
  75. } else {
  76. ..win.msgbox("开启失败!",,,winform.hwnd);
  77. }
  78. }
  79. winform.button2.oncommand = function(id,event){
  80. sunny.stop();
  81. ..win.msgbox("已停止!",,,winform.hwnd);
  82. }
  83. winform.button3.oncommand = function(id,event){
  84. import process
  85. process.execute("http://coolaf.com/tool/chattest")
  86. }
  87. winform.button4.oncommand = function(id,event){
  88. import process
  89. process.execute("https://www.idcd.com/tool/socket")
  90. }
  91. winform.button5.oncommand = function(id,event){
  92. if winform.edit.text!=="" {
  93. sunny.setIeProxy(false);
  94. var pid = tonumber(winform.edit.text);
  95. sunny.process.start()
  96. sunny.process.addPid(pid)
  97. ..win.msgbox("已加入!",,,winform.hwnd);
  98. }
  99. }
  100. winform.show();
  101. win.loopMessage();

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/50940
推荐阅读
相关标签
  

闽ICP备14008679号