utils/soap: do not log soap:Fault responses as errors (#71028)
gitea-wip/passerelle/pipeline/head Build started... Details
gitea/passerelle/pipeline/head Something is wrong with the build of this commit Details

This commit is contained in:
Benjamin Dauvergne 2022-11-05 08:08:06 +01:00
parent 7781a18c53
commit cd46dc8d97
4 changed files with 24 additions and 7 deletions

View File

@ -201,9 +201,14 @@ class BaseResource(models.Model):
@property
def requests(self):
if getattr(self, '_requests', None) is None:
self._requests = passerelle.utils.Request(resource=self, logger=self.logger)
self._requests = self.make_requests()
return self._requests
def make_requests(self, **kwargs):
init_kwargs = dict(resource=self, logger=self.logger)
init_kwargs = dict(init_kwargs, **kwargs)
return passerelle.utils.Request(**init_kwargs)
@property
def logging_parameters(self):
resource_type = ContentType.objects.get_for_model(self)

View File

@ -255,10 +255,13 @@ def log_http_request(
class Request(RequestSession):
ADAPTER_REGISTRY = {} # connection pooling
log_requests_errors = True
def __init__(self, *args, **kwargs):
self.logger = kwargs.pop('logger')
self.resource = kwargs.pop('resource', None)
resource_log_requests_errors = getattr(self.resource, 'log_requests_errors', True)
self.log_requests_errors = kwargs.pop('log_requests_errors', resource_log_requests_errors)
timeout = kwargs.pop('timeout', None)
super().__init__(*args, **kwargs)
if self.resource:
@ -359,7 +362,7 @@ class Request(RequestSession):
return response
def log_http_request(self, request, response=None, exception=None, duration=None):
error_log = getattr(self.resource, 'log_requests_errors', True)
error_log = self.log_requests_errors
log_http_request(
self.logger,
request=request,

View File

@ -29,7 +29,7 @@ from passerelle.utils.logging import ignore_loggers
class SOAPError(APIError):
pass
log_error = True
class SOAPServiceUnreachable(SOAPError):
@ -45,6 +45,8 @@ class SOAPServiceUnreachable(SOAPError):
class SOAPFault(SOAPError):
log_error = False
def __init__(self, client, fault):
super().__init__(
f'SOAP service at {client.wsdl.location} returned an error "{fault.message or fault.code}"',
@ -85,8 +87,9 @@ class SOAPClient(Client):
self.api_error = kwargs.pop('api_error', False)
transport_kwargs = kwargs.pop('transport_kwargs', {})
transport_class = getattr(resource, 'soap_transport_class', SOAPTransport)
session = resource.make_requests(log_requests_errors=False)
transport = transport_class(
resource, wsdl_url, session=resource.requests, cache=InMemoryCache(), **transport_kwargs
resource, wsdl_url, session=session, cache=InMemoryCache(), **transport_kwargs
)
super().__init__(wsdl_url, transport=transport, **kwargs)

View File

@ -38,18 +38,24 @@ class BarPlugin(Plugin):
pass
class SpecialSession(requests.Session):
pass
class SOAPResource:
def __init__(self):
self.requests = requests.Session()
self.wsdl_url = WSDL
def make_requests(self, **kwargs):
return SpecialSession()
def test_soap_client():
soap_resource = SOAPResource()
plugins = [FooPlugin, BarPlugin]
client = SOAPClient(soap_resource, plugins=plugins)
assert client.wsdl.location.endswith(WSDL)
assert client.transport.session == soap_resource.requests
assert isinstance(client.transport.session, SpecialSession)
assert client.transport.cache
assert client.plugins == plugins
@ -104,7 +110,7 @@ def test_remove_first_bytes_for_xml(mocked_send, caplog):
soap_resource = SOAPResource()
logger = logging.getLogger('soap_resource')
logger.setLevel(logging.INFO)
soap_resource.requests = Request(logger=logger)
soap_resource.make_requests = lambda **kwargs: Request(logger=logger, **kwargs)
client = SOAPClient(soap_resource)
with pytest.raises(TransportError):