ReadSoapFault method

Future<SoapFaultDetails?> ReadSoapFault(
  1. EwsXmlReader reader
)
Reads the SOAP fault. The reader.

Implementation

/* private */
Future<SoapFaultDetails?> ReadSoapFault(EwsXmlReader reader) async {
  SoapFaultDetails? soapFaultDetails = null;

  try {
    // WCF may not generate an XML declaration.
    await reader.Read();
    if (reader.NodeType == XmlNodeType.XmlDeclaration) {
      await reader.Read();
    }

    if (!reader.IsStartElement() ||
        (reader.LocalName != XmlElementNames.SOAPEnvelopeElementName)) {
      return soapFaultDetails;
    }

    // Get the namespace URI from the envelope element and use it for the rest of the parsing.
    // If it's not 1.1 or 1.2, we can't continue.
    XmlNamespace soapNamespace =
        EwsUtilities.GetNamespaceFromUri(reader.NamespaceUri);
    if (soapNamespace == XmlNamespace.NotSpecified) {
      return soapFaultDetails;
    }

    await reader.Read();

    // Skip SOAP header.
    if (reader.IsStartElementWithNamespace(
        soapNamespace, XmlElementNames.SOAPHeaderElementName)) {
      do {
        await reader.Read();
      } while (!reader.IsEndElementWithNamespace(
          soapNamespace, XmlElementNames.SOAPHeaderElementName));

      // Queue up the next read
      await reader.Read();
    }

    // Parse the fault element contained within the SOAP body.
    if (reader.IsStartElementWithNamespace(
        soapNamespace, XmlElementNames.SOAPBodyElementName)) {
      do {
        await reader.Read();

        // Parse Fault element
        if (reader.IsStartElementWithNamespace(
            soapNamespace, XmlElementNames.SOAPFaultElementName)) {
          soapFaultDetails =
              await SoapFaultDetails.Parse(reader, soapNamespace);
        }
      } while (!reader.IsEndElementWithNamespace(
          soapNamespace, XmlElementNames.SOAPBodyElementName));
    }

    await reader.ReadEndElementWithNamespace(
        soapNamespace, XmlElementNames.SOAPEnvelopeElementName);
  } catch (XmlException) {
    // If response doesn't contain a valid SOAP fault, just ignore exception and
    // return null for SOAP fault details.
  }

  return soapFaultDetails;
}