ねじれたフレームワークを使用して HTTP サーバーを実行しています。「手動で」ペイロードを処理するように依頼する方法はありますか? たとえば、イーサネット フレームを構築した場合、ネットワーク カードにちょうど到着したかのように、それを処理するように twisted のリアクターに依頼できますか?
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() を呼び出すなどのことをしたいので、それを作成する必要があると思います。
ユースケースは何ですか?
おそらく、独自のデータグラム プロトコルを作成したいと思うでしょう。
基本的に、プロトコルの解析と処理を実際に実装する場所は DatagramProtocol クラスです。通常、このクラスは twisted.internet.protocol.DatagramProtocol から派生します。ほとんどのプロトコル ハンドラーは、このクラスまたはその便利な子のいずれかから継承します。DatagramProtocol クラスはデータグラムを受信し、ネットワーク経由で送信できます。受信したデータグラムには送信元のアドレスが含まれており、データグラムを送信する際には送信先のアドレスを指定する必要があります。
ワイヤ レベルの送信をインジェクトするのではなく確認したい場合は、すばらしい無料のパケット スニファである WireShark をインストールして実行します。