Fix sample PQF
[yaz-moved-to-github.git] / zutil / soap.c
index 911f367..2fbbc17 100644 (file)
@@ -2,11 +2,15 @@
  * 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";
 
@@ -15,7 +19,8 @@ int z_soap_error(ODR o, Z_SOAP *p,
                  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)
@@ -25,9 +30,10 @@ int z_soap_error(ODR o, Z_SOAP *p,
     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)
     {
@@ -39,7 +45,7 @@ int z_soap_codec(ODR o, Z_SOAP **pp,
         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);
@@ -49,7 +55,7 @@ int z_soap_codec(ODR o, Z_SOAP **pp,
         /* 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",
@@ -160,7 +166,7 @@ int z_soap_codec(ODR o, Z_SOAP **pp,
             else
             {
                 ret = z_soap_error(o, p, "SOAP-ENV:Client", 
-                                   "No handler for NS", 0);
+                                   "No handler for NS", ptr->ns->href);
             }
         }
         xmlFreeDoc(doc);
@@ -171,13 +177,13 @@ int z_soap_codec(ODR o, Z_SOAP **pp,
         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);
 
@@ -200,13 +206,57 @@ int z_soap_codec(ODR o, Z_SOAP **pp,
             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);
+}
+