X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fsoap.c;h=94e0f1942e6dac8f191302300332cf14bb94c568;hp=5dbd490356a51110137f36c71122fa7606a60f5a;hb=f0df1959fda559c0d952810c338a9fde667b5a63;hpb=ee6ab2ee3a9ee1a8c65d7272ec7fba1d886f5af0 diff --git a/src/soap.c b/src/soap.c index 5dbd490..94e0f19 100644 --- a/src/soap.c +++ b/src/soap.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2008 Index Data + * Copyright (C) Index Data * See the file LICENSE for details. */ /** @@ -9,8 +9,12 @@ * This implements encoding and decoding of SOAP packages using * Libxml2. */ +#if HAVE_CONFIG_H +#include +#endif #include +#include #if YAZ_HAVE_XML2 #include @@ -19,7 +23,7 @@ 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, @@ -44,17 +48,27 @@ int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp, "Bad XML Document", 0); ptr = xmlDocGetRootElement(doc); - if (!ptr || !ptr->ns) + if (!ptr || ptr->type != XML_ELEMENT_NODE || !ptr->ns) { xmlFreeDoc(doc); return z_soap_error(o, p, "SOAP-ENV:Client", "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)) - break; + { + const char *hns = handlers[i].ns; + if (strchr(hns, ':')) + { + if (yaz_match_glob(hns, (const char *) ptr->ns->href)) + break; + } + else + { + if (yaz_match_glob(hns, (const char *) ptr->name)) + break; + } + } if (handlers[i].ns) { void *handler_data = 0; @@ -63,8 +77,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); @@ -81,9 +95,7 @@ int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp, return ret; } /* OK: assume SOAP */ - - if (!ptr || ptr->type != XML_ELEMENT_NODE || - xmlStrcmp(ptr->name, BAD_CAST "Envelope") || !ptr->ns) + if (xmlStrcmp(ptr->name, BAD_CAST "Envelope")) { xmlFreeDoc(doc); return z_soap_error(o, p, "SOAP-ENV:Client", @@ -116,7 +128,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); @@ -179,15 +191,18 @@ 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 (strchr(handlers[i].ns, ':') && + 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); @@ -203,9 +218,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); @@ -233,7 +247,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); @@ -244,7 +258,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); @@ -263,7 +277,7 @@ int z_soap_codec_enc_xsl(ODR o, Z_SOAP **pp, if (stylesheet) { 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", @@ -289,7 +303,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) @@ -314,7 +328,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) @@ -323,7 +337,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) { @@ -335,7 +349,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); @@ -349,6 +363,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