我正在使用扭曲框架运行 HTTP 服务器。有什么办法可以“手动”要求它处理一些有效载荷?例如,如果我已经构建了一些以太网帧,我可以要求twisted 的reactor 处理它,就好像它刚刚到达我的网卡一样?
问问题
268 次
2 回答
2
你可以这样做:
from twisted.web import server
from twisted.web.resource import Resource
from twisted.internet import reactor
from twisted.internet.protocol import Protocol, ClientFactory
class SomeWebThing(Resource):
def render_GET(self, request):
return "hello\n"
class SomeClient(Protocol):
def dataReceived(self, data):
p = self.factory.site.buildProtocol(self.transport.addr)
p.transport = self.transport
p.dataReceived(data)
class SomeClientFactory(ClientFactory):
protocol = SomeClient
def __init__(self, site):
self.site = site
if __name__ == '__main__':
root = Resource()
root.putChild('thing', SomeWebThing())
site = server.Site(root)
reactor.listenTCP(8000, site)
factory = SomeClientFactory(site)
reactor.connectTCP('localhost', 9000, factory)
reactor.run()
并将其保存为 simpleinjecter.py,如果你这样做(从命令行):
echo -e "GET /thing HTTP/1.1\r\n\r\n" | nc -l 9000 # runs a server, ready to send req to first client connection
python simpleinjecter.py
它应该可以按预期工作,来自端口 9000 上的 nc 服务器的请求作为有效负载流入扭曲的 Web 服务器,并且响应按预期返回。
关键行在 SomeClient.dataRecieved() 中。您需要一个具有正确方法的传输对象——在上面的示例中,我只是从客户端连接中窃取该对象。如果你不打算这样做,我想你将不得不编造一个,因为堆栈会想要做一些事情,比如在它上面调用 getPeer()。
于 2011-12-27T23:07:21.130 回答
0
用例是什么?
也许您想创建自己的数据报协议
在基础上,您实际实现协议解析和处理的地方是 DatagramProtocol 类。这个类通常是从 twisted.internet.protocol.DatagramProtocol 派生的。大多数协议处理程序要么继承自此类,要么继承自它的便利子类之一。DatagramProtocol 类接收数据报,并可以通过网络将它们发送出去。接收到的数据报包括发送它们的地址,并且在发送数据报时必须指定要发送到的地址。
如果您想查看线路级传输而不是注入它们,请安装并运行WireShark,这是一款出色的免费数据包嗅探器。
于 2009-10-24T21:42:16.363 回答