Skip to content

Commit 5f1fb94

Browse files
committed
gh-135056: Factor out a _make_server function from test function.
1 parent d317cc2 commit 5f1fb94

File tree

2 files changed

+45
-29
lines changed

2 files changed

+45
-29
lines changed

Lib/http/server.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -977,25 +977,34 @@ def _get_best_family(*address):
977977
return family, sockaddr
978978

979979

980-
def test(HandlerClass=BaseHTTPRequestHandler,
980+
def _make_server(HandlerClass=BaseHTTPRequestHandler,
981981
ServerClass=ThreadingHTTPServer,
982982
protocol="HTTP/1.0", port=8000, bind=None,
983983
tls_cert=None, tls_key=None, tls_password=None):
984-
"""Test the HTTP request handler class.
985-
986-
This runs an HTTP server on port 8000 (or the port argument).
987-
988-
"""
989984
ServerClass.address_family, addr = _get_best_family(bind, port)
990985
HandlerClass.protocol_version = protocol
991986

992987
if tls_cert:
993-
server = ServerClass(addr, HandlerClass, certfile=tls_cert,
988+
return ServerClass(addr, HandlerClass, certfile=tls_cert,
994989
keyfile=tls_key, password=tls_password)
995990
else:
996-
server = ServerClass(addr, HandlerClass)
991+
return ServerClass(addr, HandlerClass)
992+
993+
994+
def test(HandlerClass=BaseHTTPRequestHandler,
995+
ServerClass=ThreadingHTTPServer,
996+
protocol="HTTP/1.0", port=8000, bind=None,
997+
tls_cert=None, tls_key=None, tls_password=None):
998+
"""Test the HTTP request handler class.
999+
1000+
This runs an HTTP server on port 8000 (or the port argument).
9971001
998-
with server as httpd:
1002+
"""
1003+
with _make_server(
1004+
HandlerClass=HandlerClass, ServerClass=ServerClass,
1005+
protocol=protocol, port=port, bind=bind, tls_cert=tls_cert,
1006+
tls_key=tls_key, tls_password=tls_password
1007+
) as httpd:
9991008
host, port = httpd.socket.getsockname()[:2]
10001009
url_host = f'[{host}]' if ':' in host else host
10011010
protocol = 'HTTPS' if tls_cert else 'HTTP'
@@ -1008,7 +1017,6 @@ def test(HandlerClass=BaseHTTPRequestHandler,
10081017
except KeyboardInterrupt:
10091018
print("\nKeyboard interrupt received, exiting.")
10101019
sys.exit(0)
1011-
return server
10121020

10131021

10141022
def _main(args=None):
@@ -1077,7 +1085,7 @@ class HTTPSDualStackServer(DualStackServerMixin, ThreadingHTTPSServer):
10771085

10781086
ServerClass = HTTPSDualStackServer if args.tls_cert else HTTPDualStackServer
10791087

1080-
return test(
1088+
test(
10811089
HandlerClass=SimpleHTTPRequestHandler,
10821090
ServerClass=ServerClass,
10831091
port=args.port,

Lib/test/test_httpservers.py

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1489,25 +1489,33 @@ def test_unknown_flag(self, _):
14891489
self.assertEqual(stdout.getvalue(), '')
14901490
self.assertIn('error', stderr.getvalue())
14911491

1492-
def test_response_headers_arg(self):
1493-
with mock.patch.object(HTTPServer, 'serve_forever'):
1494-
httpd = server._main(
1495-
['-H', 'Set-Cookie', 'k=v', '-H', 'Set-Cookie', 'k2=v2', '8080']
1492+
@mock.patch('http.server._make_server', wraps=server._make_server)
1493+
@mock.patch.object(HTTPServer, 'serve_forever')
1494+
def test_response_headers_arg(self, _, mock_make_server):
1495+
server._main(
1496+
['-H', 'Set-Cookie', 'k=v', '-H', 'Set-Cookie', 'k2=v2', '8080']
1497+
)
1498+
# Get an instance of the server / RequestHandler by using
1499+
# the spied call args, then calling _make_server with them.
1500+
args, kwargs = mock_make_server.call_args
1501+
httpd = server._make_server(*args, **kwargs)
1502+
1503+
# Ensure the RequestHandler class is passed the correct response
1504+
# headers
1505+
request_handler_class = httpd.RequestHandlerClass
1506+
with mock.patch.object(
1507+
request_handler_class, '__init__'
1508+
) as mock_handler_init:
1509+
mock_handler_init.return_value = None
1510+
# finish_request instantiates a request handler class,
1511+
# ensure response_headers are passed to it
1512+
httpd.finish_request(mock.Mock(), '127.0.0.1')
1513+
mock_handler_init.assert_called_once_with(
1514+
mock.ANY, mock.ANY, mock.ANY, directory=mock.ANY,
1515+
response_headers=[
1516+
['Set-Cookie', 'k=v'], ['Set-Cookie', 'k2=v2']
1517+
]
14961518
)
1497-
request_handler_class = httpd.RequestHandlerClass
1498-
with mock.patch.object(
1499-
request_handler_class, '__init__'
1500-
) as mock_handler_init:
1501-
mock_handler_init.return_value = None
1502-
# finish_request instantiates a request handler class,
1503-
# ensure response_headers are passed to it
1504-
httpd.finish_request(mock.Mock(), '127.0.0.1')
1505-
mock_handler_init.assert_called_once_with(
1506-
mock.ANY, mock.ANY, mock.ANY, directory=mock.ANY,
1507-
response_headers=[
1508-
['Set-Cookie', 'k=v'], ['Set-Cookie', 'k2=v2']
1509-
]
1510-
)
15111519

15121520

15131521
class CommandLineRunTimeTestCase(unittest.TestCase):

0 commit comments

Comments
 (0)