Source code for pyinthesky.minisoap
[docs]def soap_encode(elements):
if not isinstance(elements, (tuple, list)):
raise ValueError('must pass a sequence of Element objects')
from .xmlutils import ElementTree as ET
res = ET.Element('s:Envelope')
res.attrib['xmlns:s'] = "http://schemas.xmlsoap.org/soap/envelope/"
res.attrib['s:encodingStyle'] = "http://schemas.xmlsoap.org/soap/encoding/"
body = ET.SubElement(res, 's:Body')
for element in elements:
body.append(element)
return ET.ElementTree(res)
[docs]def soap_decode(etree):
from functools import partial
from .xmlutils import nstag
tag = partial(nstag, etree)
body = etree.find(tag('Body'))
# Is there a SOAP fault here?
fault = body.find(tag('Fault'))
if fault is not None:
faultcode = fault.find('faultcode').text
faultstring = fault.find('faultstring').text
# Which exception class? You can get strings like this:
# "s:Client.Authentication"
#
# So we drop the namespace qualifier and only pay attention to
# the first element to determine the class type.
faultcode = faultcode.split(':', 1)[-1]
faulttype = faultcode.split('.', 1)[0]
faultclass = {
'Client': SoapClientError,
'Server': SoapServerError,
}.get(faulttype, SoapError)
detail = fault.find('detail')
raise faultclass(faultcode, faultstring, detail.getchildren())
# Otherwise, it's just a normal response, and we want to return the
# content.
#
# from .xmlutils import ElementTree as ET
# ET.dump(body)
return body.getchildren()
[docs]class SoapError(Exception):
def __init__(self, code, message, details):
Exception.__init__(self, '%s: %s' % (code, message))
self.code = code
self.message = message
self.details = details
[docs]class SoapClientError(SoapError):
pass
[docs]class SoapServerError(SoapError):
pass