def test_rebuild_xml(): data = "\r\n".join(line.strip() for line in """ --MIME_boundary Content-Type: application/soap+xml; charset=UTF-8 Content-Transfer-Encoding: 8bit Content-ID: <*****@*****.**> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xop='http://www.w3.org/2004/08/xop/include' xmlns:xop-mime='http://www.w3.org/2005/05/xmlmime'> <soap:Body> <submitClaim> <accountNumber>5XJ45-3B2</accountNumber> <eventType>accident</eventType> <image xop-mime:content-type='image/jpeg'><xop:Include href="cid:[email protected]"/></image> </submitClaim> </soap:Body> </soap:Envelope> --MIME_boundary Content-Type: image/jpeg Content-Transfer-Encoding: binary Content-ID: <*****@*****.**> ...binary JPG image... --MIME_boundary-- """.splitlines()).encode("utf-8") response = stub( status_code=200, content=data, encoding=None, headers={ "Content-Type": 'multipart/related; boundary=MIME_boundary; type="application/soap+xml"; start="<*****@*****.**>" 1' }, ) decoder = MultipartDecoder(response.content, response.headers["Content-Type"], "utf-8") document = etree.fromstring(decoder.parts[0].content) message_pack = MessagePack(parts=decoder.parts[1:]) xop.process_xop(document, message_pack) expected = """ <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:xop-mime="http://www.w3.org/2005/05/xmlmime"> <soap:Body> <submitClaim> <accountNumber>5XJ45-3B2</accountNumber> <eventType>accident</eventType> <image xop-mime:content-type="image/jpeg">Li4uYmluYXJ5IEpQRyBpbWFnZS4uLg==</image> </submitClaim> </soap:Body> </soap:Envelope> """ assert_nodes_equal(etree.tostring(document), expected)
def test_rebuild_xml(): data = '\r\n'.join(line.strip() for line in """ --MIME_boundary Content-Type: application/soap+xml; charset=UTF-8 Content-Transfer-Encoding: 8bit Content-ID: <*****@*****.**> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xop='http://www.w3.org/2004/08/xop/include' xmlns:xop-mime='http://www.w3.org/2005/05/xmlmime'> <soap:Body> <submitClaim> <accountNumber>5XJ45-3B2</accountNumber> <eventType>accident</eventType> <image xop-mime:content-type='image/jpeg'><xop:Include href="cid:[email protected]"/></image> </submitClaim> </soap:Body> </soap:Envelope> --MIME_boundary Content-Type: image/jpeg Content-Transfer-Encoding: binary Content-ID: <*****@*****.**> ...binary JPG image... --MIME_boundary-- """.splitlines()).encode('utf-8') response = stub( status_code=200, content=data, encoding=None, headers={ 'Content-Type': 'multipart/related; boundary=MIME_boundary; type="application/soap+xml"; start="<*****@*****.**>" 1' } ) decoder = MultipartDecoder( response.content, response.headers['Content-Type'], 'utf-8') document = etree.fromstring(decoder.parts[0].content) message_pack = MessagePack(parts=decoder.parts[1:]) xop.process_xop(document, message_pack) expected = """ <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:xop-mime="http://www.w3.org/2005/05/xmlmime"> <soap:Body> <submitClaim> <accountNumber>5XJ45-3B2</accountNumber> <eventType>accident</eventType> <image xop-mime:content-type="image/jpeg">Li4uYmluYXJ5IEpQRyBpbWFnZS4uLg==</image> </submitClaim> </soap:Body> </soap:Envelope> """ assert_nodes_equal(etree.tostring(document), expected)
def process_reply(self, client, operation, response): """Process the XML reply from the server. :param client: The client with which the operation was called :type client: zeep.client.Client :param operation: The operation object from which this is a reply :type operation: zeep.wsdl.definitions.Operation :param response: The response object returned by the remote server :type response: requests.Response """ if response.status_code in (201, 202) and not response.content: return None elif response.status_code != 200 and not response.content: raise TransportError( u"Server returned HTTP status %d (no content available)" % response.status_code, status_code=response.status_code, ) content_type = response.headers.get("Content-Type", "text/xml") media_type = get_media_type(content_type) message_pack = None # If the reply is a multipart/related then we need to retrieve all the # parts if media_type == "multipart/related": decoder = MultipartDecoder( response.content, content_type, response.encoding or "utf-8" ) content = decoder.parts[0].content if len(decoder.parts) > 1: message_pack = MessagePack(parts=decoder.parts[1:]) else: content = response.content try: doc = parse_xml(content, self.transport, settings=client.settings) except XMLSyntaxError as exc: raise TransportError( "Server returned response (%s) with invalid XML: %s.\nContent: %r" % (response.status_code, exc, response.content), status_code=response.status_code, content=response.content, ) # Check if this is an XOP message which we need to decode first if message_pack: if process_xop(doc, message_pack): message_pack = None if client.wsse: client.wsse.verify(doc) doc, http_headers = plugins.apply_ingress( client, doc, response.headers, operation ) # If the response code is not 200 or if there is a Fault node available # then assume that an error occured. fault_node = doc.find("soap-env:Body/soap-env:Fault", namespaces=self.nsmap) if response.status_code != 200 or fault_node is not None: return self.process_error(doc, operation) result = operation.process_reply(doc) if message_pack: message_pack._set_root(result) return message_pack return result
def process_reply(self, client, operation, response): """Process the XML reply from the server. :param client: The client with which the operation was called :type client: zeep.client.Client :param operation: The operation object from which this is a reply :type operation: zeep.wsdl.definitions.Operation :param response: The response object returned by the remote server :type response: requests.Response """ if response.status_code != 200 and not response.content: raise TransportError( u'Server returned HTTP status %d (no content available)' % response.status_code) content_type = response.headers.get('Content-Type', 'text/xml') media_type = get_media_type(content_type) message_pack = None if media_type == 'multipart/related': decoder = MultipartDecoder( response.content, content_type, response.encoding or 'utf-8') content = decoder.parts[0].content if len(decoder.parts) > 1: message_pack = MessagePack(parts=decoder.parts[1:]) else: content = response.content try: doc = parse_xml( content, self.transport, strict=client.wsdl.strict, xml_huge_tree=client.xml_huge_tree) except XMLSyntaxError: raise TransportError( 'Server returned HTTP status %d (%s)' % (response.status_code, response.content)) # Check if this is an XOP message which we need to decode first if message_pack: if process_xop(doc, message_pack): message_pack = None if client.wsse: client.wsse.verify(doc) doc, http_headers = plugins.apply_ingress( client, doc, response.headers, operation) # If the response code is not 200 or if there is a Fault node available # then assume that an error occured. fault_node = doc.find( 'soap-env:Body/soap-env:Fault', namespaces=self.nsmap) if response.status_code != 200 or fault_node is not None: return self.process_error(doc, operation) result = operation.process_reply(doc) if message_pack: message_pack._set_root(result) return message_pack return result
def process_reply(self, client, operation, response): """Process the XML reply from the server. :param client: The client with which the operation was called :type client: zeep.client.Client :param operation: The operation object from which this is a reply :type operation: zeep.wsdl.definitions.Operation :param response: The response object returned by the remote server :type response: requests.Response """ if response.status_code in (201, 202) and not response.content: return None elif response.status_code != 200 and not response.content: raise TransportError( u'Server returned HTTP status %d (no content available)' % response.status_code, status_code=response.status_code) content_type = response.headers.get('Content-Type', 'text/xml') media_type = get_media_type(content_type) message_pack = None # If the reply is a multipart/related then we need to retrieve all the # parts if media_type == 'multipart/related': decoder = MultipartDecoder( response.content, content_type, response.encoding or 'utf-8') content = decoder.parts[0].content if len(decoder.parts) > 1: message_pack = MessagePack(parts=decoder.parts[1:]) else: content = response.content try: doc = parse_xml(content, self.transport, settings=client.settings) except XMLSyntaxError as exc: raise TransportError( 'Server returned response (%s) with invalid XML: %s.\nContent: %r' % (response.status_code, exc, response.content), status_code=response.status_code, content=response.content) # Check if this is an XOP message which we need to decode first if message_pack: if process_xop(doc, message_pack): message_pack = None if client.wsse: client.wsse.verify(doc) doc, http_headers = plugins.apply_ingress( client, doc, response.headers, operation) # If the response code is not 200 or if there is a Fault node available # then assume that an error occured. fault_node = doc.find( 'soap-env:Body/soap-env:Fault', namespaces=self.nsmap) if response.status_code != 200 or fault_node is not None: return self.process_error(doc, operation) result = operation.process_reply(doc) if message_pack: message_pack._set_root(result) return message_pack return result