def parse(cls, definitions, xmlelement, operation, nsmap): """ Example:: <output> <soap:body use="literal"/> </output> """ name = xmlelement.get('name') obj = cls(definitions.wsdl, name, operation, nsmap=nsmap) tns = definitions.target_namespace info = { 'body': {}, 'header': {}, 'headerfault': {} } body = _soap_element(xmlelement, 'body') if body is not None: info['body'] = { 'part': body.get('part'), 'use': body.get('use', 'literal'), 'encodingStyle': body.get('encodingStyle'), 'namespace': body.get('namespace'), } header = _soap_element(xmlelement, 'header') if header is not None: info['header'] = { 'message': qname_attr(header, 'message', tns), 'part': header.get('part'), 'use': header.get('use', 'literal'), 'encodingStyle': header.get('encodingStyle'), 'namespace': header.get('namespace'), } headerfault = _soap_element(xmlelement, 'headerfault') if headerfault is not None: info['headerfault'] = { 'message': qname_attr(headerfault, 'message', tns), 'part': headerfault.get('part'), 'use': headerfault.get('use', 'literal'), 'encodingStyle': headerfault.get('encodingStyle'), 'namespace': headerfault.get('namespace'), } obj._info = info return obj
def parse(cls, definitions, xmlelement): """ <wsdl:binding name="nmtoken" type="qname"> * <-- extensibility element (1) --> * <wsdl:operation name="nmtoken"> * <-- extensibility element (2) --> * <wsdl:input name="nmtoken"? > ? <-- extensibility element (3) --> </wsdl:input> <wsdl:output name="nmtoken"? > ? <-- extensibility element (4) --> * </wsdl:output> <wsdl:fault name="nmtoken"> * <-- extensibility element (5) --> * </wsdl:fault> </wsdl:operation> </wsdl:binding> """ name = qname_attr(xmlelement, 'name', definitions.target_namespace) port_name = qname_attr(xmlelement, 'type', definitions.target_namespace) # The soap:binding element contains the transport method and # default style attribute for the operations. soap_node = _soap_element(xmlelement, 'binding') transport = soap_node.get('transport') if transport != 'http://schemas.xmlsoap.org/soap/http': raise NotImplementedError("Only soap/http is supported for now") default_style = soap_node.get('style', 'document') obj = cls(definitions.wsdl, name, port_name, transport, default_style) for node in xmlelement.findall('wsdl:operation', namespaces=cls.nsmap): operation = SoapOperation.parse(definitions, node, obj, nsmap=cls.nsmap) obj._operation_add(operation) return obj
def parse(cls, definitions, xmlelement, operation, type, nsmap): """ Example:: <output> <soap:body use="literal"/> </output> """ name = xmlelement.get('name') obj = cls(definitions.wsdl, name, operation, nsmap=nsmap, type=type) tns = definitions.target_namespace info = { 'body': {}, 'header': [], 'headerfault': [], } # parse soap:body # <soap:body parts="nmtokens"? use="literal|encoded"? # encodingStyle="uri-list"? namespace="uri"?> body = _soap_element(xmlelement, 'body') if body is not None: info['body'] = { 'part': body.get('part'), 'use': body.get('use', 'literal'), 'encodingStyle': body.get('encodingStyle'), 'namespace': body.get('namespace'), } # Parse soap:header (multiple) elements = _soap_element(xmlelement, 'header', multiple=True) info['header'] = cls._parse_header(elements, tns) # Parse soap:headerfault (multiple) elements = _soap_element(xmlelement, 'headerfault', multiple=True) if elements is not None: info['headerfault'] = cls._parse_header(elements, tns) obj._info = info return obj
def parse(cls, definitions, xmlelement, binding, nsmap): """ <wsdl:operation name="nmtoken"> * <soap:operation soapAction="uri"? style="rpc|document"?>? <wsdl:input name="nmtoken"? > ? <soap:body use="literal"/> </wsdl:input> <wsdl:output name="nmtoken"? > ? <-- extensibility element (4) --> * </wsdl:output> <wsdl:fault name="nmtoken"> * <-- extensibility element (5) --> * </wsdl:fault> </wsdl:operation> Example:: <wsdl:operation name="GetLastTradePrice"> <soap:operation soapAction="http://example.com/GetLastTradePrice"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> </wsdl:output> <wsdl:fault name="dataFault"> <soap:fault name="dataFault" use="literal"/> </wsdl:fault> </operation> """ name = xmlelement.get('name') # The soap:operation element is required for soap/http bindings # and may be omitted for other bindings. soap_node = _soap_element(xmlelement, 'operation') action = None if soap_node is not None: action = soap_node.get('soapAction') style = soap_node.get('style', binding.default_style) else: style = binding.default_style obj = cls(name, binding, nsmap, action, style) if style == 'rpc': message_class = RpcMessage else: message_class = DocumentMessage for node in xmlelement.getchildren(): tag_name = etree.QName(node.tag).localname if tag_name not in ('input', 'output', 'fault'): continue msg = message_class.parse(definitions=definitions, xmlelement=node, operation=obj, nsmap=nsmap) if tag_name == 'fault': obj.faults[msg.name] = msg else: setattr(obj, tag_name, msg) return obj
def process_service_port(self, xmlelement): address_node = _soap_element(xmlelement, 'address') return {'address': address_node.get('location')}
def parse(cls, definitions, xmlelement, binding, nsmap): """ <wsdl:operation name="nmtoken"> * <soap:operation soapAction="uri"? style="rpc|document"?>? <wsdl:input name="nmtoken"? > ? <soap:body use="literal"/> </wsdl:input> <wsdl:output name="nmtoken"? > ? <-- extensibility element (4) --> * </wsdl:output> <wsdl:fault name="nmtoken"> * <-- extensibility element (5) --> * </wsdl:fault> </wsdl:operation> Example:: <wsdl:operation name="GetLastTradePrice"> <soap:operation soapAction="http://example.com/GetLastTradePrice"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> </wsdl:output> <wsdl:fault name="dataFault"> <soap:fault name="dataFault" use="literal"/> </wsdl:fault> </operation> """ name = xmlelement.get('name') # The soap:operation element is required for soap/http bindings # and may be omitted for other bindings. soap_node = _soap_element(xmlelement, 'operation') action = None if soap_node is not None: action = soap_node.get('soapAction') style = soap_node.get('style', binding.default_style) else: style = binding.default_style obj = cls(name, binding, nsmap, action, style) if style == 'rpc': message_class = RpcMessage else: message_class = DocumentMessage for node in xmlelement.getchildren(): tag_name = etree.QName(node.tag).localname if tag_name not in ('input', 'output', 'fault'): continue msg = message_class.parse( definitions=definitions, xmlelement=node, operation=obj, nsmap=nsmap) if tag_name == 'fault': obj.faults[msg.name] = msg else: setattr(obj, tag_name, msg) return obj
def process_service_port(self, xmlelement): address_node = _soap_element(xmlelement, 'address') return { 'address': address_node.get('location') }