0x00前言

其实我也不太清楚这种操作到底该叫什么 不过跟 Monkey patch 似乎是一个用途,就是在运行时修改代码 于是我就先叫他 Dynamic patch

0x01起因

在使用 Flask-SocketIO 的时候,发现其并没有完全实现所有的 socket.io 中的 transport 协议 于是想手动支持一下 JSONP Polling

看着 eventlet 提供的 monkey_patch(),发现我是不是也可以动态patch一下他的代码 这样可以最大限度的保持项目的干净,而不用再维护一个库甚至多个库的代码分支

0x02实战

当同时使用eventletPycharmdebugger时,需要注意不能给threadmonkey 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-EngineIOIssue