Python httplib ResponseNotReady

2019-01-13 15:20发布

I'm writing a REST client for elgg using python, and even when the request succeeds, I get this in response:

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

Looking at the header, I see ('content-length', '5749'), so I know there is a page there, but I can't use .read() to see it because the exception comes up. What does ResponseNotReady mean and why can't I see the content that was returned?

5条回答
forever°为你锁心
2楼-- · 2019-01-13 15:40

Make sure you don't reuse the same object from a previous connection. You will hit this once the server keep-alive ends and the socket closes.

查看更多
Viruses.
3楼-- · 2019-01-13 15:45

I was running into this same exception today, using this code:

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

I didn't notice that I was using putrequest rather than request; I was mixing my interfaces. ResponseNotReady is raised because I haven't actually sent the request yet.

查看更多
贼婆χ
4楼-- · 2019-01-13 15:47

This can also occur if a firewall blocks the connection.

查看更多
女痞
5楼-- · 2019-01-13 15:55

Additionally, errors like this can occur when the server sends a response without a Content-Length header, which will cripple the state of the HTTP client if Keep-Alive is used and another request is sent over the same socket.

查看更多
\"骚年 ilove
6楼-- · 2019-01-13 16:00

Previous answers are correct, but there's another case where you could get that exception:

Making multiple requests without reading any intermediate responses completely.

For instance:

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

and so on.

查看更多
登录 后发表回答