New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
HTTPResponse.close() should consume all remaining data in body if any #70419
Comments
HTTPResponse.close() in httplib should consume all remaining data in body if any. Or the followed request would get the unread content from the previous request, which result in the wrong result. The following code shown that the second request will get a wrong status code if calling HTTPResponse.close() on the first response. The whole code consists of a HTTP server and a client. The server will always return 403 for testing. def client():
conn = httplib.HTTPConnection(HOST, PORT)
conn.request('GET', PATH, None, headers={})
rsp = conn.getresponse()
print rsp.status
rsp.close() # close response
conn.request('GET', PATH, None, headers={})
rsp2 = conn.getresponse()
print rsp2.status # --> should be 403 The full version see the attached file (The server used Tornado) |
The documentation already says you have to read the whole response before sending a new request: <https://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.getresponse\>. So I think this is more like a new feature than a bug fix, and would have to go into 3.6. But I am not sure it is a good idea. What if the response is a large multi-megabyte download? In that case, it might make more sense to shut down the connection and start a new one. It might be possible to add extra error checking to prevent reading a second response until the first is complete. I am not sure if that is practical or worthwhile though. |
In my opinion, HTTPResponse.close() should do really close work. Not only releasing the underlying file obj but also need to consume the remaining data to make sure the request complete. If close() does not consume the remaining data, the user would have to do it after invoking close(), regardless of how large the data is. But how do do it, the HTTPResponse has been closed. So we have to use HTTPConnection.sock to do read work. However, this looks somewhat weird. |
Martin's point was that you can abandon the connection and create a new one if you choose not to consume all the data.
Right, if you want to consume the data you should do it before calling close(). |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: