web-dev-qa-db-ja.com

Python httplib ResponseNotReady

私はREST elggのクライアントをPythonを使用して書いており、リクエストが成功した場合でも、これを受け取って応答します。

Traceback (most recent call last):
  File "testclient.py", line 94, in <module>
    result = sendMessage(token, h1)
  File "testclient.py", line 46, in sendMessage
    res = h1.getresponse().read()
  File "C:\Python25\lib\httplib.py", line 918, in getresponse
    raise ResponseNotReady()
httplib.ResponseNotReady

ヘッダーを見ると( 'content-length'、 '5749')が表示されているので、そこにページがあることがわかりますが、例外が発生したため、.read()を使用してページを表示することはできません。 ResponseNotReadyの意味と、返されたコンテンツが表示されないのはなぜですか?

36
directedition

以前の接続から同じオブジェクトを再利用しないことを確認してください。サーバーkeep-aliveが終了してソケットが閉じると、これが発生します。

39
hcalves

以前の答えは正しいですが、その例外が発生する別のケースがあります:

中間応答を完全に読み取らずに複数の要求を行う。

例えば:

conn.request('PUT',...)
conn.request('GET',...)
# will not work: raises ResponseNotReady

conn.request('PUT',...)
r = conn.getresponse()
r.read() # <-- that's the important call!
conn.request('GET',...)
r = conn.getresponse()
r.read() # <-- same thing

等々。

63
Bokeh

私は今日、このコードを使用して、これと同じ例外に遭遇していました:

    conn = httplib.HTTPConnection(self._Host, self._port)
    conn.putrequest('GET',
        '/retrieve?id={0}'.format(parsed_store_response['id']))
    retr_response = conn.getresponse()

putrequestではなくrequestを使用していることに気付きませんでした。私は自分のインターフェースを混ぜていました。 ResponseNotReadyは、まだ実際にリクエストを送信していないために発生します。

2
Chris

さらに、サーバーがContent-Lengthヘッダーなしで応答を送信すると、このようなエラーが発生する可能性があります。Keep-Aliveが使用され、別のリクエストが同じソケット経由で送信された場合、HTTPクライアントの状態が損なわれます。

1

@Bokehの回答にコメントを追加できません。このプラットフォームではまだ必要な評判がないので。

だから、答えとして追加:ボケの答えは私のために働いた。

同じ接続オブジェクトを介して複数のリクエストを順番にパイプライン処理しようとしていました。一部の応答では、後で応答を処理する必要があったため、応答を読み取ることができませんでした。

私の経験から、私はボケの答えを2番目に返します。

response.read()は、各リクエストの後に必要です。応答を処理するかどうかに関係なく。

私の立場からすると、この質問はボケの答えがなければ不完全だったでしょう。ありがとう@Bokeh

0
Ankzz

これは、ファイアウォールが接続をブロックした場合にも発生する可能性があります。

0
Tommy