From 66a8235471e881c937121dbdd89501222de74f34 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Mon, 22 Feb 2021 23:48:32 +0100 Subject: [PATCH 3/3] tests: chain webtest 500 exceptions to the internal exception (#51327) --- tests/utilities.py | 12 ++++++++++++ wcs/qommon/publisher.py | 19 ++++++++++++------- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/tests/utilities.py b/tests/utilities.py index effda0cd..e2521358 100644 --- a/tests/utilities.py +++ b/tests/utilities.py @@ -71,6 +71,7 @@ def create_temporary_pub(sql_mode=False, templates_mode=False, lazy_mode=False): ) compat.CompatWcsPublisher.cronjobs = None pub = compat.CompatWcsPublisher.create_publisher() + pub.do_log_internal_error = False # allow saving the user pub.app_dir = os.path.join(APP_DIR, 'example.net') pub.site_charset = 'utf-8' @@ -222,6 +223,17 @@ def force_connections_close(): pass +class TestApp(TestApp): + def do_request(self, *args, **kwargs): + try: + return super().do_request(*args, **kwargs) + except Exception as e: + pub = get_publisher() + if pub.last_exc_info: + raise e from pub.last_exc_info[1] + raise + + def get_app(pub, https=False): extra_environ = {'HTTP_HOST': 'example.net', 'REMOTE_ADDR': '127.0.0.1'} if https: diff --git a/wcs/qommon/publisher.py b/wcs/qommon/publisher.py index 86e84954..54f32912 100644 --- a/wcs/qommon/publisher.py +++ b/wcs/qommon/publisher.py @@ -99,6 +99,9 @@ class QommonPublisher(Publisher, object): app_dir = None + last_exc_info = None + do_log_internal_error = True + @property def form_tokens_dir(self): return os.path.join(self.app_dir, 'form_tokens') @@ -269,7 +272,7 @@ class QommonPublisher(Publisher, object): original_response = request.response request.response = HTTPResponse() - (exc_type, exc_value, tb) = sys.exc_info() + self.last_exc_info = (exc_type, exc_value, tb) = sys.exc_info() if exc_type is NotImplementedError: get_response().set_header('Content-Type', 'text/html') # set back content-type @@ -307,12 +310,13 @@ class QommonPublisher(Publisher, object): request.response.set_header('Content-Type', 'text/plain') error_page = plain_error_msg - try: - self.logger.log_internal_error(error_summary, plain_error_msg) - except socket.error: - # wilr happen if there is no mail server available and exceptions - # were configured to be mailed. - pass + if self.log_internal_error: + try: + self.logger.log_internal_error(error_summary, plain_error_msg) + except socket.error: + # will happen if there is no mail server available and exceptions + # were configured to be mailed. + pass if exc_type is SystemExit: raise exc_type @@ -724,6 +728,7 @@ class QommonPublisher(Publisher, object): self.cfg = {} def process(self, stdin, env): + self.last_exc_info = None request = HTTPRequest(stdin, env) self.response = self.process_request(request) return self.response -- 2.30.0