Вы можете сделать что-то вроде этого:
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
он должен работать как положено, с запросом от nc-сервера на порту 9000, передаваемым в качестве полезной нагрузки на витой веб-сервер, и ответ возвращается, как и ожидалось.
Ключевые строки находятся в SomeClient.dataRectained (). Вам понадобится транспортный объект с правильными методами - в приведенном выше примере я просто украл объект из клиентского соединения. Если вы не собираетесь этого делать, я полагаю, вам придется создать его, так как стеку нужно будет выполнять такие действия, как вызов getPeer ().