From 038047a7e6de323925cd1cbefcb5cc6b09764675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 19 May 2025 19:48:21 +0200 Subject: [PATCH 01/12] fix `test_httpservers` --- Lib/test/test_httpservers.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 429d9005bd7605..c47b1fd668d6cb 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -1472,11 +1472,15 @@ def setUp(self): f.write(self.tls_password.encode()) self.addCleanup(os_helper.unlink, self.tls_password_file) - def fetch_file(self, path): + @unittest.skipIf(ssl is None, "requires ssl") + def get_ssl_context(self): context = ssl.create_default_context() # allow self-signed certificates context.check_hostname = False context.verify_mode = ssl.CERT_NONE + return context + + def fetch_file(self, path, context=None): req = urllib.request.Request(path, method='GET') with urllib.request.urlopen(req, context=context) as res: return res.read() @@ -1510,8 +1514,7 @@ def wait_for_server(self, proc, protocol, port, bind, timeout=50): return False def test_http_client(self): - port = find_unused_port() - bind = '127.0.0.1' + _, (bind, port) = server._get_best_family(None, find_unused_port()) proc = spawn_python('-u', '-m', 'http.server', str(port), '-b', bind, bufsize=1, text=True) self.addCleanup(kill_python, proc) @@ -1521,8 +1524,7 @@ def test_http_client(self): self.assertEqual(res, self.served_data) def test_https_client(self): - port = find_unused_port() - bind = '127.0.0.1' + _, (bind, port) = server._get_best_family(None, find_unused_port()) proc = spawn_python('-u', '-m', 'http.server', str(port), '-b', bind, '--tls-cert', self.tls_cert, '--tls-key', self.tls_key, @@ -1531,7 +1533,8 @@ def test_https_client(self): self.addCleanup(kill_python, proc) self.addCleanup(proc.terminate) self.assertTrue(self.wait_for_server(proc, 'https', port, bind)) - res = self.fetch_file(f'https://{bind}:{port}/{self.served_file_name}') + url = f'https://{bind}:{port}/{self.served_file_name}' + res = self.fetch_file(url, context=self.get_ssl_context()) self.assertEqual(res, self.served_data) From 444549bda0e1be9547670d5bf45de8a93c0e6cb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 19 May 2025 22:30:47 +0200 Subject: [PATCH 02/12] add timeouts --- Lib/test/test_httpservers.py | 46 +++++++++++++++--------------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index c47b1fd668d6cb..d60abff5b000a6 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -35,7 +35,6 @@ is_apple, import_helper, os_helper, threading_helper ) from test.support.script_helper import kill_python, spawn_python -from test.support.socket_helper import find_unused_port try: import ssl @@ -1491,48 +1490,41 @@ def parse_cli_output(self, output): return None, None, None return matches.group(1), matches.group(2), int(matches.group(3)) - def wait_for_server(self, proc, protocol, port, bind, timeout=50): - """Check the server process output. - - Return True if the server was successfully started - and is listening on the given port and bind address. - """ - while timeout > 0: + def wait_for_server(self, proc, protocol): + """Check the server process output.""" + for _ in range(10): line = proc.stdout.readline() if not line: - time.sleep(0.1) - timeout -= 1 + time.sleep(0.5) continue - protocol_, host_, port_ = self.parse_cli_output(line) - if not protocol_ or not host_ or not port_: - time.sleep(0.1) - timeout -= 1 - continue - if protocol_ == protocol and host_ == bind and port_ == port: - return True - break - return False + if support.verbose > 1: + print(line) + parsed_protocol, host, port = self.parse_cli_output(line) + if protocol == parsed_protocol: + return host, port + return None, None def test_http_client(self): - _, (bind, port) = server._get_best_family(None, find_unused_port()) - proc = spawn_python('-u', '-m', 'http.server', str(port), '-b', bind, - bufsize=1, text=True) + proc = spawn_python('-u', '-m', 'http.server', text=True) self.addCleanup(kill_python, proc) self.addCleanup(proc.terminate) - self.assertTrue(self.wait_for_server(proc, 'http', port, bind)) + bind, port = self.wait_for_server(proc, 'http') + self.assertIsNotNone(bind) + self.assertIsNotNone(port) res = self.fetch_file(f'http://{bind}:{port}/{self.served_file_name}') self.assertEqual(res, self.served_data) def test_https_client(self): - _, (bind, port) = server._get_best_family(None, find_unused_port()) - proc = spawn_python('-u', '-m', 'http.server', str(port), '-b', bind, + proc = spawn_python('-u', '-m', 'http.server', '--tls-cert', self.tls_cert, '--tls-key', self.tls_key, '--tls-password-file', self.tls_password_file, - bufsize=1, text=True) + text=True) self.addCleanup(kill_python, proc) self.addCleanup(proc.terminate) - self.assertTrue(self.wait_for_server(proc, 'https', port, bind)) + bind, port = self.wait_for_server(proc, 'https') + self.assertIsNotNone(bind) + self.assertIsNotNone(port) url = f'https://{bind}:{port}/{self.served_file_name}' res = self.fetch_file(url, context=self.get_ssl_context()) self.assertEqual(res, self.served_data) From b189d061f42fd5fec0c9e6d9ff137e47f214070b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 19 May 2025 22:33:36 +0200 Subject: [PATCH 03/12] only lookup a suitable address --- Lib/test/test_httpservers.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index d60abff5b000a6..6a8dca64e64c68 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -35,6 +35,7 @@ is_apple, import_helper, os_helper, threading_helper ) from test.support.script_helper import kill_python, spawn_python +from test.support.socket_helper import find_unused_port try: import ssl @@ -1490,7 +1491,7 @@ def parse_cli_output(self, output): return None, None, None return matches.group(1), matches.group(2), int(matches.group(3)) - def wait_for_server(self, proc, protocol): + def wait_for_server(self, proc, protocol, port): """Check the server process output.""" for _ in range(10): line = proc.stdout.readline() @@ -1499,32 +1500,32 @@ def wait_for_server(self, proc, protocol): continue if support.verbose > 1: print(line) - parsed_protocol, host, port = self.parse_cli_output(line) - if protocol == parsed_protocol: - return host, port - return None, None + parsed_protocol, host, parsed_port = self.parse_cli_output(line) + if protocol == parsed_protocol and parsed_port == port: + return host + return None def test_http_client(self): - proc = spawn_python('-u', '-m', 'http.server', text=True) + port = find_unused_port() + proc = spawn_python('-u', '-m', 'http.server', str(port), text=True) self.addCleanup(kill_python, proc) self.addCleanup(proc.terminate) - bind, port = self.wait_for_server(proc, 'http') + bind = self.wait_for_server(proc, 'http', port) self.assertIsNotNone(bind) - self.assertIsNotNone(port) res = self.fetch_file(f'http://{bind}:{port}/{self.served_file_name}') self.assertEqual(res, self.served_data) def test_https_client(self): - proc = spawn_python('-u', '-m', 'http.server', + port = find_unused_port() + proc = spawn_python('-u', '-m', 'http.server', str(port), '--tls-cert', self.tls_cert, '--tls-key', self.tls_key, '--tls-password-file', self.tls_password_file, text=True) self.addCleanup(kill_python, proc) self.addCleanup(proc.terminate) - bind, port = self.wait_for_server(proc, 'https') + bind = self.wait_for_server(proc, 'https', port) self.assertIsNotNone(bind) - self.assertIsNotNone(port) url = f'https://{bind}:{port}/{self.served_file_name}' res = self.fetch_file(url, context=self.get_ssl_context()) self.assertEqual(res, self.served_data) From 5c136f3b44db3935ccdfb26acbefe525afb36050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 19 May 2025 22:35:18 +0200 Subject: [PATCH 04/12] early abort --- Lib/test/test_httpservers.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 6a8dca64e64c68..2ac602fde78eaf 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -1472,14 +1472,6 @@ def setUp(self): f.write(self.tls_password.encode()) self.addCleanup(os_helper.unlink, self.tls_password_file) - @unittest.skipIf(ssl is None, "requires ssl") - def get_ssl_context(self): - context = ssl.create_default_context() - # allow self-signed certificates - context.check_hostname = False - context.verify_mode = ssl.CERT_NONE - return context - def fetch_file(self, path, context=None): req = urllib.request.Request(path, method='GET') with urllib.request.urlopen(req, context=context) as res: @@ -1515,7 +1507,13 @@ def test_http_client(self): res = self.fetch_file(f'http://{bind}:{port}/{self.served_file_name}') self.assertEqual(res, self.served_data) + @unittest.skipIf(ssl is None, "requires ssl") def test_https_client(self): + context = ssl.create_default_context() + # allow self-signed certificates + context.check_hostname = False + context.verify_mode = ssl.CERT_NONE + port = find_unused_port() proc = spawn_python('-u', '-m', 'http.server', str(port), '--tls-cert', self.tls_cert, @@ -1527,7 +1525,7 @@ def test_https_client(self): bind = self.wait_for_server(proc, 'https', port) self.assertIsNotNone(bind) url = f'https://{bind}:{port}/{self.served_file_name}' - res = self.fetch_file(url, context=self.get_ssl_context()) + res = self.fetch_file(url, context=context) self.assertEqual(res, self.served_data) From bcef30f1a86d8410ed3009a4a7ba4e81f203f72c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 19 May 2025 22:36:02 +0200 Subject: [PATCH 05/12] docstring --- Lib/test/test_httpservers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 2ac602fde78eaf..f2932f1c4bfa74 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -1484,7 +1484,7 @@ def parse_cli_output(self, output): return matches.group(1), matches.group(2), int(matches.group(3)) def wait_for_server(self, proc, protocol, port): - """Check the server process output.""" + """Extract the server bind address once it has been started.""" for _ in range(10): line = proc.stdout.readline() if not line: From 529b4095e26b1ba5a516e9fdd3d5c0d082f4ac1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 19 May 2025 22:52:00 +0200 Subject: [PATCH 06/12] make the runtime test linux-specific --- Lib/test/test_httpservers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index f2932f1c4bfa74..d622d117385ff0 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -1455,6 +1455,7 @@ def test_unknown_flag(self, _): self.assertIn('error', stderr.getvalue()) +@unittest.skipUnless(sys.platform == 'linux', 'Linux-specific test') class CommandLineRunTimeTestCase(unittest.TestCase): served_data = os.urandom(32) served_file_name = 'served_filename' From 19e497277288002265ab719aa258227c94c440b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Tue, 20 May 2025 00:29:29 +0200 Subject: [PATCH 07/12] take 2 --- Lib/test/test_httpservers.py | 45 ++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 40a8610565a4d2..db326f7d62f4b9 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -21,6 +21,7 @@ import html import http, http.client import urllib.parse +import urllib.request import tempfile import time import datetime @@ -33,6 +34,8 @@ from test.support import ( is_apple, import_helper, os_helper, threading_helper ) +from test.support.script_helper import kill_python, spawn_python +from test.support.socket_helper import find_unused_port try: import ssl @@ -1452,23 +1455,22 @@ def test_unknown_flag(self, _): self.assertIn('error', stderr.getvalue()) -@unittest.skipUnless(sys.platform == 'linux', 'Linux-specific test') class CommandLineRunTimeTestCase(unittest.TestCase): served_data = os.urandom(32) - served_file_name = 'served_filename' + served_filename = 'served_filename' tls_cert = certdata_file('ssl_cert.pem') tls_key = certdata_file('ssl_key.pem') - tls_password = 'somepass' + tls_password = b'somepass' + tls_password_file = 'ssl_key_password' def setUp(self): super().setUp() - with open(self.served_file_name, 'wb') as f: + server_dir_context = os_helper.temp_cwd() + server_dir = self.enterContext(server_dir_context) + with open(self.served_filename, 'wb') as f: f.write(self.served_data) - self.addCleanup(os_helper.unlink, self.served_file_name) - self.tls_password_file = tempfile.mktemp() with open(self.tls_password_file, 'wb') as f: - f.write(self.tls_password.encode()) - self.addCleanup(os_helper.unlink, self.tls_password_file) + f.write(self.tls_password) def fetch_file(self, path, context=None): req = urllib.request.Request(path, method='GET') @@ -1483,26 +1485,25 @@ def parse_cli_output(self, output): def wait_for_server(self, proc, protocol, port): """Extract the server bind address once it has been started.""" - for _ in range(10): - line = proc.stdout.readline() - if not line: - time.sleep(0.5) - continue - if support.verbose > 1: - print(line) - parsed_protocol, host, parsed_port = self.parse_cli_output(line) - if protocol == parsed_protocol and parsed_port == port: - return host + line = proc.stdout.readline() + if support.verbose: + print() + print('python -m http.server: ', line, end='') + parsed_protocol, host, parsed_port = self.parse_cli_output(line) + if protocol == parsed_protocol and parsed_port == port: + return host + print("failed to start HTTP(s) server. Output was:", repr(line)) return None def test_http_client(self): port = find_unused_port() - proc = spawn_python('-u', '-m', 'http.server', str(port), text=True) + proc = spawn_python('-u', '-m', 'http.server', str(port), + bufsize=1, text=True) self.addCleanup(kill_python, proc) self.addCleanup(proc.terminate) bind = self.wait_for_server(proc, 'http', port) self.assertIsNotNone(bind) - res = self.fetch_file(f'http://{bind}:{port}/{self.served_file_name}') + res = self.fetch_file(f'http://{bind}:{port}/{self.served_filename}') self.assertEqual(res, self.served_data) @unittest.skipIf(ssl is None, "requires ssl") @@ -1517,12 +1518,12 @@ def test_https_client(self): '--tls-cert', self.tls_cert, '--tls-key', self.tls_key, '--tls-password-file', self.tls_password_file, - text=True) + bufsize=1, text=True) self.addCleanup(kill_python, proc) self.addCleanup(proc.terminate) bind = self.wait_for_server(proc, 'https', port) self.assertIsNotNone(bind) - url = f'https://{bind}:{port}/{self.served_file_name}' + url = f'https://{bind}:{port}/{self.served_filename}' res = self.fetch_file(url, context=context) self.assertEqual(res, self.served_data) From 6a1e821872274352837995a093592c5b88c95f7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Tue, 20 May 2025 00:49:13 +0200 Subject: [PATCH 08/12] more debug info --- Lib/test/test_httpservers.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index db326f7d62f4b9..3958ade8104581 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -1478,21 +1478,22 @@ def fetch_file(self, path, context=None): return res.read() def parse_cli_output(self, output): - matches = re.search(r'\((https?)://([^/:]+):(\d+)/?\)', output) + matches = re.search(r'\((https?)://(\[::\]|[^/:]+):(\d+)/?\)', output) if matches is None: return None, None, None return matches.group(1), matches.group(2), int(matches.group(3)) def wait_for_server(self, proc, protocol, port): """Extract the server bind address once it has been started.""" - line = proc.stdout.readline() + line = proc.stdout.readline().strip() if support.verbose: print() - print('python -m http.server: ', line, end='') + print('python -m http.server: ', line) parsed_protocol, host, parsed_port = self.parse_cli_output(line) if protocol == parsed_protocol and parsed_port == port: return host - print("failed to start HTTP(s) server. Output was:", repr(line)) + print("failed to start HTTP(s) server. Output was:") + print("\n".join([line, proc.stdout.readline().rstrip()])) return None def test_http_client(self): From 368d70921a4eefc4ef9a706827b1a969c6a78162 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Tue, 20 May 2025 00:59:37 +0200 Subject: [PATCH 09/12] use 'localhost' --- Lib/test/test_httpservers.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 3958ade8104581..931ce8f197ee16 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -1492,18 +1492,18 @@ def wait_for_server(self, proc, protocol, port): parsed_protocol, host, parsed_port = self.parse_cli_output(line) if protocol == parsed_protocol and parsed_port == port: return host - print("failed to start HTTP(s) server. Output was:") - print("\n".join([line, proc.stdout.readline().rstrip()])) return None def test_http_client(self): port = find_unused_port() - proc = spawn_python('-u', '-m', 'http.server', str(port), + proc = spawn_python('-u', '-m', 'http.server', + str(port), '-b', 'localhost', bufsize=1, text=True) self.addCleanup(kill_python, proc) self.addCleanup(proc.terminate) bind = self.wait_for_server(proc, 'http', port) self.assertIsNotNone(bind) + # localhost may be redirected to something else for whatever reason res = self.fetch_file(f'http://{bind}:{port}/{self.served_filename}') self.assertEqual(res, self.served_data) @@ -1514,8 +1514,9 @@ def test_https_client(self): context.check_hostname = False context.verify_mode = ssl.CERT_NONE - port = find_unused_port() - proc = spawn_python('-u', '-m', 'http.server', str(port), + bind, port = 'localhost', find_unused_port() + proc = spawn_python('-u', '-m', 'http.server', + str(port), '-b', 'localhost', '--tls-cert', self.tls_cert, '--tls-key', self.tls_key, '--tls-password-file', self.tls_password_file, @@ -1524,6 +1525,7 @@ def test_https_client(self): self.addCleanup(proc.terminate) bind = self.wait_for_server(proc, 'https', port) self.assertIsNotNone(bind) + # localhost may be redirected to something else for whatever reason url = f'https://{bind}:{port}/{self.served_filename}' res = self.fetch_file(url, context=context) self.assertEqual(res, self.served_data) From a46c9c22691c667335a411647bce9fed5de7fb4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Tue, 20 May 2025 01:05:47 +0200 Subject: [PATCH 10/12] automatic deduction --- Lib/test/test_httpservers.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 931ce8f197ee16..ef48594730adcd 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -1478,10 +1478,10 @@ def fetch_file(self, path, context=None): return res.read() def parse_cli_output(self, output): - matches = re.search(r'\((https?)://(\[::\]|[^/:]+):(\d+)/?\)', output) + matches = re.search(r'Serving (HTTP|HTTPS) on (.+) port (\d+)', output) if matches is None: return None, None, None - return matches.group(1), matches.group(2), int(matches.group(3)) + return matches.group(1).lower(), matches.group(2), int(matches.group(3)) def wait_for_server(self, proc, protocol, port): """Extract the server bind address once it has been started.""" @@ -1496,8 +1496,7 @@ def wait_for_server(self, proc, protocol, port): def test_http_client(self): port = find_unused_port() - proc = spawn_python('-u', '-m', 'http.server', - str(port), '-b', 'localhost', + proc = spawn_python('-u', '-m', 'http.server', str(port), bufsize=1, text=True) self.addCleanup(kill_python, proc) self.addCleanup(proc.terminate) @@ -1514,9 +1513,8 @@ def test_https_client(self): context.check_hostname = False context.verify_mode = ssl.CERT_NONE - bind, port = 'localhost', find_unused_port() - proc = spawn_python('-u', '-m', 'http.server', - str(port), '-b', 'localhost', + port = find_unused_port() + proc = spawn_python('-u', '-m', 'http.server', str(port), '--tls-cert', self.tls_cert, '--tls-key', self.tls_key, '--tls-password-file', self.tls_password_file, @@ -1525,7 +1523,6 @@ def test_https_client(self): self.addCleanup(proc.terminate) bind = self.wait_for_server(proc, 'https', port) self.assertIsNotNone(bind) - # localhost may be redirected to something else for whatever reason url = f'https://{bind}:{port}/{self.served_filename}' res = self.fetch_file(url, context=context) self.assertEqual(res, self.served_data) From 4ad442ad89a056cec383f2ec840a5dc847752b37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Tue, 20 May 2025 01:13:58 +0200 Subject: [PATCH 11/12] use 127.0.0.1 for HTTPS test --- Lib/test/test_httpservers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index ef48594730adcd..9751bef1189593 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -1513,8 +1513,9 @@ def test_https_client(self): context.check_hostname = False context.verify_mode = ssl.CERT_NONE - port = find_unused_port() + bind, port = '127.0.0.1', find_unused_port() proc = spawn_python('-u', '-m', 'http.server', str(port), + '-b', bind, '--tls-cert', self.tls_cert, '--tls-key', self.tls_key, '--tls-password-file', self.tls_password_file, From f735ee5aba1ff5995be994945016766d40d9c299 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Tue, 20 May 2025 01:25:44 +0200 Subject: [PATCH 12/12] reuse 127.0.0.1 everywhere??? --- Lib/test/test_httpservers.py | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 9751bef1189593..2548a7c5f292f0 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -1478,31 +1478,26 @@ def fetch_file(self, path, context=None): return res.read() def parse_cli_output(self, output): - matches = re.search(r'Serving (HTTP|HTTPS) on (.+) port (\d+)', output) - if matches is None: + match = re.search(r'Serving (HTTP|HTTPS) on (.+) port (\d+)', output) + if match is None: return None, None, None - return matches.group(1).lower(), matches.group(2), int(matches.group(3)) + return match.group(1).lower(), match.group(2), int(match.group(3)) - def wait_for_server(self, proc, protocol, port): - """Extract the server bind address once it has been started.""" + def wait_for_server(self, proc, protocol, bind, port): + """Check that the server has been successfully started.""" line = proc.stdout.readline().strip() if support.verbose: print() print('python -m http.server: ', line) - parsed_protocol, host, parsed_port = self.parse_cli_output(line) - if protocol == parsed_protocol and parsed_port == port: - return host - return None + return self.parse_cli_output(line) == (protocol, bind, port) def test_http_client(self): - port = find_unused_port() - proc = spawn_python('-u', '-m', 'http.server', str(port), + bind, port = '127.0.0.1', find_unused_port() + proc = spawn_python('-u', '-m', 'http.server', str(port), '-b', bind, bufsize=1, text=True) self.addCleanup(kill_python, proc) self.addCleanup(proc.terminate) - bind = self.wait_for_server(proc, 'http', port) - self.assertIsNotNone(bind) - # localhost may be redirected to something else for whatever reason + self.assertTrue(self.wait_for_server(proc, 'http', bind, port)) res = self.fetch_file(f'http://{bind}:{port}/{self.served_filename}') self.assertEqual(res, self.served_data) @@ -1514,16 +1509,14 @@ def test_https_client(self): context.verify_mode = ssl.CERT_NONE bind, port = '127.0.0.1', find_unused_port() - proc = spawn_python('-u', '-m', 'http.server', str(port), - '-b', bind, + proc = spawn_python('-u', '-m', 'http.server', str(port), '-b', bind, '--tls-cert', self.tls_cert, '--tls-key', self.tls_key, '--tls-password-file', self.tls_password_file, bufsize=1, text=True) self.addCleanup(kill_python, proc) self.addCleanup(proc.terminate) - bind = self.wait_for_server(proc, 'https', port) - self.assertIsNotNone(bind) + self.assertTrue(self.wait_for_server(proc, 'https', bind, port)) url = f'https://{bind}:{port}/{self.served_filename}' res = self.fetch_file(url, context=context) self.assertEqual(res, self.served_data)