From 7b198d71394920baa41ee33871cb1e03fa273478 Mon Sep 17 00:00:00 2001 From: tangyuan0821 Date: Fri, 26 Jun 2026 22:06:54 +0800 Subject: [PATCH] gh-76646: Fix proxy_bypass_registry trailing semicolon on Windows --- Lib/test/test_urllib2.py | 22 ++++++++++++++++++- Lib/urllib/request.py | 2 ++ ...6-13-00-00.gh-issue-76646.proxy_bypass.rst | 2 ++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2026-06-26-13-00-00.gh-issue-76646.proxy_bypass.rst diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index 3a77b9e5ab7928..7f1183e6fcd7ed 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -1528,7 +1528,6 @@ def test_proxy_https_proxy_authorization(self): self.assertEqual(req.host, "proxy.example.com:3128") self.assertEqual(req.get_header("Proxy-authorization"), "FooBar") - @unittest.skipUnless(os.name == "nt", "only relevant for Windows") def test_winreg_proxy_bypass(self): proxy_override = "www.example.com;*.example.net; 192.168.0.1" proxy_bypass = _proxy_bypass_winreg_override @@ -1552,6 +1551,27 @@ def test_winreg_proxy_bypass(self): "expect to bypass intranet address '%s'" % host) + def test_winreg_proxy_bypass_trailing_semicolon(self): + proxy_bypass = _proxy_bypass_winreg_override + + proxy_override = "example.com;" + self.assertTrue(proxy_bypass("example.com", proxy_override)) + self.assertFalse(proxy_bypass("notmatching.com", proxy_override)) + + proxy_override = ";example.com" + self.assertTrue(proxy_bypass("example.com", proxy_override)) + self.assertFalse(proxy_bypass("notmatching.com", proxy_override)) + + proxy_override = "example.com;;*.example.net;" + self.assertTrue(proxy_bypass("example.com", proxy_override)) + self.assertTrue(proxy_bypass("sub.example.net", proxy_override)) + self.assertFalse(proxy_bypass("notmatching.com", proxy_override)) + + proxy_override = "example.com; ;" + self.assertTrue(proxy_bypass("example.com", proxy_override)) + self.assertTrue(proxy_bypass("localhost", proxy_override)) + self.assertFalse(proxy_bypass("notmatching.com", proxy_override)) + @unittest.skipUnless(sys.platform == 'darwin', "only relevant for OSX") def test_osx_proxy_bypass(self): bypass = { diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index f5f17f223a4585..d10e2198ee1096 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -2024,6 +2024,8 @@ def _proxy_bypass_winreg_override(host, override): proxy_override = override.split(';') for test in proxy_override: test = test.strip() + if not test: + continue # "" should bypass the proxy server for all intranet addresses if test == '': if '.' not in host: diff --git a/Misc/NEWS.d/next/Library/2026-06-26-13-00-00.gh-issue-76646.proxy_bypass.rst b/Misc/NEWS.d/next/Library/2026-06-26-13-00-00.gh-issue-76646.proxy_bypass.rst new file mode 100644 index 00000000000000..37a77f6d52cfce --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-06-26-13-00-00.gh-issue-76646.proxy_bypass.rst @@ -0,0 +1,2 @@ +Fix proxy bypass on Windows when the ``ProxyOverride`` registry value +has a trailing semicolon, which previously could cause incorrect results.