如何使用猴子修补python';s套接字模块,使其转储流量
我试图在Python2.7中创建一个如何使用猴子修补python';s套接字模块,使其转储流量,python,python-2.7,sockets,monkeypatching,Python,Python 2.7,Sockets,Monkeypatching,我试图在Python2.7中创建一个socket.socket类的子类,使用重写的send()和read()方法,以便它们将通过套接字传输的数据转储到终端。代码如下所示: import socket class SocketMonkey(socket.socket): def send(self, buf): print('BUF: {}'.format(buf)) return super(SocketMonkey, self).send(buf)
socket.socket
类的子类,使用重写的send()
和read()
方法,以便它们将通过套接字传输的数据转储到终端。代码如下所示:
import socket
class SocketMonkey(socket.socket):
def send(self, buf):
print('BUF: {}'.format(buf))
return super(SocketMonkey, self).send(buf)
def recv(self, size=-1):
buf = super(SocketMonkey, self).recv(size)
print('BUF: {}'.format(buf))
return buf
socket.socket = SocketMonkey
这就是我如何实例化和使用这个类:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('www.domain.com', 80))
sock.send('GET / HTTP/1.1\n\n')
我已经对socket模块进行了猴子补丁,但尽管socket功能和以前一样工作,但数据并没有被转储。你知道我哪里出了问题吗?我也遇到了同样的问题,使用下面的代码解决了
导入套接字
导入日志记录
类TestSocket:
"""
定义将用于测试的自定义套接字类。
"""
定义初始化(自、自动对焦、袜子类型):
logging.log(logging.DEBUG,
f“假套接字构造[{af}][{sock_type}]”)
def发送到(自身、数据、地址):
logging.log(logging.DEBUG,
f“发送到[{data}][{address}]”)
def插座(af,插座类型):
返回TestSocket(af、sock_类型)
def测试下载文件(monkeypatch,提交):
使用monkeypatch.context()作为m:
#这将替换套接字构造函数。
m、 setattr(套接字,“套接字”,套接字获取)
#现在使用套接字。
# ...
我也遇到了同样的问题,使用以下代码解决了
导入套接字
导入日志记录
类TestSocket:
"""
定义将用于测试的自定义套接字类。
"""
定义初始化(自、自动对焦、袜子类型):
logging.log(logging.DEBUG,
f“假套接字构造[{af}][{sock_type}]”)
def发送到(自身、数据、地址):
logging.log(logging.DEBUG,
f“发送到[{data}][{address}]”)
def插座(af,插座类型):
返回TestSocket(af、sock_类型)
def测试下载文件(monkeypatch,提交):
使用monkeypatch.context()作为m:
#这将替换套接字构造函数。
m、 setattr(套接字,“套接字”,套接字获取)
#现在使用套接字。
# ...
你能显示你正在实例化和使用套接字实例的代码吗?@JaceBrowning我将用法添加到question.relevant:;概要:套接字不尊重子类化,而是使用委托。快速确认:打印(sock.send)
。我认为这是socket作为C库的一个“特性”,而不是Python;我还有更多的探索要做。你能展示一下你在哪里实例化和使用套接字实例的代码吗?@JaceBrowning我把用法添加到question.relevant:;概要:套接字不尊重子类化,而是使用委托。快速确认:打印(sock.send)
。我认为这是socket作为C库的一个“特性”,而不是Python;我还有更多的探索要做。