X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=zutil%2Fsoap.c;h=2fbbc1740ba03c0fb66f8ea99c7fe10c913e8888;hb=b0555501e434d0f71f97ea17f282db2e795ff950;hp=911f36722965ab373b27e39eec67a25926817b2e;hpb=c620a713f1418315efcd4e6fab225e036775d365;p=yaz-moved-to-github.git diff --git a/zutil/soap.c b/zutil/soap.c index 911f367..2fbbc17 100644 --- a/zutil/soap.c +++ b/zutil/soap.c @@ -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 +#if HAVE_XML2 +#include +#include + 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 = + "\n" + "\n" + "\t\n" + "\t\t\n" + "\t\t\tSOAP-ENV:Server\n" + "\t\t\tHTTP error\n" + "\t\t\tSOAP not supported in this YAZ configuration\n" + "\t\t\n" + "\t\n" + "\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); +} +