X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fsoap.c;h=94b6726d8e31ca519c2dddccf3fe425233a35fb8;hp=45e86cbbd55251e4df596f46b54e8e1739dcabd0;hb=ffb913afb48e3a0cb3539827daafed79562ab0b7;hpb=1f3fe256d54ab81d998cd622abda89580cc0b3ff diff --git a/src/soap.c b/src/soap.c index 45e86cb..94b6726 100644 --- a/src/soap.c +++ b/src/soap.c @@ -1,8 +1,6 @@ -/* - * Copyright (C) 1995-2005, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2013 Index Data * See the file LICENSE for details. - * - * $Id: soap.c,v 1.13 2006-03-01 23:24:25 adam Exp $ */ /** * \file soap.c @@ -11,17 +9,21 @@ * This implements encoding and decoding of SOAP packages using * Libxml2. */ +#if HAVE_CONFIG_H +#include +#endif #include +#include -#if HAVE_XML2 +#if YAZ_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"; -int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp, +int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp, char **content_buf, int *content_len, Z_SOAP_Handler *handlers, const char *encoding, @@ -53,9 +55,9 @@ int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp, "No Envelope element", 0); } /* check for SRU root node match */ - + for (i = 0; handlers[i].ns; i++) - if (!xmlStrcmp(ptr->ns->href, BAD_CAST handlers[i].ns)) + if (yaz_match_glob(handlers[i].ns, (const char *)ptr->ns->href)) break; if (handlers[i].ns) { @@ -65,8 +67,8 @@ int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp, p_top_tmp.children = ptr; ret = (*handlers[i].f)(o, &p_top_tmp, &handler_data, handlers[i].client_data, - handlers[i].ns); - + (const char *)ptr->ns->href); + if (ret || !handler_data) z_soap_error(o, p, "SOAP-ENV:Client", "SOAP Handler returned error", 0); @@ -118,7 +120,7 @@ int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp, ptr = ptr->next; } /* check that Body is present */ - if (!ptr || ptr->type != XML_ELEMENT_NODE || + if (!ptr || ptr->type != XML_ELEMENT_NODE || xmlStrcmp(ptr->name, BAD_CAST "Body")) { xmlFreeDoc(doc); @@ -181,15 +183,17 @@ int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp, } else { + const char *ns = (const char *) ptr->ns->href; for (i = 0; handlers[i].ns; i++) - if (!xmlStrcmp(ptr->ns->href, BAD_CAST handlers[i].ns)) + { + if (yaz_match_glob(handlers[i].ns, ns)) break; + } if (handlers[i].ns) { void *handler_data = 0; ret = (*handlers[i].f)(o, pptr, &handler_data, - handlers[i].client_data, - handlers[i].ns); + handlers[i].client_data, ns); if (ret || !handler_data) z_soap_error(o, p, "SOAP-ENV:Client", "SOAP Handler returned error", 0); @@ -205,9 +209,8 @@ int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp, } else { - ret = z_soap_error(o, p, "SOAP-ENV:Client", - "No handler for NS", - (const char *)ptr->ns->href); + ret = z_soap_error(o, p, "SOAP-ENV:Client", + "No handler for NS", ns); } } xmlFreeDoc(doc); @@ -235,7 +238,7 @@ int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp, Z_SOAP_Fault *f = p->u.fault; xmlNodePtr fault_ptr = xmlNewChild(body_ptr, ns_env, BAD_CAST "Fault", 0); - xmlNewChild(fault_ptr, ns_env, BAD_CAST "faultcode", + xmlNewChild(fault_ptr, ns_env, BAD_CAST "faultcode", BAD_CAST f->fault_code); xmlNewChild(fault_ptr, ns_env, BAD_CAST "faultstring", BAD_CAST f->fault_string); @@ -246,7 +249,7 @@ int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp, else if (p->which == Z_SOAP_generic) { int ret, no = p->u.generic->no; - + ret = (*handlers[no].f)(o, body_ptr, &p->u.generic->p, handlers[no].client_data, handlers[no].ns); @@ -264,8 +267,8 @@ int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp, } if (stylesheet) { - char *content = odr_malloc(o, strlen(stylesheet) + 40); - + char *content = (char *) odr_malloc(o, strlen(stylesheet) + 40); + xmlNodePtr pi, ptr = xmlDocGetRootElement(doc); sprintf(content, "type=\"text/xsl\" href=\"%s\"", stylesheet); pi = xmlNewPI(BAD_CAST "xml-stylesheet", @@ -291,7 +294,7 @@ int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp, return 0; } #else -int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp, +int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp, char **content_buf, int *content_len, Z_SOAP_Handler *handlers, const char *encoding, const char *stylesheet) @@ -316,7 +319,7 @@ int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp, return -1; } #endif -int z_soap_codec_enc(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, const char *encoding) @@ -325,7 +328,7 @@ int z_soap_codec_enc(ODR o, Z_SOAP **pp, encoding, 0); } -int z_soap_codec(ODR o, Z_SOAP **pp, +int z_soap_codec(ODR o, Z_SOAP **pp, char **content_buf, int *content_len, Z_SOAP_Handler *handlers) { @@ -337,7 +340,7 @@ int z_soap_error(ODR o, Z_SOAP *p, const char *details) { p->which = Z_SOAP_error; - p->u.soap_error = (Z_SOAP_Fault *) + 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); @@ -351,6 +354,7 @@ int z_soap_error(ODR o, Z_SOAP *p, /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab