mirror of
https://github.com/python/cpython.git
synced 2025-11-04 11:49:12 +00:00
Fix two bugs in the new do_open() implementation for HTTPHandler.
Invoke the standard error handlers for non-200 responses. Always supply a "Connection: close" header to prevent the server from leaving the connection open. Downstream users of the socket may attempt recv()/read() with no arguments, which would block if the connection were kept open.
This commit is contained in:
parent
f0ae4272b4
commit
b3ee6f9921
2 changed files with 19 additions and 7 deletions
|
|
@ -461,7 +461,8 @@ class HandlerTests(unittest.TestCase):
|
||||||
self.assertEqual(http.method, method)
|
self.assertEqual(http.method, method)
|
||||||
self.assertEqual(http.selector, "/")
|
self.assertEqual(http.selector, "/")
|
||||||
self.assertEqual(http.req_headers,
|
self.assertEqual(http.req_headers,
|
||||||
[("Foo", "bar"), ("Spam", "eggs")])
|
[("Connection", "close"),
|
||||||
|
("Foo", "bar"), ("Spam", "eggs")])
|
||||||
self.assertEqual(http.data, data)
|
self.assertEqual(http.data, data)
|
||||||
|
|
||||||
# check socket.error converted to URLError
|
# check socket.error converted to URLError
|
||||||
|
|
|
||||||
|
|
@ -957,18 +957,29 @@ class AbstractHTTPHandler(BaseHandler):
|
||||||
|
|
||||||
headers = dict(req.headers)
|
headers = dict(req.headers)
|
||||||
headers.update(req.unredirected_hdrs)
|
headers.update(req.unredirected_hdrs)
|
||||||
|
# We want to make an HTTP/1.1 request, but the addinfourl
|
||||||
|
# class isn't prepared to deal with a persistent connection.
|
||||||
|
# It will try to read all remaining data from the socket,
|
||||||
|
# which will block while the server waits for the next request.
|
||||||
|
# So make sure the connection gets closed after the (only)
|
||||||
|
# request.
|
||||||
|
headers["Connection"] = "close"
|
||||||
try:
|
try:
|
||||||
h.request(req.get_method(), req.get_selector(), req.data, headers)
|
h.request(req.get_method(), req.get_selector(), req.data, headers)
|
||||||
r = h.getresponse()
|
r = h.getresponse()
|
||||||
except socket.error, err: # XXX what error?
|
except socket.error, err: # XXX what error?
|
||||||
raise URLError(err)
|
raise URLError(err)
|
||||||
|
|
||||||
# Pick apart the HTTPResponse object to get the various pieces
|
if r.status == 200:
|
||||||
# of the
|
# Pick apart the HTTPResponse object to get the addinfourl
|
||||||
|
# object initialized properly
|
||||||
resp = addinfourl(r.fp, r.msg, req.get_full_url())
|
resp = addinfourl(r.fp, r.msg, req.get_full_url())
|
||||||
resp.code = r.status
|
resp.code = r.status
|
||||||
resp.msg = r.reason
|
resp.msg = r.reason
|
||||||
return resp
|
return resp
|
||||||
|
else:
|
||||||
|
return self.parent.error("http", req, r.fp, r.status, r.msg,
|
||||||
|
r.msg.dict)
|
||||||
|
|
||||||
|
|
||||||
class HTTPHandler(AbstractHTTPHandler):
|
class HTTPHandler(AbstractHTTPHandler):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue