0

Pythonのソケットモジュールを使用して、かなり基本的なポーリングプロキシWebサーバーを作成しました。プロキシについては、ソケットのrecv()関数を使用して簡単なreadline()を作成しました。

これは次のようになります。

def readline(socket):
    buffer = ''
    char = socket.recv(1)
    while char != '\n' and char != '':
        buffer += char
        char = socket.recv(1)
    if char == '':
        buffer = ''
    else:
        buffer += '\n'
    return buffer

私の理解では、recv()が空の文字列を返す場合、これはソケットエラーがあったか、一方の側が接続を閉じたことを意味します。したがって、その場合、空の文字列をプロキシに返し、readline()が失敗したことを通知します。 。

プロキシを実行すると、youtube.comやyahoo.comなどのサイトにアクセスできますが、www.google.comにアクセスしようとすると、readline関数は常に最初のreadlineに空の文字列を返します(リクエスト行を読み取るため) HTTPリクエストで)。

何か案は?

編集: 申し訳ありませんが、私は不明確だったと思います。アドレスバーに「 http://www.google.com/」と入力すると、MozillaFirefoxクライアントからプロキシサーバーに送信されるリクエストを待っています。リクエストをリモートサーバーに転送してレスポンスを返す部分にさえ到達していません。

4

1 に答える 1

1

Google が最初にリクエスト ヘッダーを待っている可能性があると思います。承認されない場合は、接続が閉じられます。そして、あなたはリクエストを読んでいるのではなく、リクエストを送信しています。あなたが読んだのは応答です。

しかし、ヘッダーが送信されていない場合とは異なる場合があります。

--更新--

接続直後にこれらのヘッダーを送信してみてください。

GET / HTTP/1.1
Host: google.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17
X-Chrome-Variations: CM61yQEIk7bJAQiatskBCKa2yQEIp7bJAQiptskBCLi2yQEI34PKAQ==
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US;q=0.6,en;q=0.4
Accept-Charset: utf-8;q=0.7,*;q=0.3

また、ブラウザが Google に送信しているヘッダーと、firebug を使用して取得した応答を確認することもできます。

于 2013-02-06T00:21:31.917 に答える