mvantellingen / python-zeep

A Python SOAP client
http://docs.python-zeep.org
Other
1.88k stars 586 forks source link

Problem with namespace support in SOAP 11 Fault node #1254

Open brot opened 3 years ago

brot commented 3 years ago
  1. zeep==4.1.0
  2. It's not a public WSDL so i can't provide it; but it's also not needed to reproduce the bug
  3. Runnable example:

The bug was introduced with the namespace support in SOAP 11 Fault node (https://github.com/mvantellingen/python-zeep/commit/0704fb57e9ca6a571a7ccec067d23fa9d037ae5d). If you add the following lines to the test_soap11_process_error test in tests/test_wsdl_soap.py you are able to reproduce the problem

    responseWithEmptyNamespaceInFault = load_xml(
        """
        <soapenv:Envelope
            xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
            xmlns="http://example.com/my/schema">
          <soapenv:Body>
            <soapenv:Fault>
              <faultcode xmlns="">fault-code-withEmptyNamespace</faultcode>
              <faultstring xmlns="">fault-string-withEmptyNamespace</faultstring>
              <detail xmlns="">
                <myFaultDetails xmlns="http://example.com/my/schema">
                  <message>detail-message-withNamespace</message>
                  <errorcode>detail-code-withNamespace</errorcode>
                </myFaultDetails>
              </detail>
            </soapenv:Fault>
          </soapenv:Body>
        </soapenv:Envelope>
    """
    )

    try:
        binding.process_error(responseWithEmptyNamespaceInFault, None)
        assert False
    except Fault as exc:
        assert exc.message == "fault-string-withEmptyNamespace"
        assert exc.code == "fault-code-withEmptyNamespace"
        assert exc.actor is None
        assert exc.subcodes is None
        assert "detail-message-withNamespace" in etree.tostring(exc.detail).decode(
            "utf-8"
        )

The test output with this newly added test

>           assert exc.message == "fault-string-withEmptyNamespace"
E           AssertionError: assert None == 'fault-string-withEmptyNamespace'
E            +  where None = Fault(None).message

This Fault Response is used by an external API and the maintainer of these API told me that this empty namespaces are valid and pointed me to https://www.w3.org/TR/REC-xml-names/#scoping-defaulting and there you can also find this example

The attribute value in a default namespace declaration MAY be empty. This has the same effect, within the scope of the declaration, of there being no default namespace.

<?xml version='1.0'?>
<Beers>
  <!-- the default namespace inside tables is that of HTML -->
  <table xmlns='http://www.w3.org/1999/xhtml'>
   <th><td>Name</td><td>Origin</td><td>Description</td></th>
   <tr> 
     <!-- no default namespace inside table cells -->
     <td><brandName xmlns="">Huntsman</brandName></td>
     <td><origin xmlns="">Bath, UK</origin></td>
     <td>
       <details xmlns=""><class>Bitter</class><hop>Fuggles</hop>
         <pro>Wonderful hop, light alcohol, good summer beer</pro>
         <con>Fragile; excessive variance pub to pub</con>
         </details>
        </td>
      </tr>
    </table>
  </Beers>