0x00 前言
其实我也不太清楚这种操作到底该叫什么
不过跟 Monkey patch
似乎是一个用途,就是在运行时修改代码
于是我就先叫他 Dynamic patch
啦
0x01 起因
在使用 Flask-SocketIO
的时候,发现其并没有完全实现所有的 socket.io
中的 transport
协议
于是想手动支持一下 JSONP Polling
看着 eventlet
提供的 monkey_patch()
,发现我是不是也可以动态 patch 一下他的代码
这样可以最大限度的保持项目的干净,而不用再维护一个库甚至多个库的代码分支
0x02 实战
当同时使用 eventlet 和 Pycharm 的 debugger 时,需要注意不能给 thread 打 monkey patch, 否则 debugger 会坏掉。
跟着代码摸了几个小时,再看了看官方 nodejs 版的 server 代码,又给官方 demo 抓了一下包,大概摸清了协议,于是把
engineio.server.Server::_ok()
engineio.payload.Payload::decode()
engineio.payload.Payload::encode()
engineio.server.Server::handle_connect()
engineio.server.Server::_handle_connect()
这五个函数替换掉了,总体思路比较简单,socket.io 协议的 payload 不变,针对请求入口和出口为 JSONP 请求做出相应修改即可。
0x03 相关
Patch 代码在 Github Gist Python-EngineIO 的 Issue