3

私はPythonでツイスト10を使用してネットワークプログラミングを学んでいます。以下のコードでは、データを受信したときにHTTPリクエストを検出する方法はありますか?また、これからドメイン名、サブドメイン、ポート値を取得しますか?httpデータでない場合は破棄しますか?

from twisted.internet import stdio, reactor, protocol

from twisted.protocols import basic

import re



class DataForwardingProtocol(protocol.Protocol):

    def _ _init_ _(self):

        self.output = None

        self.normalizeNewlines = False



    def dataReceived(self, data):

        if self.normalizeNewlines:

            data = re.sub(r"(\r\n|\n)", "\r\n", data)

        if self.output:

            self.output.write(data)



class StdioProxyProtocol(DataForwardingProtocol):

    def connectionMade(self):

        inputForwarder = DataForwardingProtocol( )

        inputForwarder.output = self.transport

        inputForwarder.normalizeNewlines = True

        stdioWrapper = stdio.StandardIO(inputForwarder)

        self.output = stdioWrapper

        print "Connected to server.  Press ctrl-C to close connection."



class StdioProxyFactory(protocol.ClientFactory):

    protocol = StdioProxyProtocol



    def clientConnectionLost(self, transport, reason):

        reactor.stop( )



    def clientConnectionFailed(self, transport, reason):

        print reason.getErrorMessage( )

        reactor.stop( )



if __name__ == '_ _main_ _':

    import sys

    if not len(sys.argv) == 3:

        print "Usage: %s host port" % _ _file_ _

        sys.exit(1)



    reactor.connectTCP(sys.argv[1], int(sys.argv[2]), StdioProxyFactory( ))

    reactor.run( )
4

2 に答える 2

3

オーバーライドしているprotocol.dataReceivedは低レベルであるため、実行していないスマートバッファリングなしでは目的を果たすことができません。先ほど引用したドキュメントによると、

データを受信するたびに呼び出されます。

このメソッドを使用して、より高いレベルのメッセージに変換します。通常、いくつかのコールバックは、各完全なプロトコルメッセージの受信時に行われます。

パラメーター

data

長さが不定の文字列。部分的(または複数)のプロトコルメッセージが受信される可能性があるため、おそらく一部のデータをバッファリングする必要があることに注意してください。プロトコルの単体テストでは、一度に1バイトまで、チャンクサイズが異なるこのメソッドを呼び出すことをお勧めします。

ドキュメントのこの重要な部分を完全に無視しているようです。

代わりに、LineReceiver.lineReceived(もちろん継承)を使用して、HTTPリクエストが「行」で受信されるという事実を利用できます。これprotocols.basic.LineReceiverは、複数行として送信されるヘッダーを結合する必要があるためです。チュートリアルによると:

スペースまたはタブで始まるヘッダー行は、実際には前のヘッダー行の一部であり、読みやすいように複数の行に折りたたまれています。

適切にフォーマット/解析された応答が得られたら(twisted.webのソースを調べることを検討してください。そうすれば、それを実行できる1つの方法を確認してください)。

これからドメイン名、サブドメイン、ポート値を取得しますか?

これで、Hostヘッダー(RFCセクション14.23を参照)がこの情報を含むヘッダーになります。

于 2010-08-07T14:39:00.153 に答える
1

あなたが試みているように見えることに基づいて、私は以下が最も抵抗の少ない道だと思います:http: //twistedmatrix.com/documents/10.0.0/api/twisted.web.proxy.html

これは、HTTPプロキシを構築するためのねじれたクラスです。リクエストを傍受し、宛先を確認し、送信者を確認できます。また、すべてのヘッダーとコンテンツを前後に確認することもできます。ツイストがすでに提供しているHTTPプロトコルとプロキシクラスを書き直そうとしているようです。これがお役に立てば幸いです。

于 2010-08-10T18:53:12.553 に答える