From 274686631ac8cd31250db6c402fda382350a6337 Mon Sep 17 00:00:00 2001 From: Senthil Kumaran Date: Sun, 11 Oct 2009 02:00:07 +0000 Subject: Fixed Issue6894, urllib2 doesn't respect "no_proxy" environment --- Lib/test/test_urllib2.py | 16 ++++++++++++++++ Lib/urllib2.py | 8 +++++++- Misc/NEWS | 2 ++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index d4288f8..e04d4a0 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -943,6 +943,22 @@ class HandlerTests(unittest.TestCase): self.assertEqual([(handlers[0], "http_open")], [tup[0:2] for tup in o.calls]) + def test_proxy_no_proxy(self): + os.environ['no_proxy'] = 'python.org' + o = OpenerDirector() + ph = urllib2.ProxyHandler(dict(http="proxy.example.com")) + o.add_handler(ph) + req = Request("http://www.perl.org/") + self.assertEqual(req.get_host(), "www.perl.org") + r = o.open(req) + self.assertEqual(req.get_host(), "proxy.example.com") + req = Request("http://www.python.org") + self.assertEqual(req.get_host(), "www.python.org") + r = o.open(req) + self.assertEqual(req.get_host(), "www.python.org") + del os.environ['no_proxy'] + + def test_proxy_https(self): o = OpenerDirector() ph = urllib2.ProxyHandler(dict(https='proxy.example.com:3128')) diff --git a/Lib/urllib2.py b/Lib/urllib2.py index 7ccf14b..a6c3e29 100644 --- a/Lib/urllib2.py +++ b/Lib/urllib2.py @@ -111,7 +111,7 @@ from urllib import (unwrap, unquote, splittype, splithost, quote, splitattr, ftpwrapper, splituser, splitpasswd, splitvalue) # support for FileHandler, proxies via environment variables -from urllib import localhost, url2pathname, getproxies +from urllib import localhost, url2pathname, getproxies, proxy_bypass # used in User-Agent header sent __version__ = sys.version[:3] @@ -698,14 +698,20 @@ class ProxyHandler(BaseHandler): def proxy_open(self, req, proxy, type): orig_type = req.get_type() proxy_type, user, password, hostport = _parse_proxy(proxy) + if proxy_type is None: proxy_type = orig_type + + if req.host and proxy_bypass(req.host): + return None + if user and password: user_pass = '%s:%s' % (unquote(user), unquote(password)) creds = base64.b64encode(user_pass).strip() req.add_header('Proxy-authorization', 'Basic ' + creds) hostport = unquote(hostport) req.set_proxy(hostport, proxy_type) + if orig_type == proxy_type or orig_type == 'https': # let other handlers take care of it return None diff --git a/Misc/NEWS b/Misc/NEWS index ddd909f..42a8cd9 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -398,6 +398,8 @@ Core and Builtins Library ------- +- Issue #6894: Fixed the issue urllib2 doesn't respect "no_proxy" environment + - Issue #7086: Added TCP support to SysLogHandler, and tidied up some anachronisms in the code which were a relic of 1.5.2 compatibility. -- cgit v0.12