def parse_soap_enveloped_saml(text, body_class, header_class=None): """Parses a SOAP enveloped SAML thing and returns header parts and body :param text: The SOAP object as XML :return: header parts and body as saml.samlbase instances """ envelope = ElementTree.fromstring(text) assert envelope.tag == '{%s}Envelope' % NAMESPACE #print len(envelope) body = None header = {} for part in envelope: #print ">",part.tag if part.tag == '{%s}Body' % NAMESPACE: for sub in part: try: body = create_class_from_element_tree(body_class, sub) except Exception: raise Exception("Wrong body type (%s) in SOAP envelope" % sub.tag) elif part.tag == '{%s}Header' % NAMESPACE: if not header_class: raise Exception("Header where I didn't expect one") #print "--- HEADER ---" for sub in part: #print ">>",sub.tag for klass in header_class: #print "?{%s}%s" % (klass.c_namespace,klass.c_tag) if sub.tag == "{%s}%s" % (klass.c_namespace, klass.c_tag): header[sub.tag] = \ create_class_from_element_tree(klass, sub) break return body, header
def parse_soap_enveloped_saml(text, body_class, header_class=None): """Parses a SOAP enveloped SAML thing and returns header parts and body :param text: The SOAP object as XML :return: header parts and body as saml.samlbase instances """ envelope = ElementTree.fromstring(text) assert envelope.tag == '{%s}Envelope' % NAMESPACE #print len(envelope) body = None header = {} for part in envelope: #print ">",part.tag if part.tag == '{%s}Body' % NAMESPACE: for sub in part: try: body = create_class_from_element_tree(body_class, sub) except Exception: raise Exception( "Wrong body type (%s) in SOAP envelope" % sub.tag) elif part.tag == '{%s}Header' % NAMESPACE: if not header_class: raise Exception("Header where I didn't expect one") #print "--- HEADER ---" for sub in part: #print ">>",sub.tag for klass in header_class: #print "?{%s}%s" % (klass.c_namespace,klass.c_tag) if sub.tag == "{%s}%s" % (klass.c_namespace, klass.c_tag): header[sub.tag] = \ create_class_from_element_tree(klass, sub) break return body, header
def instanciate_class(item, modules): m = NS_AND_TAG.match(item.tag) ns, tag = m.groups() for module in modules: if module.NAMESPACE == ns: try: target = module.ELEMENT_BY_TAG[tag] return create_class_from_element_tree(target, item) except KeyError: continue raise Exception("Unknown class: ns='%s', tag='%s'" % (ns, tag))