|
5 | 5 | """ |
6 | 6 |
|
7 | 7 | from http.server import BaseHTTPRequestHandler, HTTPServer, HTTPSServer, \ |
8 | | - SimpleHTTPRequestHandler, ThreadingHTTPServer |
| 8 | + SimpleHTTPRequestHandler |
9 | 9 | from http import server, HTTPStatus |
10 | 10 |
|
11 | 11 | import contextlib |
@@ -965,82 +965,6 @@ def test_multiple_requests_dont_duplicate_extra_response_headers(self): |
965 | 965 | self.assertEqual(response.status, 200) |
966 | 966 | self.assertEqual(response.getheader("x-test"), 'test-value') |
967 | 967 |
|
968 | | - def test_extra_response_headers_concurrent_requests(self): |
969 | | - N_THREADS = 8 |
970 | | - |
971 | | - with mock.patch.object( |
972 | | - self.request_handler, |
973 | | - "extra_response_headers", |
974 | | - [("x-test", "test-value")], |
975 | | - ): |
976 | | - threaded_server = ThreadingHTTPServer( |
977 | | - ("localhost", 0), self.request_handler |
978 | | - ) |
979 | | - host, port = threaded_server.socket.getsockname() |
980 | | - server_thread = threading.Thread( |
981 | | - target=threaded_server.serve_forever, args=(0.05,), daemon=True |
982 | | - ) |
983 | | - # Clean up the server thread and server resources after the test, |
984 | | - # with a timeout to prevent hanging, even if the finally block fails. |
985 | | - self.addCleanup(server_thread.join, support.SHORT_TIMEOUT) |
986 | | - self.addCleanup(threaded_server.server_close) |
987 | | - self.addCleanup(threaded_server.shutdown) |
988 | | - server_thread.start() |
989 | | - results = [] |
990 | | - errors = [] |
991 | | - lock = threading.Lock() |
992 | | - |
993 | | - def make_request(): |
994 | | - try: |
995 | | - conn = http.client.HTTPConnection(host, port, timeout=15) |
996 | | - conn.request("GET", self.base_url + "/") |
997 | | - resp = conn.getresponse() |
998 | | - resp.read() |
999 | | - with lock: |
1000 | | - results.append((resp.status, resp.getheaders())) |
1001 | | - conn.close() |
1002 | | - except Exception as e: |
1003 | | - # Catch exceptions in child threads and save them. |
1004 | | - with lock: |
1005 | | - errors.append(e) |
1006 | | - |
1007 | | - try: |
1008 | | - threads = [ |
1009 | | - threading.Thread(target=make_request) |
1010 | | - for _ in range(N_THREADS) |
1011 | | - ] |
1012 | | - for t in threads: |
1013 | | - t.start() |
1014 | | - for t in threads: |
1015 | | - t.join(timeout=15) |
1016 | | - finally: |
1017 | | - threaded_server.shutdown() |
1018 | | - threaded_server.server_close() |
1019 | | - server_thread.join(timeout=support.SHORT_TIMEOUT) |
1020 | | - |
1021 | | - # Only raise errors in the main thread, just the first one. |
1022 | | - if errors: |
1023 | | - raise errors[0] |
1024 | | - |
1025 | | - self.assertEqual(len(results), N_THREADS) |
1026 | | - for status, headers in results: |
1027 | | - self.assertEqual(status, 200) |
1028 | | - # Server, Date, Content-type, Content-Length, x-test |
1029 | | - self.assertEqual(len(headers), 5) |
1030 | | - header_map = {k.lower(): v for k, v in headers} |
1031 | | - self.assertIn("server", header_map) |
1032 | | - self.assertIn("date", header_map) |
1033 | | - self.assertTrue( |
1034 | | - header_map["content-type"].startswith("text/html") |
1035 | | - ) |
1036 | | - self.assertGreater(int(header_map["content-length"]), 0) |
1037 | | - # x-test must appear exactly once, not duplicated |
1038 | | - x_test_values = [ |
1039 | | - v for k, v in headers if k.lower() == "x-test" |
1040 | | - ] |
1041 | | - self.assertEqual(x_test_values, ["test-value"]) |
1042 | | - |
1043 | | - |
1044 | 968 |
|
1045 | 969 | class SocketlessRequestHandler(SimpleHTTPRequestHandler): |
1046 | 970 | def __init__(self, directory=None): |
|
0 commit comments