From 4669c445cbe5537a221ab837fdd31964849b1b46 Mon Sep 17 00:00:00 2001 From: Frost Ming Date: Wed, 15 Oct 2025 10:56:27 +0800 Subject: [PATCH 1/2] fix(test): avoid impact of system proxies on urllib test suite by mocking relevant functions Signed-off-by: Frost Ming --- Lib/test/test_urllib.py | 7 +++++++ Lib/test/test_urllib2.py | 10 +++++++--- Lib/test/test_urllib2_localnet.py | 6 ++++-- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index ae524c5ffba6b1..581515714a9ebe 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -7,6 +7,7 @@ import email.message import io import unittest +import unittest.mock from test import support from test.support import os_helper from test.support import socket_helper @@ -86,9 +87,15 @@ def fakehttp(self, fakedata, mock_close=False): fake_http_class = fakehttp(fakedata, mock_close=mock_close) self._connection_class = http.client.HTTPConnection http.client.HTTPConnection = fake_http_class + # Disable proxies during the test + self.getproxies = unittest.mock.patch.object(urllib.request, 'getproxies', return_value={}) + self.getproxies.start() + # Clear cached opener + urllib.request.install_opener(None) def unfakehttp(self): http.client.HTTPConnection = self._connection_class + self.getproxies.stop() class urlopen_FileTests(unittest.TestCase): diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index 7d7f2fa00d35b6..258677faa3fb18 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -1380,8 +1380,11 @@ def request(conn, method, url, *pos, **kw): # Change response for subsequent connection conn.__class__.fakedata = b"HTTP/1.1 200 OK\r\n\r\nHello!" http.client.HTTPConnection.request = request - fp = urllib.request.urlopen("http://python.org/path") - self.assertEqual(fp.geturl(), "http://python.org/path?query") + with mock.patch('urllib.request.getproxies', return_value={}): + # Disable proxy for predictable URL handling + urllib.request.install_opener(None) + fp = urllib.request.urlopen("http://python.org/path") + self.assertEqual(fp.geturl(), "http://python.org/path?query") def test_redirect_encoding(self): # Some characters in the redirect target may need special handling, @@ -1399,7 +1402,8 @@ def http_open(self, req): ) return result handler = Handler() - opener = urllib.request.build_opener(handler) + with mock.patch('urllib.request.getproxies', return_value={}): + opener = urllib.request.build_opener(handler) tests = ( (b'/p\xC3\xA5-dansk/', b'/p%C3%A5-dansk/'), (b'/spaced%20path/', b'/spaced%20path/'), diff --git a/Lib/test/test_urllib2_localnet.py b/Lib/test/test_urllib2_localnet.py index 9186436183aae1..815556ded34f2f 100644 --- a/Lib/test/test_urllib2_localnet.py +++ b/Lib/test/test_urllib2_localnet.py @@ -6,6 +6,7 @@ import http.server import threading import unittest +import unittest.mock import hashlib from test import support @@ -336,8 +337,9 @@ def restore_environ(old_environ): os.environ.clear() os.environ.update(old_environ) self.addCleanup(restore_environ, os.environ.copy()) - os.environ['NO_PROXY'] = '' - os.environ['no_proxy'] = '' + self._proxy_bypass = unittest.mock.patch('urllib.request.proxy_bypass', return_value=False) + self._proxy_bypass.start() + self.addCleanup(self._proxy_bypass.stop) self.digest_auth_handler = DigestAuthHandler() self.digest_auth_handler.set_users({self.USER: self.PASSWD}) From c3ecb3b2447bc2fd182dfcb17104e4143eef4833 Mon Sep 17 00:00:00 2001 From: Frost Ming Date: Fri, 17 Oct 2025 08:47:38 +0800 Subject: [PATCH 2/2] fix: apply changes from review feedback Signed-off-by: Frost Ming --- Lib/test/test_urllib2_localnet.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_urllib2_localnet.py b/Lib/test/test_urllib2_localnet.py index 815556ded34f2f..030d0c0d2d53cb 100644 --- a/Lib/test/test_urllib2_localnet.py +++ b/Lib/test/test_urllib2_localnet.py @@ -332,14 +332,10 @@ class ProxyAuthTests(unittest.TestCase): def setUp(self): super(ProxyAuthTests, self).setUp() - # Ignore proxy bypass settings in the environment. - def restore_environ(old_environ): - os.environ.clear() - os.environ.update(old_environ) - self.addCleanup(restore_environ, os.environ.copy()) - self._proxy_bypass = unittest.mock.patch('urllib.request.proxy_bypass', return_value=False) - self._proxy_bypass.start() - self.addCleanup(self._proxy_bypass.stop) + # Patch proxy_bypass temporarily to ignore proxy bypass settings. + proxy_bypass = unittest.mock.patch('urllib.request.proxy_bypass', return_value=False) + proxy_bypass.start() + self.addCleanup(proxy_bypass.stop) self.digest_auth_handler = DigestAuthHandler() self.digest_auth_handler.set_users({self.USER: self.PASSWD})