From 299e7ffbeec25e8ca6fec0205785a1130b71c039 Mon Sep 17 00:00:00 2001 From: Olli Paakkunainen Date: Mon, 1 Mar 2021 19:48:15 +0900 Subject: [PATCH] Fix settings context leaks on exception --- src/zeep/settings.py | 17 +++++++++-------- tests/test_settings.py | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/zeep/settings.py b/src/zeep/settings.py index d3241bfc8..2a1c329d0 100644 --- a/src/zeep/settings.py +++ b/src/zeep/settings.py @@ -65,14 +65,15 @@ def __call__(self, **options): current[key] = getattr(self, key) setattr(self._tls, key, value) - yield - - for key, value in current.items(): - default = getattr(self, key) - if value == default: - delattr(self._tls, key) - else: - setattr(self._tls, key, value) + try: + yield + finally: + for key, value in current.items(): + default = getattr(self, key) + if value == default: + delattr(self._tls, key) + else: + setattr(self._tls, key, value) def __getattribute__(self, key): if key != "_tls" and hasattr(self._tls, key): diff --git a/tests/test_settings.py b/tests/test_settings.py index 87bbf323f..8a8005418 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -13,3 +13,17 @@ def test_settings_set_context_raw_response(): assert settings.raw_response is True # Check that the original value returned assert settings.raw_response is False + + +def test_settings_set_context_with_exception(): + settings = Settings() + + assert settings.raw_response is False + try: + with settings(raw_response=True): + assert settings.raw_response is True + raise RuntimeError + except RuntimeError: + pass + # Check that the original value returned + assert settings.raw_response is False