/ext/soap/php_sdl.c
C | 3673 lines | 3138 code | 461 blank | 74 comment | 877 complexity | 99f8f392426facf20ff26b707cd33ac4 MD5 | raw file
Possible License(s): BSD-2-Clause, BSD-3-Clause, MPL-2.0-no-copyleft-exception, LGPL-2.1
Large files files are truncated, but you can click here to view the full file
- /*
- +----------------------------------------------------------------------+
- | Copyright (c) The PHP Group |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.01 of the PHP license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available through the world-wide-web at the following url: |
- | https://www.php.net/license/3_01.txt |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Authors: Brad Lafountain <rodif_bl@yahoo.com> |
- | Shane Caraveo <shane@caraveo.com> |
- | Dmitry Stogov <dmitry@php.net> |
- +----------------------------------------------------------------------+
- */
- #include "php_soap.h"
- #include "ext/libxml/php_libxml.h"
- #include "libxml/uri.h"
- #include "ext/standard/md5.h"
- #include "zend_virtual_cwd.h"
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #ifndef O_BINARY
- # define O_BINARY 0
- #endif
- static void delete_fault(zval *zv);
- static void delete_fault_persistent(zval *zv);
- static void delete_binding(zval *zv);
- static void delete_binding_persistent(zval *zv);
- static void delete_function(zval *zv);
- static void delete_function_persistent(zval *zv);
- static void delete_parameter(zval *zv);
- static void delete_parameter_persistent(zval *zv);
- static void delete_header(zval *header);
- static void delete_header_int(sdlSoapBindingFunctionHeaderPtr hdr);
- static void delete_header_persistent(zval *zv);
- static void delete_document(zval *zv);
- encodePtr get_encoder_from_prefix(sdlPtr sdl, xmlNodePtr node, const xmlChar *type)
- {
- encodePtr enc = NULL;
- xmlNsPtr nsptr;
- char *ns, *cptype;
- parse_namespace(type, &cptype, &ns);
- nsptr = xmlSearchNs(node->doc, node, BAD_CAST(ns));
- if (nsptr != NULL) {
- enc = get_encoder(sdl, (char*)nsptr->href, cptype);
- if (enc == NULL) {
- enc = get_encoder_ex(sdl, cptype, strlen(cptype));
- }
- } else {
- enc = get_encoder_ex(sdl, (char*)type, xmlStrlen(type));
- }
- efree(cptype);
- if (ns) {efree(ns);}
- return enc;
- }
- static sdlTypePtr get_element(sdlPtr sdl, xmlNodePtr node, const xmlChar *type)
- {
- sdlTypePtr ret = NULL;
- if (sdl->elements) {
- xmlNsPtr nsptr;
- char *ns, *cptype;
- sdlTypePtr sdl_type;
- parse_namespace(type, &cptype, &ns);
- nsptr = xmlSearchNs(node->doc, node, BAD_CAST(ns));
- if (nsptr != NULL) {
- int ns_len = xmlStrlen(nsptr->href);
- int type_len = strlen(cptype);
- int len = ns_len + type_len + 1;
- char *nscat = emalloc(len + 1);
- memcpy(nscat, nsptr->href, ns_len);
- nscat[ns_len] = ':';
- memcpy(nscat+ns_len+1, cptype, type_len);
- nscat[len] = '\0';
- if ((sdl_type = zend_hash_str_find_ptr(sdl->elements, nscat, len)) != NULL) {
- ret = sdl_type;
- } else if ((sdl_type = zend_hash_str_find_ptr(sdl->elements, (char*)type, type_len)) != NULL) {
- ret = sdl_type;
- }
- efree(nscat);
- } else {
- if ((sdl_type = zend_hash_str_find_ptr(sdl->elements, (char*)type, xmlStrlen(type))) != NULL) {
- ret = sdl_type;
- }
- }
- efree(cptype);
- if (ns) {efree(ns);}
- }
- return ret;
- }
- encodePtr get_encoder(sdlPtr sdl, const char *ns, const char *type)
- {
- encodePtr enc = NULL;
- char *nscat;
- int ns_len = ns ? strlen(ns) : 0;
- int type_len = strlen(type);
- int len = ns_len + type_len + 1;
- nscat = emalloc(len + 1);
- if (ns) {
- memcpy(nscat, ns, ns_len);
- }
- nscat[ns_len] = ':';
- memcpy(nscat+ns_len+1, type, type_len);
- nscat[len] = '\0';
- enc = get_encoder_ex(sdl, nscat, len);
- if (enc == NULL &&
- ((ns_len == sizeof(SOAP_1_1_ENC_NAMESPACE)-1 &&
- memcmp(ns, SOAP_1_1_ENC_NAMESPACE, sizeof(SOAP_1_1_ENC_NAMESPACE)-1) == 0) ||
- (ns_len == sizeof(SOAP_1_2_ENC_NAMESPACE)-1 &&
- memcmp(ns, SOAP_1_2_ENC_NAMESPACE, sizeof(SOAP_1_2_ENC_NAMESPACE)-1) == 0))) {
- char *enc_nscat;
- int enc_ns_len;
- int enc_len;
- enc_ns_len = sizeof(XSD_NAMESPACE)-1;
- enc_len = enc_ns_len + type_len + 1;
- enc_nscat = emalloc(enc_len + 1);
- memcpy(enc_nscat, XSD_NAMESPACE, sizeof(XSD_NAMESPACE)-1);
- enc_nscat[enc_ns_len] = ':';
- memcpy(enc_nscat+enc_ns_len+1, type, type_len);
- enc_nscat[enc_len] = '\0';
- enc = get_encoder_ex(NULL, enc_nscat, enc_len);
- efree(enc_nscat);
- if (enc && sdl) {
- encodePtr new_enc = pemalloc(sizeof(encode), sdl->is_persistent);
- memcpy(new_enc, enc, sizeof(encode));
- if (sdl->is_persistent) {
- new_enc->details.ns = zend_strndup(ns, ns_len);
- new_enc->details.type_str = strdup(new_enc->details.type_str);
- } else {
- new_enc->details.ns = estrndup(ns, ns_len);
- new_enc->details.type_str = estrdup(new_enc->details.type_str);
- }
- if (sdl->encoders == NULL) {
- sdl->encoders = pemalloc(sizeof(HashTable), sdl->is_persistent);
- zend_hash_init(sdl->encoders, 0, NULL, delete_encoder, sdl->is_persistent);
- }
- zend_hash_str_update_ptr(sdl->encoders, nscat, len, new_enc);
- enc = new_enc;
- }
- }
- efree(nscat);
- return enc;
- }
- encodePtr get_encoder_ex(sdlPtr sdl, const char *nscat, int len)
- {
- encodePtr enc;
- if ((enc = zend_hash_str_find_ptr(&SOAP_GLOBAL(defEnc), (char*)nscat, len)) != NULL) {
- return enc;
- } else if (sdl && sdl->encoders && (enc = zend_hash_str_find_ptr(sdl->encoders, (char*)nscat, len)) != NULL) {
- return enc;
- }
- return NULL;
- }
- sdlBindingPtr get_binding_from_type(sdlPtr sdl, sdlBindingType type)
- {
- sdlBindingPtr binding;
- if (sdl == NULL) {
- return NULL;
- }
- ZEND_HASH_MAP_FOREACH_PTR(sdl->bindings, binding) {
- if (binding->bindingType == type) {
- return binding;
- }
- } ZEND_HASH_FOREACH_END();
- return NULL;
- }
- sdlBindingPtr get_binding_from_name(sdlPtr sdl, char *name, char *ns)
- {
- sdlBindingPtr binding;
- smart_str key = {0};
- smart_str_appends(&key, ns);
- smart_str_appendc(&key, ':');
- smart_str_appends(&key, name);
- smart_str_0(&key);
- binding = zend_hash_find_ptr(sdl->bindings, key.s);
- smart_str_free(&key);
- return binding;
- }
- static int is_wsdl_element(xmlNodePtr node)
- {
- if (node->ns && strcmp((char*)node->ns->href, WSDL_NAMESPACE) != 0) {
- xmlAttrPtr attr;
- if ((attr = get_attribute_ex(node->properties, "required", WSDL_NAMESPACE)) != NULL &&
- attr->children && attr->children->content &&
- (strcmp((char*)attr->children->content, "1") == 0 ||
- strcmp((char*)attr->children->content, "true") == 0)) {
- soap_error1(E_ERROR, "Parsing WSDL: Unknown required WSDL extension '%s'", node->ns->href);
- }
- return 0;
- }
- return 1;
- }
- void sdl_set_uri_credentials(sdlCtx *ctx, char *uri)
- {
- char *s;
- size_t l1, l2;
- zval context;
- zval *header = NULL;
- /* check if we load xsd from the same server */
- s = strstr(ctx->sdl->source, "://");
- if (!s) return;
- s = strchr(s+3, '/');
- l1 = s ? (size_t)(s - ctx->sdl->source) : strlen(ctx->sdl->source);
- s = strstr((char*)uri, "://");
- if (!s) return;
- s = strchr(s+3, '/');
- l2 = s ? (size_t)(s - (char*)uri) : strlen((char*)uri);
- if (l1 != l2) {
- /* check for http://...:80/ */
- if (l1 > 11 &&
- ctx->sdl->source[4] == ':' &&
- ctx->sdl->source[l1-3] == ':' &&
- ctx->sdl->source[l1-2] == '8' &&
- ctx->sdl->source[l1-1] == '0') {
- l1 -= 3;
- }
- if (l2 > 11 &&
- uri[4] == ':' &&
- uri[l2-3] == ':' &&
- uri[l2-2] == '8' &&
- uri[l2-1] == '0') {
- l2 -= 3;
- }
- /* check for https://...:443/ */
- if (l1 > 13 &&
- ctx->sdl->source[4] == 's' &&
- ctx->sdl->source[l1-4] == ':' &&
- ctx->sdl->source[l1-3] == '4' &&
- ctx->sdl->source[l1-2] == '4' &&
- ctx->sdl->source[l1-1] == '3') {
- l1 -= 4;
- }
- if (l2 > 13 &&
- uri[4] == 's' &&
- uri[l2-4] == ':' &&
- uri[l2-3] == '4' &&
- uri[l2-2] == '4' &&
- uri[l2-1] == '3') {
- l2 -= 4;
- }
- }
- if (l1 != l2 || memcmp(ctx->sdl->source, uri, l1) != 0) {
- /* another server. clear authentication credentals */
- php_libxml_switch_context(NULL, &context);
- php_libxml_switch_context(&context, NULL);
- if (Z_TYPE(context) != IS_UNDEF) {
- zval *context_ptr = &context;
- ctx->context = php_stream_context_from_zval(context_ptr, 1);
- if (ctx->context &&
- (header = php_stream_context_get_option(ctx->context, "http", "header")) != NULL) {
- s = strstr(Z_STRVAL_P(header), "Authorization: Basic");
- if (s && (s == Z_STRVAL_P(header) || *(s-1) == '\n' || *(s-1) == '\r')) {
- char *rest = strstr(s, "\r\n");
- if (rest) {
- zval new_header;
- rest += 2;
- ZVAL_NEW_STR(&new_header, zend_string_alloc(Z_STRLEN_P(header) - (rest - s), 0));
- memcpy(Z_STRVAL(new_header), Z_STRVAL_P(header), s - Z_STRVAL_P(header));
- memcpy(Z_STRVAL(new_header) + (s - Z_STRVAL_P(header)), rest, Z_STRLEN_P(header) - (rest - Z_STRVAL_P(header)) + 1);
- ZVAL_COPY(&ctx->old_header, header);
- php_stream_context_set_option(ctx->context, "http", "header", &new_header);
- zval_ptr_dtor(&new_header);
- }
- }
- }
- }
- }
- }
- void sdl_restore_uri_credentials(sdlCtx *ctx)
- {
- if (Z_TYPE(ctx->old_header) != IS_UNDEF) {
- php_stream_context_set_option(ctx->context, "http", "header", &ctx->old_header);
- zval_ptr_dtor(&ctx->old_header);
- ZVAL_UNDEF(&ctx->old_header);
- }
- ctx->context = NULL;
- }
- #define SAFE_STR(a) ((a)?((const char *)a):"")
- static void load_wsdl_ex(zval *this_ptr, char *struri, sdlCtx *ctx, int include)
- {
- sdlPtr tmpsdl = ctx->sdl;
- xmlDocPtr wsdl;
- xmlNodePtr root, definitions, trav;
- xmlAttrPtr targetNamespace;
- if (zend_hash_str_exists(&ctx->docs, struri, strlen(struri))) {
- return;
- }
- sdl_set_uri_credentials(ctx, struri);
- wsdl = soap_xmlParseFile(struri);
- sdl_restore_uri_credentials(ctx);
- if (!wsdl) {
- xmlErrorPtr xmlErrorPtr = xmlGetLastError();
- if (xmlErrorPtr) {
- soap_error2(E_ERROR, "Parsing WSDL: Couldn't load from '%s' : %s", struri, xmlErrorPtr->message);
- } else {
- soap_error1(E_ERROR, "Parsing WSDL: Couldn't load from '%s'", struri);
- }
- }
- zend_hash_str_add_ptr(&ctx->docs, struri, strlen(struri), wsdl);
- root = wsdl->children;
- definitions = get_node_ex(root, "definitions", WSDL_NAMESPACE);
- if (!definitions) {
- if (include) {
- xmlNodePtr schema = get_node_ex(root, "schema", XSD_NAMESPACE);
- if (schema) {
- load_schema(ctx, schema);
- return;
- }
- }
- soap_error1(E_ERROR, "Parsing WSDL: Couldn't find <definitions> in '%s'", struri);
- }
- if (!include) {
- targetNamespace = get_attribute(definitions->properties, "targetNamespace");
- if (targetNamespace) {
- tmpsdl->target_ns = estrdup((char*)targetNamespace->children->content);
- }
- }
- trav = definitions->children;
- while (trav != NULL) {
- if (!is_wsdl_element(trav)) {
- trav = trav->next;
- continue;
- }
- if (node_is_equal(trav,"types")) {
- /* TODO: Only one "types" is allowed */
- xmlNodePtr trav2 = trav->children;
- while (trav2 != NULL) {
- if (node_is_equal_ex(trav2, "schema", XSD_NAMESPACE)) {
- load_schema(ctx, trav2);
- } else if (is_wsdl_element(trav2) && !node_is_equal(trav2,"documentation")) {
- soap_error1(E_ERROR, "Parsing WSDL: Unexpected WSDL element <%s>", SAFE_STR(trav2->name));
- }
- trav2 = trav2->next;
- }
- } else if (node_is_equal(trav,"import")) {
- /* TODO: namespace ??? */
- xmlAttrPtr tmp = get_attribute(trav->properties, "location");
- if (tmp) {
- xmlChar *uri;
- xmlChar *base = xmlNodeGetBase(trav->doc, trav);
- if (base == NULL) {
- uri = xmlBuildURI(tmp->children->content, trav->doc->URL);
- } else {
- uri = xmlBuildURI(tmp->children->content, base);
- xmlFree(base);
- }
- load_wsdl_ex(this_ptr, (char*)uri, ctx, 1);
- xmlFree(uri);
- }
- } else if (node_is_equal(trav,"message")) {
- xmlAttrPtr name = get_attribute(trav->properties, "name");
- if (name && name->children && name->children->content) {
- if (zend_hash_str_add_ptr(&ctx->messages, (char*)name->children->content, xmlStrlen(name->children->content), trav) == NULL) {
- soap_error1(E_ERROR, "Parsing WSDL: <message> '%s' already defined", name->children->content);
- }
- } else {
- soap_error0(E_ERROR, "Parsing WSDL: <message> has no name attribute");
- }
- } else if (node_is_equal(trav,"portType")) {
- xmlAttrPtr name = get_attribute(trav->properties, "name");
- if (name && name->children && name->children->content) {
- if (zend_hash_str_add_ptr(&ctx->portTypes, (char*)name->children->content, xmlStrlen(name->children->content), trav) == NULL) {
- soap_error1(E_ERROR, "Parsing WSDL: <portType> '%s' already defined", name->children->content);
- }
- } else {
- soap_error0(E_ERROR, "Parsing WSDL: <portType> has no name attribute");
- }
- } else if (node_is_equal(trav,"binding")) {
- xmlAttrPtr name = get_attribute(trav->properties, "name");
- if (name && name->children && name->children->content) {
- if (zend_hash_str_add_ptr(&ctx->bindings, (char*)name->children->content, xmlStrlen(name->children->content), trav) == NULL) {
- soap_error1(E_ERROR, "Parsing WSDL: <binding> '%s' already defined", name->children->content);
- }
- } else {
- soap_error0(E_ERROR, "Parsing WSDL: <binding> has no name attribute");
- }
- } else if (node_is_equal(trav,"service")) {
- xmlAttrPtr name = get_attribute(trav->properties, "name");
- if (name && name->children && name->children->content) {
- if (zend_hash_str_add_ptr(&ctx->services, (char*)name->children->content, xmlStrlen(name->children->content), trav) == NULL) {
- soap_error1(E_ERROR, "Parsing WSDL: <service> '%s' already defined", name->children->content);
- }
- } else {
- soap_error0(E_ERROR, "Parsing WSDL: <service> has no name attribute");
- }
- } else if (!node_is_equal(trav,"documentation")) {
- soap_error1(E_ERROR, "Parsing WSDL: Unexpected WSDL element <%s>", SAFE_STR(trav->name));
- }
- trav = trav->next;
- }
- }
- static sdlSoapBindingFunctionHeaderPtr wsdl_soap_binding_header(sdlCtx* ctx, xmlNodePtr header, char* wsdl_soap_namespace, int fault)
- {
- xmlAttrPtr tmp;
- xmlNodePtr message, part;
- char *ctype;
- sdlSoapBindingFunctionHeaderPtr h;
- tmp = get_attribute(header->properties, "message");
- if (!tmp) {
- soap_error0(E_ERROR, "Parsing WSDL: Missing message attribute for <header>");
- }
- ctype = strrchr((char*)tmp->children->content,':');
- if (ctype == NULL) {
- ctype = (char*)tmp->children->content;
- } else {
- ++ctype;
- }
- if ((message = zend_hash_str_find_ptr(&ctx->messages, ctype, strlen(ctype))) == NULL) {
- soap_error1(E_ERROR, "Parsing WSDL: Missing <message> with name '%s'", tmp->children->content);
- }
- tmp = get_attribute(header->properties, "part");
- if (!tmp) {
- soap_error0(E_ERROR, "Parsing WSDL: Missing part attribute for <header>");
- }
- part = get_node_with_attribute_ex(message->children, "part", WSDL_NAMESPACE, "name", (char*)tmp->children->content, NULL);
- if (!part) {
- soap_error1(E_ERROR, "Parsing WSDL: Missing part '%s' in <message>", tmp->children->content);
- }
- h = emalloc(sizeof(sdlSoapBindingFunctionHeader));
- memset(h, 0, sizeof(sdlSoapBindingFunctionHeader));
- h->name = estrdup((char*)tmp->children->content);
- tmp = get_attribute(header->properties, "use");
- if (tmp && !strncmp((char*)tmp->children->content, "encoded", sizeof("encoded"))) {
- h->use = SOAP_ENCODED;
- } else {
- h->use = SOAP_LITERAL;
- }
- tmp = get_attribute(header->properties, "namespace");
- if (tmp) {
- h->ns = estrdup((char*)tmp->children->content);
- }
- if (h->use == SOAP_ENCODED) {
- tmp = get_attribute(header->properties, "encodingStyle");
- if (tmp) {
- if (strncmp((char*)tmp->children->content, SOAP_1_1_ENC_NAMESPACE, sizeof(SOAP_1_1_ENC_NAMESPACE)) == 0) {
- h->encodingStyle = SOAP_ENCODING_1_1;
- } else if (strncmp((char*)tmp->children->content, SOAP_1_2_ENC_NAMESPACE, sizeof(SOAP_1_2_ENC_NAMESPACE)) == 0) {
- h->encodingStyle = SOAP_ENCODING_1_2;
- } else {
- soap_error1(E_ERROR, "Parsing WSDL: Unknown encodingStyle '%s'", tmp->children->content);
- }
- } else {
- soap_error0(E_ERROR, "Parsing WSDL: Unspecified encodingStyle");
- }
- }
- tmp = get_attribute(part->properties, "type");
- if (tmp != NULL) {
- h->encode = get_encoder_from_prefix(ctx->sdl, part, tmp->children->content);
- } else {
- tmp = get_attribute(part->properties, "element");
- if (tmp != NULL) {
- h->element = get_element(ctx->sdl, part, tmp->children->content);
- if (h->element) {
- h->encode = h->element->encode;
- if (!h->ns && h->element->namens) {
- h->ns = estrdup(h->element->namens);
- }
- if (h->element->name) {
- efree(h->name);
- h->name = estrdup(h->element->name);
- }
- }
- }
- }
- if (!fault) {
- xmlNodePtr trav = header->children;
- while (trav != NULL) {
- if (node_is_equal_ex(trav, "headerfault", wsdl_soap_namespace)) {
- sdlSoapBindingFunctionHeaderPtr hf = wsdl_soap_binding_header(ctx, trav, wsdl_soap_namespace, 1);
- smart_str key = {0};
- if (h->headerfaults == NULL) {
- h->headerfaults = emalloc(sizeof(HashTable));
- zend_hash_init(h->headerfaults, 0, NULL, delete_header, 0);
- }
- if (hf->ns) {
- smart_str_appends(&key,hf->ns);
- smart_str_appendc(&key,':');
- }
- smart_str_appends(&key,hf->name);
- smart_str_0(&key);
- if (zend_hash_add_ptr(h->headerfaults, key.s, hf) == NULL) {
- delete_header_int(hf);
- }
- smart_str_free(&key);
- } else if (is_wsdl_element(trav) && !node_is_equal(trav,"documentation")) {
- soap_error1(E_ERROR, "Parsing WSDL: Unexpected WSDL element <%s>", SAFE_STR(trav->name));
- }
- trav = trav->next;
- }
- }
- return h;
- }
- static void wsdl_soap_binding_body(sdlCtx* ctx, xmlNodePtr node, char* wsdl_soap_namespace, sdlSoapBindingFunctionBody *binding, HashTable* params)
- {
- xmlNodePtr body, trav;
- xmlAttrPtr tmp;
- trav = node->children;
- while (trav != NULL) {
- if (node_is_equal_ex(trav, "body", wsdl_soap_namespace)) {
- body = trav;
- tmp = get_attribute(body->properties, "use");
- if (tmp && !strncmp((char*)tmp->children->content, "literal", sizeof("literal"))) {
- binding->use = SOAP_LITERAL;
- } else {
- binding->use = SOAP_ENCODED;
- }
- tmp = get_attribute(body->properties, "namespace");
- if (tmp) {
- binding->ns = estrdup((char*)tmp->children->content);
- }
- tmp = get_attribute(body->properties, "parts");
- if (tmp) {
- HashTable ht;
- char *parts = (char*)tmp->children->content;
- /* Delete all parts those are not in the "parts" attribute */
- zend_hash_init(&ht, 0, NULL, delete_parameter, 0);
- while (*parts) {
- sdlParamPtr param;
- int found = 0;
- char *end;
- while (*parts == ' ') ++parts;
- if (*parts == '\0') break;
- end = strchr(parts, ' ');
- if (end) *end = '\0';
- ZEND_HASH_FOREACH_PTR(params, param) {
- if (param->paramName &&
- strcmp(parts, param->paramName) == 0) {
- sdlParamPtr x_param;
- x_param = emalloc(sizeof(sdlParam));
- *x_param = *param;
- param->paramName = NULL;
- zend_hash_next_index_insert_ptr(&ht, x_param);
- found = 1;
- break;
- }
- } ZEND_HASH_FOREACH_END();
- if (!found) {
- soap_error1(E_ERROR, "Parsing WSDL: Missing part '%s' in <message>", parts);
- }
- parts += strlen(parts);
- if (end) *end = ' ';
- }
- zend_hash_destroy(params);
- *params = ht;
- }
- if (binding->use == SOAP_ENCODED) {
- tmp = get_attribute(body->properties, "encodingStyle");
- if (tmp) {
- if (strncmp((char*)tmp->children->content, SOAP_1_1_ENC_NAMESPACE, sizeof(SOAP_1_1_ENC_NAMESPACE)) == 0) {
- binding->encodingStyle = SOAP_ENCODING_1_1;
- } else if (strncmp((char*)tmp->children->content, SOAP_1_2_ENC_NAMESPACE, sizeof(SOAP_1_2_ENC_NAMESPACE)) == 0) {
- binding->encodingStyle = SOAP_ENCODING_1_2;
- } else {
- soap_error1(E_ERROR, "Parsing WSDL: Unknown encodingStyle '%s'", tmp->children->content);
- }
- } else {
- soap_error0(E_ERROR, "Parsing WSDL: Unspecified encodingStyle");
- }
- }
- } else if (node_is_equal_ex(trav, "header", wsdl_soap_namespace)) {
- sdlSoapBindingFunctionHeaderPtr h = wsdl_soap_binding_header(ctx, trav, wsdl_soap_namespace, 0);
- smart_str key = {0};
- if (binding->headers == NULL) {
- binding->headers = emalloc(sizeof(HashTable));
- zend_hash_init(binding->headers, 0, NULL, delete_header, 0);
- }
- if (h->ns) {
- smart_str_appends(&key,h->ns);
- smart_str_appendc(&key,':');
- }
- smart_str_appends(&key,h->name);
- smart_str_0(&key);
- if (zend_hash_add_ptr(binding->headers, key.s, h) == NULL) {
- delete_header_int(h);
- }
- smart_str_free(&key);
- } else if (is_wsdl_element(trav) && !node_is_equal(trav,"documentation")) {
- soap_error1(E_ERROR, "Parsing WSDL: Unexpected WSDL element <%s>", SAFE_STR(trav->name));
- }
- trav = trav->next;
- }
- }
- static HashTable* wsdl_message(sdlCtx *ctx, xmlChar* message_name)
- {
- xmlNodePtr trav, part, message = NULL, tmp;
- HashTable* parameters = NULL;
- char *ctype;
- ctype = strrchr((char*)message_name,':');
- if (ctype == NULL) {
- ctype = (char*)message_name;
- } else {
- ++ctype;
- }
- if ((tmp = zend_hash_str_find_ptr(&ctx->messages, ctype, strlen(ctype))) == NULL) {
- soap_error1(E_ERROR, "Parsing WSDL: Missing <message> with name '%s'", message_name);
- }
- message = tmp;
- parameters = emalloc(sizeof(HashTable));
- zend_hash_init(parameters, 0, NULL, delete_parameter, 0);
- trav = message->children;
- while (trav != NULL) {
- xmlAttrPtr element, type, name;
- sdlParamPtr param;
- if (trav->ns != NULL && strcmp((char*)trav->ns->href, WSDL_NAMESPACE) != 0) {
- soap_error1(E_ERROR, "Parsing WSDL: Unexpected extensibility element <%s>", SAFE_STR(trav->name));
- }
- if (node_is_equal(trav,"documentation")) {
- trav = trav->next;
- continue;
- }
- if (!node_is_equal(trav,"part")) {
- soap_error1(E_ERROR, "Parsing WSDL: Unexpected WSDL element <%s>", SAFE_STR(trav->name));
- }
- part = trav;
- param = emalloc(sizeof(sdlParam));
- memset(param,0,sizeof(sdlParam));
- param->order = 0;
- name = get_attribute(part->properties, "name");
- if (name == NULL) {
- soap_error1(E_ERROR, "Parsing WSDL: No name associated with <part> '%s'", SAFE_STR(message->name));
- }
- param->paramName = estrdup((char*)name->children->content);
- type = get_attribute(part->properties, "type");
- if (type != NULL) {
- param->encode = get_encoder_from_prefix(ctx->sdl, part, type->children->content);
- } else {
- element = get_attribute(part->properties, "element");
- if (element != NULL) {
- param->element = get_element(ctx->sdl, part, element->children->content);
- if (param->element) {
- param->encode = param->element->encode;
- }
- }
- }
- zend_hash_next_index_insert_ptr(parameters, param);
- trav = trav->next;
- }
- return parameters;
- }
- static sdlPtr load_wsdl(zval *this_ptr, char *struri)
- {
- sdlCtx ctx;
- int i,n;
- memset(&ctx,0,sizeof(ctx));
- ctx.sdl = emalloc(sizeof(sdl));
- memset(ctx.sdl, 0, sizeof(sdl));
- ctx.sdl->source = estrdup(struri);
- zend_hash_init(&ctx.sdl->functions, 0, NULL, delete_function, 0);
- zend_hash_init(&ctx.docs, 0, NULL, delete_document, 0);
- zend_hash_init(&ctx.messages, 0, NULL, NULL, 0);
- zend_hash_init(&ctx.bindings, 0, NULL, NULL, 0);
- zend_hash_init(&ctx.portTypes, 0, NULL, NULL, 0);
- zend_hash_init(&ctx.services, 0, NULL, NULL, 0);
- zend_try {
- load_wsdl_ex(this_ptr, struri, &ctx, 0);
- schema_pass2(&ctx);
- n = zend_hash_num_elements(&ctx.services);
- if (n > 0) {
- zend_hash_internal_pointer_reset(&ctx.services);
- for (i = 0; i < n; i++) {
- xmlNodePtr service, tmp;
- xmlNodePtr trav, port;
- int has_soap_port = 0;
- service = tmp = zend_hash_get_current_data_ptr(&ctx.services);
- trav = service->children;
- while (trav != NULL) {
- xmlAttrPtr type, name, bindingAttr, location;
- xmlNodePtr portType, operation;
- xmlNodePtr address, binding, trav2;
- char *ctype;
- sdlBindingPtr tmpbinding;
- char *wsdl_soap_namespace = NULL;
- if (!is_wsdl_element(trav) || node_is_equal(trav,"documentation")) {
- trav = trav->next;
- continue;
- }
- if (!node_is_equal(trav,"port")) {
- soap_error1(E_ERROR, "Parsing WSDL: Unexpected WSDL element <%s>", SAFE_STR(trav->name));
- }
- port = trav;
- tmpbinding = emalloc(sizeof(sdlBinding));
- memset(tmpbinding, 0, sizeof(sdlBinding));
- bindingAttr = get_attribute(port->properties, "binding");
- if (bindingAttr == NULL) {
- soap_error0(E_ERROR, "Parsing WSDL: No binding associated with <port>");
- }
- /* find address and figure out binding type */
- address = NULL;
- trav2 = port->children;
- while (trav2 != NULL) {
- if (node_is_equal(trav2,"address") && trav2->ns) {
- if (!strncmp((char*)trav2->ns->href, WSDL_SOAP11_NAMESPACE, sizeof(WSDL_SOAP11_NAMESPACE))) {
- address = trav2;
- wsdl_soap_namespace = WSDL_SOAP11_NAMESPACE;
- tmpbinding->bindingType = BINDING_SOAP;
- } else if (!strncmp((char*)trav2->ns->href, WSDL_SOAP12_NAMESPACE, sizeof(WSDL_SOAP12_NAMESPACE))) {
- address = trav2;
- wsdl_soap_namespace = WSDL_SOAP12_NAMESPACE;
- tmpbinding->bindingType = BINDING_SOAP;
- } else if (!strncmp((char*)trav2->ns->href, RPC_SOAP12_NAMESPACE, sizeof(RPC_SOAP12_NAMESPACE))) {
- address = trav2;
- wsdl_soap_namespace = RPC_SOAP12_NAMESPACE;
- tmpbinding->bindingType = BINDING_SOAP;
- } else if (!strncmp((char*)trav2->ns->href, WSDL_HTTP11_NAMESPACE, sizeof(WSDL_HTTP11_NAMESPACE))) {
- address = trav2;
- tmpbinding->bindingType = BINDING_HTTP;
- } else if (!strncmp((char*)trav2->ns->href, WSDL_HTTP12_NAMESPACE, sizeof(WSDL_HTTP12_NAMESPACE))) {
- address = trav2;
- tmpbinding->bindingType = BINDING_HTTP;
- }
- }
- if (trav2 != address && is_wsdl_element(trav2) && !node_is_equal(trav2,"documentation")) {
- soap_error1(E_ERROR, "Parsing WSDL: Unexpected WSDL element <%s>", SAFE_STR(trav2->name));
- }
- trav2 = trav2->next;
- }
- if (!address || tmpbinding->bindingType == BINDING_HTTP) {
- if (has_soap_port || trav->next || i < n-1) {
- efree(tmpbinding);
- trav = trav->next;
- continue;
- } else if (!address) {
- soap_error0(E_ERROR, "Parsing WSDL: No address associated with <port>");
- }
- }
- has_soap_port = 1;
- location = get_attribute(address->properties, "location");
- if (!location) {
- soap_error0(E_ERROR, "Parsing WSDL: No location associated with <port>");
- }
- tmpbinding->location = estrdup((char*)location->children->content);
- ctype = strrchr((char*)bindingAttr->children->content,':');
- if (ctype == NULL) {
- ctype = (char*)bindingAttr->children->content;
- } else {
- ++ctype;
- }
- if ((tmp = zend_hash_str_find_ptr(&ctx.bindings, ctype, strlen(ctype))) == NULL) {
- soap_error1(E_ERROR, "Parsing WSDL: No <binding> element with name '%s'", ctype);
- }
- binding = tmp;
- if (tmpbinding->bindingType == BINDING_SOAP) {
- sdlSoapBindingPtr soapBinding;
- xmlNodePtr soapBindingNode;
- xmlAttrPtr tmp;
- soapBinding = emalloc(sizeof(sdlSoapBinding));
- memset(soapBinding, 0, sizeof(sdlSoapBinding));
- soapBinding->style = SOAP_DOCUMENT;
- soapBindingNode = get_node_ex(binding->children, "binding", wsdl_soap_namespace);
- if (soapBindingNode) {
- tmp = get_attribute(soapBindingNode->properties, "style");
- if (tmp && !strncmp((char*)tmp->children->content, "rpc", sizeof("rpc"))) {
- soapBinding->style = SOAP_RPC;
- }
- tmp = get_attribute(soapBindingNode->properties, "transport");
- if (tmp) {
- if (strncmp((char*)tmp->children->content, WSDL_HTTP_TRANSPORT, sizeof(WSDL_HTTP_TRANSPORT)) == 0) {
- soapBinding->transport = SOAP_TRANSPORT_HTTP;
- } else {
- /* try the next binding */
- efree(soapBinding);
- efree(tmpbinding->location);
- efree(tmpbinding);
- trav = trav->next;
- continue;
- }
- }
- }
- tmpbinding->bindingAttributes = (void *)soapBinding;
- }
- name = get_attribute(binding->properties, "name");
- if (name == NULL) {
- soap_error0(E_ERROR, "Parsing WSDL: Missing 'name' attribute for <binding>");
- }
- tmpbinding->name = estrdup((char*)name->children->content);
- type = get_attribute(binding->properties, "type");
- if (type == NULL) {
- soap_error0(E_ERROR, "Parsing WSDL: Missing 'type' attribute for <binding>");
- }
- ctype = strrchr((char*)type->children->content,':');
- if (ctype == NULL) {
- ctype = (char*)type->children->content;
- } else {
- ++ctype;
- }
- if ((tmp = zend_hash_str_find_ptr(&ctx.portTypes, ctype, strlen(ctype))) == NULL) {
- soap_error1(E_ERROR, "Parsing WSDL: Missing <portType> with name '%s'", name->children->content);
- }
- portType = tmp;
- trav2 = binding->children;
- while (trav2 != NULL) {
- sdlFunctionPtr function;
- xmlNodePtr input, output, fault, portTypeOperation, trav3;
- xmlAttrPtr op_name, paramOrder;
- if ((tmpbinding->bindingType == BINDING_SOAP &&
- node_is_equal_ex(trav2, "binding", wsdl_soap_namespace)) ||
- !is_wsdl_element(trav2) ||
- node_is_equal(trav2,"documentation")) {
- trav2 = trav2->next;
- continue;
- }
- if (!node_is_equal(trav2,"operation")) {
- soap_error1(E_ERROR, "Parsing WSDL: Unexpected WSDL element <%s>", SAFE_STR(trav2->name));
- }
- operation = trav2;
- op_name = get_attribute(operation->properties, "name");
- if (op_name == NULL) {
- soap_error0(E_ERROR, "Parsing WSDL: Missing 'name' attribute for <operation>");
- }
- trav3 = operation->children;
- while (trav3 != NULL) {
- if (tmpbinding->bindingType == BINDING_SOAP &&
- node_is_equal_ex(trav3, "operation", wsdl_soap_namespace)) {
- } else if (is_wsdl_element(trav3) &&
- !node_is_equal(trav3,"input") &&
- !node_is_equal(trav3,"output") &&
- !node_is_equal(trav3,"fault") &&
- !node_is_equal(trav3,"documentation")) {
- soap_error1(E_ERROR, "Parsing WSDL: Unexpected WSDL element <%s>", SAFE_STR(trav3->name));
- }
- trav3 = trav3->next;
- }
- portTypeOperation = get_node_with_attribute_ex(portType->children, "operation", WSDL_NAMESPACE, "name", (char*)op_name->children->content, NULL);
- if (portTypeOperation == NULL) {
- soap_error1(E_ERROR, "Parsing WSDL: Missing <portType>/<operation> with name '%s'", op_name->children->content);
- }
- function = emalloc(sizeof(sdlFunction));
- memset(function, 0, sizeof(sdlFunction));
- function->functionName = estrdup((char*)op_name->children->content);
- if (tmpbinding->bindingType == BINDING_SOAP) {
- sdlSoapBindingFunctionPtr soapFunctionBinding;
- sdlSoapBindingPtr soapBinding;
- xmlNodePtr soapOperation;
- xmlAttrPtr tmp;
- soapFunctionBinding = emalloc(sizeof(sdlSoapBindingFunction));
- memset(soapFunctionBinding, 0, sizeof(sdlSoapBindingFunction));
- soapBinding = (sdlSoapBindingPtr)tmpbinding->bindingAttributes;
- soapFunctionBinding->style = soapBinding->style;
- soapOperation = get_node_ex(operation->children, "operation", wsdl_soap_namespace);
- if (soapOperation) {
- tmp = get_attribute(soapOperation->properties, "soapAction");
- if (tmp) {
- soapFunctionBinding->soapAction = estrdup((char*)tmp->children->content);
- }
- tmp = get_attribute(soapOperation->properties, "style");
- if (tmp) {
- if (!strncmp((char*)tmp->children->content, "rpc", sizeof("rpc"))) {
- soapFunctionBinding->style = SOAP_RPC;
- } else {
- soapFunctionBinding->style = SOAP_DOCUMENT;
- }
- } else {
- soapFunctionBinding->style = soapBinding->style;
- }
- }
- function->bindingAttributes = (void *)soapFunctionBinding;
- }
- input = get_node_ex(portTypeOperation->children, "input", WSDL_NAMESPACE);
- if (input != NULL) {
- xmlAttrPtr message;
- message = get_attribute(input->properties, "message");
- if (message == NULL) {
- soap_error1(E_ERROR, "Parsing WSDL: Missing name for <input> of '%s'", op_name->children->content);
- }
- function->requestParameters = wsdl_message(&ctx, message->children->content);
- /* FIXME
- xmlAttrPtr name = get_attribute(input->properties, "name");
- if (name != NULL) {
- function->requestName = estrdup(name->children->content);
- } else {
- */
- {
- function->requestName = estrdup(function->functionName);
- }
- if (tmpbinding->bindingType == BINDING_SOAP) {
- input = get_node_ex(operation->children, "input", WSDL_NAMESPACE);
- if (input != NULL) {
- sdlSoapBindingFunctionPtr soapFunctionBinding = function->bindingAttributes;
- wsdl_soap_binding_body(&ctx, input, wsdl_soap_namespace, &soapFunctionBinding->input, function->requestParameters);
- }
- }
- }
- output = get_node_ex(portTypeOperation->children, "output", WSDL_NAMESPACE);
- if (output != NULL) {
- xmlAttrPtr message;
- message = get_attribute(output->properties, "message");
- if (message == NULL) {
- soap_error1(E_ERROR, "Parsing WSDL: Missing name for <output> of '%s'", op_name->children->content);
- }
- function->responseParameters = wsdl_message(&ctx, message->children->content);
- /* FIXME
- xmlAttrPtr name = get_attribute(output->properties, "name");
- if (name != NULL) {
- function->responseName = estrdup(name->children->content);
- } else if (input == NULL) {
- function->responseName = estrdup(function->functionName);
- } else {
- */
- {
- int len = strlen(function->functionName);
- function->responseName = emalloc(len + sizeof("Response"));
- memcpy(function->responseName, function->functionName, len);
- memcpy(function->responseName+len, "Response", sizeof("Response"));
- }
- if (tmpbinding->bindingType == BINDING_SOAP) {
- output = get_node_ex(operation->children, "output", WSDL_NAMESPACE);
- if (output != NULL) {
- sdlSoapBindingFunctionPtr soapFunctionBinding = function->bindingAttributes;
- wsdl_soap_binding_body(&ctx, output, wsdl_soap_namespace, &soapFunctionBinding->output, function->responseParameters);
- }
- }
- }
- paramOrder = get_attribute(portTypeOperation->properties, "parameterOrder");
- if (paramOrder) {
- /* FIXME: */
- }
- fault = portTypeOperation->children;
- while (fault != NULL) {
- if (node_is_equal_ex(fault, "fault", WSDL_NAMESPACE)) {
- xmlAttrPtr message, name;
- sdlFaultPtr f;
- name = get_attribute(fault->properties, "name");
- if (name == NULL) {
- soap_error1(E_ERROR, "Parsing WSDL: Missing name for <fault> of '%s'", op_name->children->content);
- }
- message = get_attribute(fault->properties, "message");
- if (message == NULL) {
- soap_error1(E_ERROR, "Parsing WSDL: Missing name for <output> of '%s'", op_name->children->content);
- }
- f = emalloc(sizeof(sdlFault));
- memset(f, 0, sizeof(sdlFault));
- f->name = estrdup((char*)name->children->content);
- f->details = wsdl_message(&ctx, message->children->content);
- if (f->details == NULL || zend_hash_num_elements(f->details) > 1) {
- soap_error1(E_ERROR, "Parsing WSDL: The fault message '%s' must have a single part", message->children->content);
- }
- if (tmpbinding->bindingType == BINDING_SOAP) {
- xmlNodePtr soap_fault = get_node_with_attribute_ex(operation->children, "fault", WSDL_NAMESPACE, "name", f->name, NULL);
- if (soap_fault != NULL) {
- xmlNodePtr trav = soap_fault->children;
- while (trav != NULL) {
- if (node_is_equal_ex(trav, "fault", wsdl_soap_namespace)) {
- xmlAttrPtr tmp;
- sdlSoapBindingFunctionFaultPtr binding;
- binding = f->bindingAttributes = emalloc(sizeof(sdlSoapBindingFunctionFault));
- memset(f->bindingAttributes, 0, sizeof(sdlSoapBindingFunctionFault));
- tmp = get_attribute(trav->properties, "use");
- if (tmp && !strncmp((char*)tmp->children->content, "encoded", sizeof("encoded"))) {
- binding->use = SOAP_ENCODED;
- } else {
- binding->use = SOAP_LITERAL;
- }
- tmp = get_attribute(trav->properties, "namespace");
- if (tmp) {
- binding->ns = estrdup((char*)tmp->children->content);
- }
- if (binding->use == SOAP_ENCODED) {
- tmp = get_attribute(trav->properties, "encodingStyle");
- if (tmp) {
- if (strncmp((char*)tmp->children->content, SOAP_1_1_ENC_NAMESPACE, sizeof(SOAP_1_1_ENC_NAMESPACE)) == 0) {
- binding->encodingStyle = SOAP_ENCODING_1_1;
- } else if (strncmp((char*)tmp->children->content, SOAP_1_2_ENC_NAMESPACE, sizeof(SOAP_1_2_ENC_NAMESPACE)) == 0) {
- binding->encodingStyle = SOAP_ENCODING_1_2;
- } else {
- soap_error1(E_ERROR, "Parsing WSDL: Unknown encodingStyle '%s'", tmp->children->content);
- }
- } else {
- soap_error0(E_ERROR, "Parsing WSDL: Unspecified encodingStyle");
- }
- }
- } else if (is_wsdl_element(trav) && !node_is_equal(trav,"documentation")) {
- soap_error1(E_ERROR, "Parsing WSDL: Unexpected WSDL element <%s>", SAFE_STR(trav->name));
- }
- trav = trav->next;
- }
- }
- }
- if (function->faults == NULL) {
- function->faults = emalloc(sizeof(HashTable));
- zend_hash_init(function->faults, 0, NULL, delete_fault, 0);
- }
- if (zend_hash_str_add_ptr(function->faults, f->name, strlen(f->name), f) == NULL) {
- soap_error2(E_ERROR, "Parsing WSDL: <fault> with name '%s' already defined in '%s'", f->name, op_name->children->content);
- }
- }
- fault = fault->next;
- }
- function->binding = tmpbinding;
- {
- char *tmp = estrdup(function->functionName);
- int len = strlen(tmp);
- zend_str_tolower(tmp, len);
- if (zend_hash_str_add_ptr(&ctx.sdl->functions, tmp, len, function) == NULL) {
- zend_hash_next_index_insert_ptr(&ctx.sdl->functions, function);
- }
- efree(tmp);
- if (function->requestName != NULL && strcmp(function->requestName,function->functionName) != 0) {
- if (ctx.sdl->requests == NULL) {
- ctx.sdl->requests = emalloc(sizeof(HashTable));
- zend_hash_init(ctx.sdl->requests, 0, NULL, NULL, 0);
- }
- tmp = estrdup(function->requestName);
- len = strlen(tmp);
- zend_str_tolower(tmp, len);
- zend_hash_str_add_ptr(ctx.sdl->requests, tmp, len, function);
- efree(tmp);
- }
- }
- trav2 = trav2->next;
- }
- if (!ctx.sdl->bindings) {
- ctx.sdl->bindings = emalloc(sizeof(HashTable));
- zend_hash_init(ctx.sdl->bindings, 0, NULL, delete_binding, 0);
- }
- if (!zend_hash_str_add_ptr(ctx.sdl->bindings, tmpbinding->name, strlen(tmpbinding->name), tmpbinding)) {
- zend_hash_next_index_insert_ptr(ctx.sdl->bindings, tmpbinding);
- }
- trav= trav->next;
- }
- zend_hash_move_forward(&ctx.services);
- }
- } else {
- soap_error0(E_ERROR, "Parsing WSDL: Couldn't bind to service");
- }
- if (ctx.sdl->bindings == NULL || ctx.sdl->bindings->nNumOfElements == 0) {
- soap_error0(E_ERROR, "Parsing WSDL: Could not find any usable binding services in WSDL.");
- }
- } zend_catch {
- /* Avoid persistent memory leak. */
- zend_hash_destroy(&ctx.docs);
- zend_bailout();
- } zend_end_try();
- zend_hash_destroy(&ctx.messages);
- zend_hash_destroy(&ctx.bindings);
- zend_hash_destroy(&ctx.portTypes);
- zend_hash_destroy(&ctx.services);
- zend_hash_destroy(&ctx.docs);
- return ctx.sdl;
- }
- #define WSDL_CACHE_VERSION 0x10
- #define WSDL_CACHE_GET(ret,type,buf) memcpy(&ret,*buf,sizeof(type)); *buf += sizeof(type);
- #define WSDL_CACHE_GET_INT(ret,buf) ret = ((unsigned char)(*buf)[0])|((unsigned char)(*buf)[1]<<8)|((unsigned char)(*buf)[2]<<16)|((unsigned)(*buf)[3]<<24); *buf += 4;
- #define WSDL_CACHE_GET_1(ret,type,buf) ret = (type)(**buf); (*buf)++;
- #define WSDL_CACHE_GET_N(ret,n,buf) memcpy(ret,*buf,n); *buf += n;
- #define WSDL_CACHE_SKIP(n,buf) *buf += n;
- #define WSDL_CACHE_PUT_INT(val,buf) smart_str_appendc(buf,(char)(val & 0xff)); \
- smart_str_appendc(buf,(char)((val >> 8) & 0xff)); \
- smart_str_appendc(buf,(char)((val >> 16) & 0xff)); \
- smart_str_appendc(buf,(char)((val >> 24) & 0xff));
- #define WSDL_CACHE_PUT_1(val,buf) smart_str_appendc(buf,val);
- #define WSDL_CACHE_PUT_N(val,n,buf) smart_str_appendl(buf,(char*)val,n);
- #define WSDL_NO_STRING_MARKER 0x7fffffff
- static char* sdl_deserialize_string(char **in)
- {
- char *s;
- int len;
- WSDL_CACHE_GET_INT(len, in);
- if (len == WSDL_NO_STRING_MARKER) {
- return NULL;
- } else {
- s = emalloc(len+1);
- WSDL_CACHE_GET_N(s, len, in);
- s[len] = '\0';
- return s;
- }
- }
- static void sdl_deserialize_key(HashTable* ht, void* data, char **in)
- {
- int len;
- WSDL_CACHE_GET_INT(len, in);
- if (len == WSDL_NO_STRING_MARKER) {
- zend_hash_next_index_insert_ptr(ht, data);
- } else {
- zend_hash_str_add_ptr(ht, *in, len, data);
- WSDL_CACHE_SKIP(len, in);
- }
- }
- static void sdl_deserialize_attribute(sdlAttributePtr attr, encodePtr *encoders, char **in)
- {
- int i;
- attr->name = sdl_deserialize_string(in);
- attr->namens = sdl_deserialize_string(in);
- attr->ref = sdl_deserialize_string(in);
- attr->def = sdl_deserialize_string(in);
- attr->fixed = sdl_deserialize_string(in);
- WSDL_CACHE_GET_1(attr->form, sdlForm, in);
- WSDL_CACHE_GET_1(attr->use, sdlUse, in);
- WSDL_CACHE_GET_INT(i, in);
- attr->encode = encoders[i];
- WSDL_CACHE_GET_INT(i, in);
- if (i > 0) {
- attr->extraAttributes = emalloc(sizeof(HashTable));
- zend_hash_init(attr->extraAttributes, i, NULL, delete_extra_attribute, 0);
- while (i > 0) {
- sdlExtraAttributePtr x = emalloc(sizeof(sdlExtraAttribute));
- sdl_deserialize_key(attr->extraAttributes, x, in);
- x->ns = sdl_deserialize_string(in);
- x->val = sdl_deserialize_string(in);
- --i;
- }
- }
- }
- static sdlRestrictionIntPtr sdl_deserialize_resriction_int(char **in)
- {
- if (**in == 1) {
- sdlRestrictionIntPtr x = emalloc(sizeof(sdlRestrictionInt));
- WSDL_CACHE_SKIP(1, in);
- WSDL_CACHE_GET_INT(x->value, in);
- WSDL_CACHE_GET_1(x->fixed, char, in);
- return x;
- } else {
- WSDL_CACHE_SKIP(1, in);
- return NULL;
- }
- }
- static sdlRestrictionCharPtr sdl_deserialize_resriction_char(char **in)
- {
- if (**in == 1) {
- sdlRestrictionCharPtr x = emalloc(sizeof(sdlRestrictionChar));
- WSDL_CACHE_SKIP(1, in);
- x->value = sdl_deserialize_string(in);
- WSDL_CACHE_GET_1(x->fixed, char, in);
- return x;
- } else {
- WSDL_CACHE_SKIP(1, in);
- return NULL;
- }
- }
- static sdlContentModelPtr sdl_deserialize_model(sdlTypePtr *types, sdlTypePtr *elements, char **in)
- {
- int i;
- sdlContentModelPtr model = emalloc(sizeof(sdlContentModel));
- WSDL_CACHE_GET_1(model->kind, sdlContentKind, in);
- WSDL_CACHE_GET_INT(model->min_occurs, in);
- WSDL_CACHE_GET_INT(model->max_occurs, in);
- switch (model->kind) {
- case XSD_CONTENT_ELEMENT:
- WSDL_CACHE_GET_INT(i, in);
- model->u.element = elements[i];
- break;
- case XSD_CONTENT_SEQUENCE:
- case XSD_CONTENT_ALL:
- case XSD_CONTENT_CHOICE:
- WSDL_CACHE_GET_INT(i, in);
- model->u.content = emalloc(sizeof(HashTable));
- zend_hash_init(model->u.content, i, NULL, delete_model, 0);
- while (i > 0) {
- sdlContentModelPtr x = sdl_deserialize_model(types, elements, in);
- zend_hash_next_index_insert_ptr(model->u.content, x);
- i--;
- }
- break;
- case XSD_CONTENT_GROUP_REF:
- model->u.group_ref = sdl_deserialize_string(in);
- break;
- case XSD_CONTENT_GROUP:
- WSDL_CACHE_GET_INT(i, in);
- model->u.group = types[i];
- break;
- default:
- break;
- }
- return model;
- }
- static void sdl_deserialize_type(sdlTypePtr type, sdlTypePtr *types, encodePtr *encoders, char **in)
- {
- int i;
- sdlTypePtr *elements = NULL;
- WSDL_CACHE_GET_1(type->kind, sdlTypeKind, in);
- type->name = sdl_deserialize_string(in);
- type->namens = sdl_deserialize_string(in);
- type->def = sdl_deserialize_string(in);
- type->fixed = sdl_deserialize_string(in);
- type->ref = sdl_deserialize_string(in);
- WSDL_CACHE_GET_1(type->nillable, char, in);
- WSDL_CACHE_GET_1(type->form, sdlForm, in);
- WSDL_CACHE_GET_INT(i, in);
- type->encode = encoders[i];
- if (**in == 1) {
- WSDL_CACHE_SKIP(1, in);
- type->restrictions = emalloc(sizeof(sdlRestrictions));
- /*memset(type->restrictions, 0, sizeof(sdlRestrictions));*/
- type->restrictions->minExclusive = sdl_deserialize_resriction_int(in);
- type->restrictions->minInclusive = sdl_deserialize_resriction_int(in);
- type->restrictions->maxExclusive = sdl_deserialize_resriction_int(in);
- type->restrictions->maxInclusive = sdl_deserialize_resriction_int(in);
- type->restrictions->totalDigits = sdl_deserialize_resriction_int(in);
- type->restrictions->fractionDigits = sdl_deserialize_resriction_int(in);
- type->restrictions->length = sdl_deserialize_resriction_int(in);
- type->restrictions->minLength = sdl_deserialize_resriction_int(in);
- type->restrictions->maxLength = sdl_deserialize_resriction_int(in);
- type->restrictions->whiteSpace = sdl_deserialize_resriction_char(in);
- type->restrictions->pattern = sdl_deserialize_resriction_char(in);
- WSDL_CACHE_GET_INT(i, in);
- if (i > 0) {
- type->restrictions->enumeration = emalloc(sizeof(HashTable));
- zend_hash_init(type->restrictions->enumeration, i, NULL, delete_restriction_var_char, 0);
- while (i > 0) {
- sdlRestrictionCharPtr x = sdl_deserialize_resriction_char(in);
- sdl_deserialize_key(type->restrictions->enumeration, x, in);
- --i;
- }
- } else {
- type->restrictions->enumeration = NULL;
- }
- } else {
- WSDL_CACHE_SKIP(1, in);
- }
- WSDL_CACHE_GET_INT(i, in);
- if (i > 0) {
- elements = safe_emalloc((i+1), sizeof(sdlTypePtr), 0);
- elements[0] = NULL;
- type->elements = emalloc(sizeof(HashTable));
- zend_hash_init(type->elements, i, NULL, delete_type, 0);
- while (i > 0) {
- sdlTypePtr t = emalloc(sizeof(sdlType));
- memset(t, 0, sizeof(sdlType));
- sdl_deserialize_key(type->elements, t, in);
- sdl_deserialize_type(t, types, encoders, in);
- elements[i] = t;
- --i;
- }
- }
- WSDL_CACHE_GET_INT(i, in);
- if (i > 0) {
- type->attributes = emalloc(sizeof(HashTable));
- zend_hash_init(type->attributes, i, NULL, delete_attribute, 0);
- while (i > 0) {
- sdlAttributePtr attr = emalloc(sizeof(sdlAttribute));
- memset(attr, 0, sizeof(sdlAttribute));
- sdl_deserialize_key(type->attributes, attr, in);
- sdl_deserialize_attribute(attr, encoders, in);
- --i;
- }
- }
- if (**in != 0) {
- WSDL_CACHE_SKIP(1, in);
- type->model = sdl_deserialize_model(types, elements, in);
- } else {
- WSDL_CACHE_SKIP(1, in);
- }
- if (elements != NULL) {
- efree(elements);
- }
- }
- static void sdl_deserialize_encoder(encodePtr enc, sdlTypePtr *types, char **in)
- {
- int i;
- WSDL_CACHE_GET_INT(enc->details.type, in);
- enc->details.type_str = sdl_deserialize_string(in);
- enc->details.ns = sdl_deserialize_string(in);
- WSDL_CACHE_GET_INT(i, in);
- enc->details.sdl_type = types[i];
- enc->to_xml = sdl_guess_convert_xml;
- enc->to_zval = sdl_guess_convert_zval;
- if (enc->details.sdl_type == NULL) {
- int ns_len = strlen(enc->details.ns);
- int type_len = strlen(enc->details.type_str);
- if (((ns_len == sizeof(SOAP_1_1_ENC_NAMESPACE)-1 &&
- memcmp(enc->details.ns, SOAP_1_1_ENC_NAMESPACE, sizeof(SOAP_1_1_ENC_NAMESPACE)-1) == 0) ||
- (ns_len == sizeof(SOAP_1_2_ENC_NAMESPACE)-1 &&
- memcmp(enc->details.ns, SOAP_1_2_ENC_NAMESPACE, sizeof(SOAP_1_2_ENC_NAMESPACE)-1) == 0))) {
- char *enc_nscat;
- int enc_ns_len;
- int enc_len;
- encodePtr real_enc;
- enc_ns_len = sizeof(XSD_NAMESPACE)-1;
- enc_len = enc_ns_len + type_len + 1;
- enc_nscat = emalloc(enc_len + 1);
- memcpy(enc_nscat, XSD_NAMESPACE, sizeof(XSD_NAMESPACE)-1);
- enc_nscat[enc_ns_len] = ':';
- memcpy(enc_nscat+enc_ns_len+1, enc->details.type_str, type_len);
- enc_nscat[enc_len] = '\0';
- real_enc = get_encoder_ex(NULL, enc_nscat, enc_len);
- efree(enc_nscat);
- if (real_enc) {
- enc->to_zval = real_enc->to_zval;
- enc->to_xml = real_enc->to_xml;
- }
- }
- }
- }
- static void sdl_deserialize_soap_body(sdlSoapBindingFunctionBodyPtr body, encodePtr *encoders, sdlTypePtr *types, char **in)
- {
- int i, j, n;
- WSDL_CACHE_GET_1(body->use, sdlEncodingUse, in);
- if (body->use == SOAP_ENCODED) {
- WSDL_CACHE_GET_1(body->encodingStyle, sdlRpcEncodingStyle, in);
- } else {
- body->encodingStyle = SOAP_ENCODING_DEFAULT;
- }
- body->ns = sdl_deserialize_string(in);
- WSDL_CACHE_GET_INT(i, in);
- if (i > 0) {
- body->headers = emalloc(sizeof(HashTable));
- zend_hash_init(body->headers, i, NULL, delete_header, 0);
- while (i > 0) {
- sdlSoapBindingFunctionHeaderPtr tmp = emalloc(sizeof(sdlSoapBindingFunctionHeader));
- memset(tmp, 0, sizeof(sdlSoapBindingFunctionHeader));
- sdl_deserialize_key(body->headers, tmp, in);
- WSDL_CACHE_GET_1(tmp->use, sdlEncodingUse, in);
- if (tmp->use == SOAP_ENCODED) {
- WSDL_CACHE_GET_1(tmp->encodingStyle, sdlRpcEncodingStyle, in);
- } else {
- tmp->encodingStyle = SOAP_ENCODING_DEFAULT;
- }
- tmp->name = sdl_deserialize_string(in);
- tmp->ns = sdl_deserialize_string(in);
- WSDL_CACHE_GET_INT(n, in);
- tmp->encode = encoders[n];
- WSDL_CACHE_GET_INT(n, in);
- tmp->element = types[n];
- --i;
- WSDL_CACHE_GET_INT(j, in);
- if (j > 0) {
- tmp->headerfaults = emalloc(sizeof(HashTable));
- zend_hash_init(tmp->headerfaults, i, NULL, delete_header, 0);
- while (j > 0) {
- sdlSoapBindingFunctionHeaderPtr tmp2 = emalloc(sizeof(sdlSoapBindingFunctionHeader));
- memset(tmp2, 0, sizeof(sdlSoapBindin…
Large files files are truncated, but you can click here to view the full file