2

言うまでもなく、私は次のことに困惑しています。これは私のクエリの偽の続きです: HTTP 303 (SeeOther): GET Works, POST Fails別の質問を投稿しています.

私は非常に単純な web.py クラスを持っています:

class user:
        def GET(self, id):
                """List a single user"""
                web.header('Cache-control', 'no-cache')
                return 'wtf!!'

        def POST(self, id):
                """Save an updated user"""
                web.header('Cache-control', 'no-cache')
                return 'wtf!!'

このリソースから GET すると、愚かで単純な「wtf!!」を受け取ります。応答するテキスト。

このリソースに POST すると、リクエストのソースに応じてさまざまな結果が得られます。

  • Google Chrome:完全に失敗します。開発者ツールのネットワーク アナライザーを使用すると、リクエストが送信されていることがわかります。約 15 秒後、失敗したと表示されます。
  • IE9:技術的には動作します。約 15 秒待った後、期待される応答が常に到着します。
  • PuTTY/Telnet:完全に動作します。予想どおり、応答はほぼ瞬時に表示されます。

おそらく Web ブラウザーが web.py を壊すヘッダーを追加しているのではないかと考え、Wireshark を開いて調査することにしました。クライアントからの応答は常にタイムリーに受信されていることがわかりました。ただし、Wireshark が POST 要求への応答を HTTP として認識していないことに気付きました (これは、GET 要求への応答に対して行うものです)。

編集: 私はこれのテスト/トラブルシューティングに取り組んでおり、さらに開発が進んでいます。

GET および POST 応答は両方とも、ヘッダー「Transfer-encoding: chunked」でクライアントに返されます。これは、ページ全体を送信するのではなく、準備ができたときにビットとピースを送信することを意味します。一般的な形式は次のとおりです。

200 OK, etc
{Headers}

5              # Num. of Chars in This Chunk (in hex)
Hello

200 OK, etc
{Headers}

0              # Signifies no more chunks to come

Wireshark を使用して、これらのパケットを探します。GET 応答は本来あるべきように見えますが、POST 応答では最後のチャンクが欠落しているようです。その結果、接続はタイムアウトするまで開いたままになります (サーバーからさらにデータが来ることを期待しているため)。

サーバー側でリクエストに触れているものは次のとおりです。データを「チャンク化」する責任があるのは誰なのかわかりません。

  • アパッチ
  • mod_cgi
  • はじける
  • web.py
  • 私のアプリ

私の質問:

私のリクエストを実際に「チャンク」するコンポーネントはどれですか?

最後のチャンクの送信に失敗するのはなぜですか (POST 応答の場合のみ)?

4

1 に答える 1

0

私はあなたの問題を再現しようとしました。そして、それはすべて正常に機能しています。

クラス:

class User:
    def GET(self, id):
        """List a single user"""
        web.header('Cache-control', 'no-cache')
        return 'GET' + str(id)

    def POST(self, id):
        """Save an updated user"""
        web.header('Cache-control', 'no-cache')
        raise web.seeother('/user/2')

URL の場合: urls = ( r'/user/?(\d*)', "User", )

そして、私が POST (FF を使用) を実行しているときに、すべてが機能します。

ミドルウェアを使用していますか?

于 2013-01-12T10:30:35.893 に答える