diff --git a/patroni/api.py b/patroni/api.py index c596e0ec..d24bae96 100644 --- a/patroni/api.py +++ b/patroni/api.py @@ -664,6 +664,11 @@ class RestApiServer(ThreadingMixIn, HTTPServer, Thread): newsock = (sock, newsock) return newsock, addr + def shutdown_request(self, request): + if isinstance(request, tuple): + _, request = request # SSLSocket + return super(RestApiServer, self).shutdown_request(request) + def reload_config(self, config): if 'listen' not in config: # changing config in runtime raise ValueError('Can not find "restapi.listen" config') diff --git a/tests/test_api.py b/tests/test_api.py index 19c76859..a382fa6f 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -488,3 +488,16 @@ class TestRestApiServer(unittest.TestCase): mock_accept.return_value = (newsock, '2') self.srv.socket = Mock() self.assertEqual(self.srv.get_request(), ((self.srv.socket, newsock), '2')) + + @patch.object(MockRestApiServer, 'process_request', Mock(side_effect=RuntimeError)) + def test_process_request_error(self): + mock_address = ('127.0.0.1', 55555) + mock_socket = Mock() + mock_ssl_socket = (Mock(), Mock()) + for mock_request in (mock_socket, mock_ssl_socket): + with patch.object( + MockRestApiServer, + 'get_request', + Mock(return_value=(mock_request, mock_address)) + ): + self.srv._handle_request_noblock()