summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Hylton <jeremy@alum.mit.edu>2004-02-24 19:40:35 (GMT)
committerJeremy Hylton <jeremy@alum.mit.edu>2004-02-24 19:40:35 (GMT)
commitb3ee6f9921a0979b77a64b83f2f3a267ae66916e (patch)
treeb13f188022498f176284594a12ea0d4e9cb2f34d
parentf0ae4272b4b69576a51e5749820bf907799d1aca (diff)
downloadcpython-b3ee6f9921a0979b77a64b83f2f3a267ae66916e.zip
cpython-b3ee6f9921a0979b77a64b83f2f3a267ae66916e.tar.gz
cpython-b3ee6f9921a0979b77a64b83f2f3a267ae66916e.tar.bz2
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.
-rw-r--r--Lib/test/test_urllib2.py3
-rw-r--r--Lib/urllib2.py23
2 files changed, 19 insertions, 7 deletions
diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py
index 87de229..f38a4a3 100644
--- a/Lib/test/test_urllib2.py
+++ b/Lib/test/test_urllib2.py
@@ -461,7 +461,8 @@ class HandlerTests(unittest.TestCase):
self.assertEqual(http.method, method)
self.assertEqual(http.selector, "/")
self.assertEqual(http.req_headers,
- [("Foo", "bar"), ("Spam", "eggs")])
+ [("Connection", "close"),
+ ("Foo", "bar"), ("Spam", "eggs")])
self.assertEqual(http.data, data)
# check socket.error converted to URLError
diff --git a/Lib/urllib2.py b/Lib/urllib2.py
index 9f6dc63..cd0cfc1 100644
--- a/Lib/urllib2.py
+++ b/Lib/urllib2.py
@@ -957,18 +957,29 @@ class AbstractHTTPHandler(BaseHandler):
headers = dict(req.headers)
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:
h.request(req.get_method(), req.get_selector(), req.data, headers)
r = h.getresponse()
except socket.error, err: # XXX what error?
raise URLError(err)
- # Pick apart the HTTPResponse object to get the various pieces
- # of the
- resp = addinfourl(r.fp, r.msg, req.get_full_url())
- resp.code = r.status
- resp.msg = r.reason
- return resp
+ if r.status == 200:
+ # Pick apart the HTTPResponse object to get the addinfourl
+ # object initialized properly
+ resp = addinfourl(r.fp, r.msg, req.get_full_url())
+ resp.code = r.status
+ resp.msg = r.reason
+ return resp
+ else:
+ return self.parent.error("http", req, r.fp, r.status, r.msg,
+ r.msg.dict)
class HTTPHandler(AbstractHTTPHandler):