From 428e9d1d05470d1be6d9f4720cb9e163820fa6c8 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Sun, 19 Jul 2009 04:20:46 +0000 Subject: [PATCH] Fix for issue5102, timeout value propages between redirects, proxy, digest and auth handlers. Fixed tests to reflect the same. --- Lib/test/test_urllib2.py | 8 ++++++-- Lib/urllib2.py | 8 ++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index ff164c2058c..fe5688b5441 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -224,8 +224,8 @@ def test_password_manager_default_port(self): class MockOpener: addheaders = [] - def open(self, req, data=None): - self.req, self.data = req, data + def open(self, req, data=None,timeout=socket._GLOBAL_DEFAULT_TIMEOUT): + self.req, self.data, self.timeout = req, data, timeout def error(self, proto, *args): self.proto, self.args = proto, args @@ -850,6 +850,7 @@ class HandlerTests(unittest.TestCase): method = getattr(h, "http_error_%s" % code) req = Request(from_url, data) req.add_header("Nonsense", "viking=withhold") + req.timeout = socket._GLOBAL_DEFAULT_TIMEOUT if data is not None: req.add_header("Content-Length", str(len(data))) req.add_unredirected_header("Spam", "spam") @@ -878,6 +879,7 @@ class HandlerTests(unittest.TestCase): # loop detection req = Request(from_url) + req.timeout = socket._GLOBAL_DEFAULT_TIMEOUT def redirect(h, req, url=to_url): h.http_error_302(req, MockFile(), 302, "Blah", MockHeaders({"location": url})) @@ -887,6 +889,7 @@ class HandlerTests(unittest.TestCase): # detect infinite loop redirect of a URL to itself req = Request(from_url, origin_req_host="example.com") count = 0 + req.timeout = socket._GLOBAL_DEFAULT_TIMEOUT try: while 1: redirect(h, req, "http://example.com/") @@ -898,6 +901,7 @@ class HandlerTests(unittest.TestCase): # detect endless non-repeating chain of redirects req = Request(from_url, origin_req_host="example.com") count = 0 + req.timeout = socket._GLOBAL_DEFAULT_TIMEOUT try: while 1: redirect(h, req, "http://example.com/%d" % count) diff --git a/Lib/urllib2.py b/Lib/urllib2.py index ef8bbc8dabc..d36aa807e4d 100644 --- a/Lib/urllib2.py +++ b/Lib/urllib2.py @@ -594,7 +594,7 @@ class HTTPRedirectHandler(BaseHandler): fp.read() fp.close() - return self.parent.open(new) + return self.parent.open(new, timeout=req.timeout) http_error_301 = http_error_303 = http_error_307 = http_error_302 @@ -710,7 +710,7 @@ class ProxyHandler(BaseHandler): # {'http': 'ftp://proxy.example.com'}, we may end up turning # a request for http://acme.example.com/a into one for # ftp://proxy.example.com/a - return self.parent.open(req) + return self.parent.open(req, timeout=req.timeout) class HTTPPasswordMgr: @@ -826,7 +826,7 @@ class AbstractBasicAuthHandler: if req.headers.get(self.auth_header, None) == auth: return None req.add_header(self.auth_header, auth) - return self.parent.open(req) + return self.parent.open(req, timeout=req.timeout) else: return None @@ -917,7 +917,7 @@ class AbstractDigestAuthHandler: if req.headers.get(self.auth_header, None) == auth_val: return None req.add_unredirected_header(self.auth_header, auth_val) - resp = self.parent.open(req) + resp = self.parent.open(req, timeout=req.timeout) return resp def get_cnonce(self, nonce):