utils/soap: do not log soap:Fault responses as errors (#71028)
parent
7781a18c53
commit
cd46dc8d97
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue