言うまでもなく、私は次のことに困惑しています。これは私のクエリの偽の続きです: 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 応答の場合のみ)?