|
7 | 7 | import xmlrpc.client as xmlrpclib |
8 | 8 | import xmlrpc.server |
9 | 9 | import http.client |
| 10 | +import http, http.server |
10 | 11 | import socket |
11 | 12 | import os |
12 | 13 | import re |
@@ -244,6 +245,42 @@ def test_ssl_presence(self): |
244 | 245 | except OSError: |
245 | 246 | self.assertTrue(has_ssl) |
246 | 247 |
|
| 248 | + @unittest.skipUnless(threading, "Threading required for this test.") |
| 249 | + def test_keepalive_disconnect(self): |
| 250 | + class RequestHandler(http.server.BaseHTTPRequestHandler): |
| 251 | + protocol_version = "HTTP/1.1" |
| 252 | + handled = False |
| 253 | + |
| 254 | + def do_POST(self): |
| 255 | + length = int(self.headers.get("Content-Length")) |
| 256 | + self.rfile.read(length) |
| 257 | + if self.handled: |
| 258 | + self.close_connection = True |
| 259 | + return |
| 260 | + response = xmlrpclib.dumps((5,), methodresponse=True) |
| 261 | + response = response.encode() |
| 262 | + self.send_response(http.HTTPStatus.OK) |
| 263 | + self.send_header("Content-Length", len(response)) |
| 264 | + self.end_headers() |
| 265 | + self.wfile.write(response) |
| 266 | + self.handled = True |
| 267 | + self.close_connection = False |
| 268 | + |
| 269 | + def run_server(): |
| 270 | + server.socket.settimeout(float(1)) # Don't hang if client fails |
| 271 | + server.handle_request() # First request and attempt at second |
| 272 | + server.handle_request() # Retried second request |
| 273 | + |
| 274 | + server = http.server.HTTPServer((support.HOST, 0), RequestHandler) |
| 275 | + self.addCleanup(server.server_close) |
| 276 | + thread = threading.Thread(target=run_server) |
| 277 | + thread.start() |
| 278 | + self.addCleanup(thread.join) |
| 279 | + url = "http://{}:{}/".format(*server.server_address) |
| 280 | + with xmlrpclib.ServerProxy(url) as p: |
| 281 | + self.assertEqual(p.method(), 5) |
| 282 | + self.assertEqual(p.method(), 5) |
| 283 | + |
247 | 284 | class HelperTestCase(unittest.TestCase): |
248 | 285 | def test_escape(self): |
249 | 286 | self.assertEqual(xmlrpclib.escape("a&b"), "a&b") |
|
0 commit comments