1

我正在使用扭曲框架运行 HTTP 服务器。有什么办法可以“手动”要求它处理一些有效载荷?例如,如果我已经构建了一些以太网帧,我可以要求twisted 的reactor 处理它,就好像它刚刚到达我的网卡一样?

4

2 回答 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 回答