* Copyright (c) 2002-2003, Index Data.
* See the file LICENSE for details.
*
- * $Id: soap.c,v 1.1 2003-02-12 15:06:44 adam Exp $
+ * $Id: soap.c,v 1.9 2003-04-23 20:36:05 adam Exp $
*/
#include <yaz/soap.h>
+#if HAVE_XML2
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+
static const char *soap_v1_1 = "http://schemas.xmlsoap.org/soap/envelope/";
static const char *soap_v1_2 = "http://www.w3.org/2001/06/soap-envelope";
const char *details)
{
p->which = Z_SOAP_error;
- p->u.soap_error = odr_malloc(o, sizeof(*p->u.soap_error));
+ p->u.soap_error = (Z_SOAP_Fault *)
+ odr_malloc(o, sizeof(*p->u.soap_error));
p->u.soap_error->fault_code = odr_strdup(o, fault_code);
p->u.soap_error->fault_string = odr_strdup(o, fault_string);
if (details)
return -1;
}
-int z_soap_codec(ODR o, Z_SOAP **pp,
+int z_soap_codec_enc(ODR o, Z_SOAP **pp,
char **content_buf, int *content_len,
- Z_SOAP_Handler *handlers)
+ Z_SOAP_Handler *handlers,
+ const char *encoding)
{
if (o->direction == ODR_DECODE)
{
if (!content_buf || !*content_buf || !content_len)
return -1;
- *pp = p = odr_malloc(o, sizeof(*p));
+ *pp = p = (Z_SOAP *) odr_malloc(o, sizeof(*p));
p->ns = soap_v1_1;
doc = xmlParseMemory(*content_buf, *content_len);
/* check that root node is Envelope */
ptr = xmlDocGetRootElement(doc);
if (!ptr || ptr->type != XML_ELEMENT_NODE ||
- strcmp(ptr->name, "Envelope"))
+ strcmp(ptr->name, "Envelope") || !ptr->ns)
{
xmlFreeDoc(doc);
return z_soap_error(o, p, "SOAP-ENV:Client",
else
{
ret = z_soap_error(o, p, "SOAP-ENV:Client",
- "No handler for NS", 0);
+ "No handler for NS", ptr->ns->href);
}
}
xmlFreeDoc(doc);
Z_SOAP *p = *pp;
xmlNsPtr ns_env;
xmlNodePtr envelope_ptr, body_ptr;
- xmlChar *buf_out;
- int len_out;
xmlDocPtr doc = xmlNewDoc("1.0");
envelope_ptr = xmlNewNode(0, "Envelope");
ns_env = xmlNewNs(envelope_ptr, p->ns, "SOAP-ENV");
+ xmlSetNs(envelope_ptr, ns_env);
+
body_ptr = xmlNewChild(envelope_ptr, ns_env, "Body", 0);
xmlDocSetRootElement(doc, envelope_ptr);
if (ret)
return ret;
}
- xmlDocDumpMemory(doc, &buf_out, &len_out);
- *content_buf = odr_malloc(o, len_out);
- *content_len = len_out;
- memcpy(*content_buf, buf_out, len_out);
- xmlFree(buf_out);
+ if (p->which == Z_SOAP_generic && !strcmp(p->ns, "SRU"))
+ {
+ xmlDocSetRootElement(doc, body_ptr->children);
+ }
+ if (1)
+ {
+ xmlChar *buf_out;
+ int len_out;
+ if (encoding)
+ xmlDocDumpMemoryEnc(doc, &buf_out, &len_out, encoding);
+ else
+ xmlDocDumpMemory(doc, &buf_out, &len_out);
+ *content_buf = (char *) odr_malloc(o, len_out);
+ *content_len = len_out;
+ memcpy(*content_buf, buf_out, len_out);
+ xmlFree(buf_out);
+ }
xmlFreeDoc(doc);
return 0;
}
return 0;
}
+#else
+int z_soap_codec_enc(ODR o, Z_SOAP **pp,
+ char **content_buf, int *content_len,
+ Z_SOAP_Handler *handlers, const char *encoding)
+{
+ static char *err_xml =
+ "<?xml version=\"1.0\"?>\n"
+ "<SOAP-ENV:Envelope"
+ " xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
+ "\t<SOAP-ENV:Body>\n"
+ "\t\t<SOAP-ENV:Fault>\n"
+ "\t\t\t<faultcode>SOAP-ENV:Server</faultcode>\n"
+ "\t\t\t<faultstring>HTTP error</faultstring>\n"
+ "\t\t\t<detail>SOAP not supported in this YAZ configuration</detail>\n"
+ "\t\t</SOAP-ENV:Fault>\n"
+ "\t</SOAP-ENV:Body>\n"
+ "</SOAP-ENV:Envelope>\n";
+ if (o->direction == ODR_ENCODE)
+ {
+ *content_buf = err_xml;
+ *content_len = strlen(err_xml);
+ }
+ return -1;
+}
+#endif
+int z_soap_codec(ODR o, Z_SOAP **pp,
+ char **content_buf, int *content_len,
+ Z_SOAP_Handler *handlers)
+{
+ return z_soap_codec_enc(o, pp, content_buf, content_len, handlers, 0);
+}
+