Python httplib ResponseNotReady

那年仲夏 提交于 2019-11-27 19:00:28

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.

Bokeh

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.

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.

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.

This can also occur if a firewall blocks the connection.

Unable to add comment to @Bokeh 's answer; as I do not have the requisite reputation yet on this platform.

So, adding as answer: Bokeh's answer worked for me.

I was trying to pipeline multiple requests sequentially over the same connection object. For few of the responses I wanted to process the response later, hence missed to read the response.

From my experience, I second Bokeh's answer:

response.read() is a must after each request. Even if you wish to process response or not.

From my standpoint this question would have been incomplete without Bokeh's answer. Thanks @Bokeh

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!