8000 gh-131178: fix SSL tests for `http.server` command-line interface by ggqlq · Pull Request #134224 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

gh-131178: fix SSL tests for http.server command-line interface #134224

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 89 commits into from
Closed
Changes from all commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
79db2f2
Add tests for http.server command-line interface
ggqlq Apr 14, 2025
a5e5220
Merge branch 'python:main' into main
ggqlq Apr 15, 2025
2b589bf
add news
ggqlq Apr 15, 2025
e11f8fe
add news
ggqlq Apr 15, 2025
4e008fd
lint
ggqlq Apr 15, 2025
ad76ab1
move a new class into test
ggqlq Apr 16, 2025
5e563d3
Update Lib/http/server.py
ggqlq Apr 16, 2025
86b856e
Update Lib/http/server.py
ggqlq Apr 16, 2025
4d5c2b5
Update Lib/http/server.py
ggqlq Apr 16, 2025
574d6be
Update Lib/http/server.py
ggqlq Apr 16, 2025
c1f3358
Update Lib/http/server.py
ggqlq Apr 16, 2025
01d5fb8
Update Lib/http/server.py
ggqlq Apr 16, 2025
540700f
Update Lib/http/server.py
ggqlq Apr 16, 2025
1bdb0ec
Update Lib/test/test_httpservers.py
ggqlq Apr 16, 2025
38aea9e
Update Lib/test/test_httpservers.py
ggqlq Apr 16, 2025
3277327
update
ggqlq Apr 16, 2025
771263d
Update Lib/http/server.py
ggqlq Apr 16, 2025
3679a76
remove news
ggqlq Apr 16, 2025
6c58710
Update Lib/test/test_httpservers.py
ggqlq Apr 17, 2025
3e4a6aa
Update Lib/test/test_httpservers.py
ggqlq Apr 17, 2025
8e93c5d
Update Lib/test/test_httpservers.py
ggqlq Apr 17, 2025
439c36d
add no argument test and redirect stderr
ggqlq Apr 17, 2025
7e8aedc
wrap some lines to fit into 79 characters
ggqlq Apr 17, 2025
8f3e7ad
wrap some lines to fit into 79 characters(2)
ggqlq Apr 17, 2025
85cb099
Update Lib/test/test_httpservers.py
ggqlq Apr 18, 2025
9417864
Update Lib/test/test_httpservers.py
ggqlq Apr 18, 2025
a5a7d8c
Update Lib/test/test_httpservers.py
ggqlq Apr 18, 2025
a35e0d6
Update Lib/test/test_httpservers.py
ggqlq Apr 18, 2025
e2266c0
Update Lib/test/test_httpservers.py
ggqlq Apr 18, 2025
b4f9e72
Update Lib/test/test_httpservers.py
ggqlq Apr 18, 2025
a61b5b1
Update Lib/test/test_httpservers.py
ggqlq Apr 18, 2025
fd70932
update
ggqlq Apr 18, 2025
348e256
update
ggqlq Apr 19, 2025
4c315b0
update(2)
ggqlq Apr 19, 2025
a57b959
add cli test
ggqlq May 5, 2025
b627e02
add cli test(1)
ggqlq May 5, 2025
41065c2
add cli test(2)
ggqlq May 7, 2025
e7b7dff
Merge branch 'main' into main
ggqlq May 9, 2025
cbda832
move runtime tests into a new class
ggqlq May 9, 2025
86847e8
update
ggqlq May 10, 2025
7eb1572
Merge branch 'main' into main
ggqlq May 10, 2025
d504760
update
ggqlq May 10, 2025
811d86d
remove test_cli_flag function
ggqlq May 16, 2025
e5df251
Update Lib/test/test_httpservers.py
ggqlq May 16, 2025
1843c80
Update Lib/test/test_httpservers.py
ggqlq May 16, 2025
8e8b755
Update Lib/test/test_httpservers.py
ggqlq May 16, 2025
2f742d9
Update Lib/test/test_httpservers.py
ggqlq May 16, 2025
b5c5ab0
Update Lib/test/test_httpservers.py
ggqlq May 16, 2025
05aea06
Update Lib/test/test_httpservers.py
ggqlq May 16, 2025
333a761
split stdout and stderr, remove output check after self.assertRaises(…
ggqlq May 16, 2025
4304354
split tls tests
ggqlq May 16, 2025
6c4c134
Update Lib/test/test_httpservers.py
ggqlq May 16, 2025
7b3bb1d
Update Lib/test/test_httpservers.py
ggqlq May 16, 2025
eed4228
Update Lib/test/test_httpservers.py
ggqlq May 16, 2025
7c1713e
Update Lib/test/test_httpservers.py
ggqlq May 16, 2025
a34fa51
Update Lib/test/test_httpservers.py
ggqlq May 17, 2025
8f73c22
make invoke_httpd function return a pair
ggqlq May 16, 2025
2daf3f8
rename vars in wait_for_server function
ggqlq May 17, 2025
1c67654
use call_args = self.args | dict(...)
ggqlq May 17, 2025
9639219
rename 'random.bin' as 'served_filename'
ggqlq May 17, 2025
4156e78
fix indentation in test_missing_tls_cert_flag
ggqlq May 17, 2025
0522a17
add docstring for wait_for_server
ggqlq May 17, 2025
2c9612b
Merge branch 'main' into main
ggqlq May 17, 2025
1b5b3f8
capture the output outside invoke_httpd
ggqlq May 17, 2025
5637928
update terminate processes in test_http_client and test_https_client
ggqlq May 17, 2025
4a6b779
Merge branch 'main' into main
ggqlq May 17, 2025 8000
6beb7f1
Update Lib/test/test_httpservers.py
ggqlq May 19, 2025
4c25dcd
Update Lib/test/test_httpservers.py
ggqlq May 19, 2025
d67ee16
Update Lib/test/test_httpservers.py
ggqlq May 19, 2025
d5914dc
Update Lib/test/test_httpservers.py
ggqlq May 19, 2025
4d0154e
Update Lib/test/test_httpservers.py
ggqlq May 19, 2025
2ba7001
Update Lib/test/test_httpservers.py
ggqlq May 19, 2025
0c37216
Update Lib/test/test_httpservers.py
ggqlq May 19, 2025
6938dd9
Update Lib/test/test_httpservers.py
ggqlq May 19, 2025
59be989
Update Lib/test/test_httpservers.py
ggqlq May 19, 2025
7a8d6f1
rename random_... as served_... in the CommandLineRunTimeTestCase class
ggqlq May 19, 2025
921739c
Update Lib/test/test_httpservers.py
ggqlq May 19, 2025
6d9981f
Update Lib/test/test_httpservers.py
ggqlq May 19, 2025
1d42f2c
Update Lib/test/test_httpservers.py
picnixz May 19, 2025
d0fe4a6
fix buildbot failure
ggqlq May 19, 2025
b90e980
Merge branch 'main' into main
ggqlq May 19, 2025
fc741e9
pass ssl context by argument
ggqlq May 19, 2025
0e0fb7a
Merge branch 'main' into main
picnixz May 19, 2025
e818bb6
Merge branch 'main' into main
picnixz May 19, 2025
9192281
Update test_httpservers.py
picnixz May 19, 2025
bd42827
fix tests
picnixz May 19, 2025
5c6f022
Update Lib/test/test_httpservers.py
picnixz May 19, 2025
4dfcfe3
Update Lib/test/test_httpservers.py
picnixz May 19, 2025
7123976
now it should work
picnixz May 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 25 additions & 33 deletions Lib/test/test_httpservers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -1472,11 +1471,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()
Expand All @@ -1487,51 +1490,40 @@ 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:
line = proc.stdout.readline()
if not line:
time.sleep(0.1)
timeout -= 1
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
def wait_for_server(self, proc, protocol):
"""Check the server process output."""
line = proc.stdout.readline()
if line:
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):
port = find_unused_port()
bind = '127.0.0.1'
proc = spawn_python('-u', '-m', 'http.server', str(port), '-b', bind,
bufsize=1, text=True)
proc = spawn_python('-u', '-m', 'http.server', bufsize=1, 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):
port = find_unused_port()
bind = '127.0.0.1'
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)
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}')
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)


Expand Down
Loading
0