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)
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: