21#include "libxml/uri.h"
34static void delete_fault(
zval *
zv);
35static void delete_fault_persistent(
zval *
zv);
36static void delete_binding(
zval *
zv);
37static void delete_binding_persistent(
zval *
zv);
38static void delete_function(
zval *
zv);
39static void delete_function_persistent(
zval *
zv);
40static void delete_parameter(
zval *
zv);
41static void delete_parameter_persistent(
zval *
zv);
44static void delete_header_persistent(
zval *
zv);
45static void delete_document(
zval *
zv);
55 nsptr = xmlSearchNs(node->doc, node, BAD_CAST(ns));
79 nsptr = xmlSearchNs(node->doc, node, BAD_CAST(ns));
81 size_t ns_len = xmlStrlen(nsptr->href);
82 size_t type_len =
strlen(cptype);
83 size_t len = ns_len + type_len + 1;
86 memcpy(nscat, nsptr->href, ns_len);
88 memcpy(nscat+ns_len+1, cptype, type_len);
91 if ((sdl_type = zend_hash_str_find_ptr(
sdl->elements, nscat,
len)) !=
NULL) {
93 }
else if ((sdl_type = zend_hash_str_find_ptr(
sdl->elements, (
char*)
type, type_len)) !=
NULL) {
98 if ((sdl_type = zend_hash_str_find_ptr(
sdl->elements, (
char*)
type, xmlStrlen(
type))) !=
NULL) {
112 size_t ns_len = ns ?
strlen(ns) : 0;
114 size_t len = ns_len + type_len + 1;
118 memcpy(nscat, ns, ns_len);
136 enc_len = enc_ns_len + type_len + 1;
137 enc_nscat =
emalloc(enc_len + 1);
139 enc_nscat[enc_ns_len] =
':';
140 memcpy(enc_nscat+enc_ns_len+1,
type, type_len);
141 enc_nscat[enc_len] =
'\0';
148 if (
sdl->is_persistent) {
158 if (was_persistent ||
sdl->is_persistent) {
168 zend_hash_str_update_ptr(
sdl->encoders, nscat,
len, new_enc);
182 }
else if (
sdl &&
sdl->encoders && (enc = zend_hash_str_find_ptr(
sdl->encoders, nscat,
len)) !=
NULL) {
188static int is_wsdl_element(xmlNodePtr node)
193 attr->children &&
attr->children->content &&
194 (
strcmp((
char*)
attr->children->content,
"1") == 0 ||
195 strcmp((
char*)
attr->children->content,
"true") == 0)) {
196 soap_error1(
E_ERROR,
"Parsing WSDL: Unknown required WSDL extension '%s'", node->ns->href);
218 l2 =
s ? (size_t)(
s - (
char*)uri) :
strlen((
char*)uri);
253 if (l1 != l2 || memcmp(ctx->
sdl->
source, uri, l1) != 0) {
267 char *rest =
strstr(
s,
"\r\n");
295#define SAFE_STR(a) ((a)?((const char *)a):"")
297static void load_wsdl_ex(
zval *this_ptr,
char *struri,
sdlCtx *ctx,
int include)
301 xmlNodePtr root, definitions, trav;
302 xmlAttrPtr targetNamespace;
304 if (zend_hash_str_exists(&ctx->
docs, struri,
strlen(struri))) {
313 const xmlError *xmlErrorPtr = xmlGetLastError();
316 soap_error2(
E_ERROR,
"Parsing WSDL: Couldn't load from '%s' : %s", struri, xmlErrorPtr->message);
322 zend_hash_str_add_ptr(&ctx->
docs, struri,
strlen(struri), wsdl);
324 root = wsdl->children;
338 targetNamespace =
get_attribute(definitions->properties,
"targetNamespace");
339 if (targetNamespace) {
344 trav = definitions->children;
345 while (trav !=
NULL) {
346 if (!is_wsdl_element(trav)) {
352 xmlNodePtr trav2 = trav->children;
354 while (trav2 !=
NULL) {
357 }
else if (is_wsdl_element(trav2) && !
node_is_equal(trav2,
"documentation")) {
364 xmlAttrPtr tmp =
get_attribute(trav->properties,
"location");
367 load_wsdl_ex(this_ptr, (
char*)uri, ctx, 1);
373 if (
name &&
name->children &&
name->children->content) {
374 if (zend_hash_str_add_ptr(&ctx->
messages, (
char*)
name->children->content, xmlStrlen(
name->children->content), trav) ==
NULL) {
383 if (
name &&
name->children &&
name->children->content) {
384 if (zend_hash_str_add_ptr(&ctx->
portTypes, (
char*)
name->children->content, xmlStrlen(
name->children->content), trav) ==
NULL) {
393 if (
name &&
name->children &&
name->children->content) {
394 if (zend_hash_str_add_ptr(&ctx->
bindings, (
char*)
name->children->content, xmlStrlen(
name->children->content), trav) ==
NULL) {
403 if (
name &&
name->children &&
name->children->content) {
404 if (zend_hash_str_add_ptr(&ctx->
services, (
char*)
name->children->content, xmlStrlen(
name->children->content), trav) ==
NULL) {
420 xmlNodePtr message, part;
431 ctype = (
char*)tmp->children->content;
436 soap_error1(
E_ERROR,
"Parsing WSDL: Missing <message> with name '%s'", tmp->children->content);
445 soap_error1(
E_ERROR,
"Parsing WSDL: Missing part '%s' in <message>", tmp->children->content);
453 if (tmp && !
strncmp((
char*)tmp->children->content,
"encoded",
sizeof(
"encoded"))) {
461 h->
ns =
estrdup((
char*)tmp->children->content);
472 soap_error1(
E_ERROR,
"Parsing WSDL: Unknown encodingStyle '%s'", tmp->children->content);
485 h->
element = get_element(ctx->
sdl, part, tmp->children->content);
499 xmlNodePtr trav =
header->children;
500 while (trav !=
NULL) {
511 smart_str_appends(&
key,hf->
ns);
512 smart_str_appendc(&
key,
':');
514 smart_str_appends(&
key,hf->
name);
517 delete_header_int(hf);
519 smart_str_free(&
key);
520 }
else if (is_wsdl_element(trav) && !
node_is_equal(trav,
"documentation")) {
531 xmlNodePtr
body, trav;
534 trav = node->children;
535 while (trav !=
NULL) {
540 if (tmp && !
strncmp((
char*)tmp->children->content,
"literal",
sizeof(
"literal"))) {
548 binding->
ns =
estrdup((
char*)tmp->children->content);
554 char *parts = (
char*)tmp->children->content;
563 while (*parts ==
' ') ++parts;
564 if (*parts ==
'\0')
break;
574 zend_hash_next_index_insert_ptr(&
ht, x_param);
597 soap_error1(
E_ERROR,
"Parsing WSDL: Unknown encodingStyle '%s'", tmp->children->content);
613 smart_str_appends(&
key,h->
ns);
614 smart_str_appendc(&
key,
':');
616 smart_str_appends(&
key,h->
name);
619 delete_header_int(h);
621 smart_str_free(&
key);
622 }
else if (is_wsdl_element(trav) && !
node_is_equal(trav,
"documentation")) {
631 xmlNodePtr trav, part, message =
NULL, tmp;
637 ctype = (
char*)message_name;
649 trav = message->children;
650 while (trav !=
NULL) {
681 if (element !=
NULL) {
682 param->
element = get_element(ctx->
sdl, part, element->children->content);
689 zend_hash_next_index_insert_ptr(parameters, param);
696static sdlPtr load_wsdl(
zval *this_ptr,
char *struri)
701 memset(&ctx,0,
sizeof(ctx));
714 load_wsdl_ex(this_ptr, struri, &ctx, 0);
717 n = zend_hash_num_elements(&ctx.
services);
719 zend_hash_internal_pointer_reset(&ctx.
services);
720 for (i = 0; i <
n; i++) {
721 xmlNodePtr service, tmp;
722 xmlNodePtr trav, port;
723 int has_soap_port = 0;
727 trav = service->children;
728 while (trav !=
NULL) {
729 xmlAttrPtr
type,
name, bindingAttr, location;
730 xmlNodePtr portType, operation;
731 xmlNodePtr address, binding, trav2;
734 char *wsdl_soap_namespace =
NULL;
736 if (!is_wsdl_element(trav) ||
node_is_equal(trav,
"documentation")) {
750 if (bindingAttr ==
NULL) {
756 trav2 = port->children;
757 while (trav2 !=
NULL) {
779 if (trav2 != address && is_wsdl_element(trav2) && !
node_is_equal(trav2,
"documentation")) {
785 if (has_soap_port || trav->next || i <
n-1) {
789 }
else if (!address) {
802 ctype =
strrchr((
char*)bindingAttr->children->content,
':');
804 ctype = (
char*)bindingAttr->children->content;
815 xmlNodePtr soapBindingNode;
822 soapBindingNode =
get_node_ex(binding->children,
"binding", wsdl_soap_namespace);
823 if (soapBindingNode) {
825 if (tmp && !
strncmp((
char*)tmp->children->content,
"rpc",
sizeof(
"rpc"))) {
829 tmp =
get_attribute(soapBindingNode->properties,
"transport");
868 trav2 = binding->children;
869 while (trav2 !=
NULL) {
871 xmlNodePtr input, output, fault, portTypeOperation, trav3;
872 xmlAttrPtr op_name, paramOrder;
876 !is_wsdl_element(trav2) ||
888 if (op_name ==
NULL) {
892 trav3 = operation->children;
893 while (trav3 !=
NULL) {
896 }
else if (is_wsdl_element(trav3) &&
907 if (portTypeOperation ==
NULL) {
908 soap_error1(
E_ERROR,
"Parsing WSDL: Missing <portType>/<operation> with name '%s'", op_name->children->content);
918 xmlNodePtr soapOperation;
924 soapFunctionBinding->
style = soapBinding->
style;
926 soapOperation =
get_node_ex(operation->children,
"operation", wsdl_soap_namespace);
928 tmp =
get_attribute(soapOperation->properties,
"soapAction");
935 if (!
strncmp((
char*)tmp->children->content,
"rpc",
sizeof(
"rpc"))) {
941 soapFunctionBinding->
style = soapBinding->
style;
945 function->bindingAttributes = (
void *)soapFunctionBinding;
953 if (message ==
NULL) {
954 soap_error1(
E_ERROR,
"Parsing WSDL: Missing name for <input> of '%s'", op_name->children->content);
956 function->requestParameters = wsdl_message(&ctx, message->children->content);
972 wsdl_soap_binding_body(&ctx, input, wsdl_soap_namespace, &soapFunctionBinding->
input,
function->requestParameters);
978 if (output !=
NULL) {
982 if (message ==
NULL) {
983 soap_error1(
E_ERROR,
"Parsing WSDL: Missing name for <output> of '%s'", op_name->children->content);
985 function->responseParameters = wsdl_message(&ctx, message->children->content);
1004 if (output !=
NULL) {
1006 wsdl_soap_binding_body(&ctx, output, wsdl_soap_namespace, &soapFunctionBinding->
output,
function->responseParameters);
1011 paramOrder =
get_attribute(portTypeOperation->properties,
"parameterOrder");
1016 fault = portTypeOperation->children;
1017 while (fault !=
NULL) {
1019 xmlAttrPtr message,
name;
1024 soap_error1(
E_ERROR,
"Parsing WSDL: Missing name for <fault> of '%s'", op_name->children->content);
1027 if (message ==
NULL) {
1028 soap_error1(
E_ERROR,
"Parsing WSDL: Missing name for <output> of '%s'", op_name->children->content);
1035 f->
details = wsdl_message(&ctx, message->children->content);
1037 soap_error1(
E_ERROR,
"Parsing WSDL: The fault message '%s' must have a single part", message->children->content);
1042 if (soap_fault !=
NULL) {
1043 xmlNodePtr trav = soap_fault->children;
1044 while (trav !=
NULL) {
1053 if (tmp && !
strncmp((
char*)tmp->children->content,
"encoded",
sizeof(
"encoded"))) {
1061 binding->
ns =
estrdup((
char*)tmp->children->content);
1072 soap_error1(
E_ERROR,
"Parsing WSDL: Unknown encodingStyle '%s'", tmp->children->content);
1078 }
else if (is_wsdl_element(trav) && !
node_is_equal(trav,
"documentation")) {
1090 soap_error2(
E_ERROR,
"Parsing WSDL: <fault> with name '%s' already defined in '%s'", f->
name, op_name->children->content);
1093 fault = fault->next;
1119 trav2 = trav2->next;
1128 zend_hash_next_index_insert_ptr(ctx.
sdl->
bindings, tmpbinding);
1133 zend_hash_move_forward(&ctx.
services);
1140 soap_error0(
E_ERROR,
"Parsing WSDL: Could not find any usable binding services in WSDL.");
1158#define WSDL_CACHE_VERSION 0x10
1160#define WSDL_CACHE_GET(ret,type,buf) memcpy(&ret,*buf,sizeof(type)); *buf += sizeof(type);
1161#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;
1162#define WSDL_CACHE_GET_1(ret,type,buf) ret = (type)(**buf); (*buf)++;
1163#define WSDL_CACHE_GET_N(ret,n,buf) memcpy(ret,*buf,n); *buf += n;
1164#define WSDL_CACHE_SKIP(n,buf) *buf += n;
1166#define WSDL_CACHE_PUT_INT(val,buf) smart_str_appendc(buf,(char)(val & 0xff)); \
1167 smart_str_appendc(buf,(char)((val >> 8) & 0xff)); \
1168 smart_str_appendc(buf,(char)((val >> 16) & 0xff)); \
1169 smart_str_appendc(buf,(char)((val >> 24) & 0xff));
1170#define WSDL_CACHE_PUT_1(val,buf) smart_str_appendc(buf,val);
1171#define WSDL_CACHE_PUT_N(val,n,buf) smart_str_appendl(buf,val,n);
1173#define WSDL_NO_STRING_MARKER 0x7fffffff
1175static char* sdl_deserialize_string(
char **in)
1197 zend_hash_next_index_insert_ptr(
ht,
data);
1199 zend_hash_str_add_ptr(
ht, *in,
len,
data);
1208 attr->name = sdl_deserialize_string(in);
1209 attr->namens = sdl_deserialize_string(in);
1210 attr->ref = sdl_deserialize_string(in);
1211 attr->def = sdl_deserialize_string(in);
1212 attr->fixed = sdl_deserialize_string(in);
1216 attr->encode = encoders[i];
1223 sdl_deserialize_key(
attr->extraAttributes, x, in);
1224 x->
ns = sdl_deserialize_string(in);
1225 x->
val = sdl_deserialize_string(in);
1250 x->
value = sdl_deserialize_string(in);
1267 switch (model->
kind) {
1280 zend_hash_next_index_insert_ptr(model->
u.
content, x);
1285 model->
u.
group_ref = sdl_deserialize_string(in);
1303 type->name = sdl_deserialize_string(in);
1304 type->namens = sdl_deserialize_string(in);
1305 type->def = sdl_deserialize_string(in);
1306 type->fixed = sdl_deserialize_string(in);
1307 type->ref = sdl_deserialize_string(in);
1312 type->encode = encoders[i];
1318 type->restrictions->minExclusive = sdl_deserialize_resriction_int(in);
1319 type->restrictions->minInclusive = sdl_deserialize_resriction_int(in);
1320 type->restrictions->maxExclusive = sdl_deserialize_resriction_int(in);
1321 type->restrictions->maxInclusive = sdl_deserialize_resriction_int(in);
1322 type->restrictions->totalDigits = sdl_deserialize_resriction_int(in);
1323 type->restrictions->fractionDigits = sdl_deserialize_resriction_int(in);
1324 type->restrictions->length = sdl_deserialize_resriction_int(in);
1325 type->restrictions->minLength = sdl_deserialize_resriction_int(in);
1326 type->restrictions->maxLength = sdl_deserialize_resriction_int(in);
1327 type->restrictions->whiteSpace = sdl_deserialize_resriction_char(in);
1328 type->restrictions->pattern = sdl_deserialize_resriction_char(in);
1335 sdl_deserialize_key(
type->restrictions->enumeration, x, in);
1339 type->restrictions->enumeration =
NULL;
1354 sdl_deserialize_key(
type->elements, t, in);
1355 sdl_deserialize_type(t,
types, encoders, in);
1368 sdl_deserialize_key(
type->attributes,
attr, in);
1369 sdl_deserialize_attribute(
attr, encoders, in);
1376 type->model = sdl_deserialize_model(
types, elements, in);
1380 if (elements !=
NULL) {
1391 enc->
details.
ns = sdl_deserialize_string(in);
1414 enc_len = enc_ns_len + type_len + 1;
1415 enc_nscat =
emalloc(enc_len + 1);
1417 enc_nscat[enc_ns_len] =
':';
1419 enc_nscat[enc_len] =
'\0';
1441 body->ns = sdl_deserialize_string(in);
1449 sdl_deserialize_key(
body->headers, tmp, in);
1456 tmp->
name = sdl_deserialize_string(in);
1457 tmp->
ns = sdl_deserialize_string(in);
1479 tmp2->
name = sdl_deserialize_string(in);
1480 tmp2->
ns = sdl_deserialize_string(in);
1499 if (i == 0) {
return NULL;}
1504 sdl_deserialize_key(
ht, param, in);
1505 param->
paramName = sdl_deserialize_string(in);
1516static sdlPtr get_sdl_from_cache(
const char *fn,
const char *uri,
size_t uri_len, time_t t, time_t *cached)
1520 int i, num_groups, num_types, num_elements, num_encoders, num_bindings, num_func;
1535 if (
fstat(f, &st) != 0) {
1540 if (read(f, in, st.st_size) != st.st_size) {
1563 if (i != uri_len ||
strncmp(in, uri, i) != 0) {
1573 sdl->source = sdl_deserialize_string(&in);
1574 sdl->target_ns = sdl_deserialize_string(&in);
1581 i = num_groups+num_types+num_elements;
1610 if (num_groups > 0) {
1613 while (i < num_groups+1) {
1614 sdl_deserialize_key(
sdl->groups,
types[i], &in);
1615 sdl_deserialize_type(
types[i],
types, encoders, &in);
1620 if (num_types > 0) {
1623 while (i < num_groups+num_types+1) {
1624 sdl_deserialize_key(
sdl->types,
types[i], &in);
1625 sdl_deserialize_type(
types[i],
types, encoders, &in);
1630 if (num_elements > 0) {
1633 while (i < num_groups+num_types+num_elements+1) {
1634 sdl_deserialize_key(
sdl->elements,
types[i], &in);
1635 sdl_deserialize_type(
types[i],
types, encoders, &in);
1641 if (num_encoders > 0) {
1644 while (i < num_encoders+1) {
1645 sdl_deserialize_key(
sdl->encoders, encoders[i], &in);
1646 sdl_deserialize_encoder(encoders[i],
types, &in);
1654 if (num_bindings > 0) {
1657 for (i = 0; i < num_bindings; i++) {
1660 sdl_deserialize_key(
sdl->bindings, binding, &in);
1661 binding->
name = sdl_deserialize_string(&in);
1662 binding->
location = sdl_deserialize_string(&in);
1671 bindings[i] = binding;
1680 for (i = 0; i < num_func; i++) {
1681 int binding_num, num_faults;
1683 sdl_deserialize_key(&
sdl->functions,
func, &in);
1684 func->functionName = sdl_deserialize_string(&in);
1685 func->requestName = sdl_deserialize_string(&in);
1686 func->responseName = sdl_deserialize_string(&in);
1689 if (binding_num == 0) {
1692 func->binding = bindings[binding_num-1];
1698 binding->
soapAction = sdl_deserialize_string(&in);
1699 sdl_deserialize_soap_body(&binding->
input, encoders,
types, &in);
1700 sdl_deserialize_soap_body(&binding->
output, encoders,
types, &in);
1706 func->requestParameters = sdl_deserialize_parameters(encoders,
types, &in);
1707 func->responseParameters = sdl_deserialize_parameters(encoders,
types, &in);
1710 if (num_faults > 0) {
1716 for (
j = 0;
j < num_faults;
j++) {
1719 sdl_deserialize_key(
func->faults, fault, &in);
1720 fault->name =sdl_deserialize_string(&in);
1721 fault->details =sdl_deserialize_parameters(encoders,
types, &in);
1731 binding->
ns = sdl_deserialize_string(&in);
1734 fault->bindingAttributes =
NULL;
1753 sdl_deserialize_key(
sdl->requests,
functions[function_num-1], &in);
1768static void sdl_serialize_string(
const char *str,
smart_str *
out)
1795 if ((encoder_num =
zend_hash_str_find(tmp_encoders, (
const char*)&enc,
sizeof(enc))) != 0) {
1822 sdl_serialize_string(
attr->name,
out);
1823 sdl_serialize_string(
attr->namens,
out);
1824 sdl_serialize_string(
attr->ref,
out);
1825 sdl_serialize_string(
attr->def,
out);
1826 sdl_serialize_string(
attr->fixed,
out);
1829 sdl_serialize_encoder_ref(
attr->encode, tmp_encoders,
out);
1830 if (
attr->extraAttributes) {
1831 i = zend_hash_num_elements(
attr->extraAttributes);
1841 sdl_serialize_key(
key,
out);
1842 sdl_serialize_string(tmp->
ns,
out);
1843 sdl_serialize_string(tmp->
val,
out);
1853 switch (model->
kind) {
1855 sdl_serialize_type_ref(model->
u.
element, tmp_elements,
out);
1861 size_t i = zend_hash_num_elements(model->
u.
content);
1865 sdl_serialize_model(tmp, tmp_types, tmp_elements,
out);
1873 sdl_serialize_type_ref(model->
u.
group, tmp_types,
out);
1895 sdl_serialize_string(x->
value,
out);
1908 sdl_serialize_string(
type->name,
out);
1909 sdl_serialize_string(
type->namens,
out);
1910 sdl_serialize_string(
type->def,
out);
1911 sdl_serialize_string(
type->fixed,
out);
1912 sdl_serialize_string(
type->ref,
out);
1915 sdl_serialize_encoder_ref(
type->encode, tmp_encoders,
out);
1917 if (
type->restrictions) {
1919 sdl_serialize_resriction_int(
type->restrictions->minExclusive,
out);
1920 sdl_serialize_resriction_int(
type->restrictions->minInclusive,
out);
1921 sdl_serialize_resriction_int(
type->restrictions->maxExclusive,
out);
1922 sdl_serialize_resriction_int(
type->restrictions->maxInclusive,
out);
1923 sdl_serialize_resriction_int(
type->restrictions->totalDigits,
out);
1924 sdl_serialize_resriction_int(
type->restrictions->fractionDigits,
out);
1925 sdl_serialize_resriction_int(
type->restrictions->length,
out);
1926 sdl_serialize_resriction_int(
type->restrictions->minLength,
out);
1927 sdl_serialize_resriction_int(
type->restrictions->maxLength,
out);
1928 sdl_serialize_resriction_char(
type->restrictions->whiteSpace,
out);
1929 sdl_serialize_resriction_char(
type->restrictions->pattern,
out);
1930 if (
type->restrictions->enumeration) {
1931 i = zend_hash_num_elements(
type->restrictions->enumeration);
1941 sdl_serialize_resriction_char(tmp,
out);
1942 sdl_serialize_key(
key,
out);
1948 if (
type->elements) {
1949 i = zend_hash_num_elements(
type->elements);
1963 sdl_serialize_key(
key,
out);
1964 sdl_serialize_type(tmp, tmp_encoders, tmp_types,
out);
1971 if (
type->attributes) {
1972 i = zend_hash_num_elements(
type->attributes);
1982 sdl_serialize_key(
key,
out);
1983 sdl_serialize_attribute(tmp, tmp_encoders,
out);
1988 sdl_serialize_model(
type->model, tmp_types, tmp_elements,
out);
1992 if (tmp_elements !=
NULL) {
1994 efree(tmp_elements);
2011 i = zend_hash_num_elements(
ht);
2021 sdl_serialize_key(
key,
out);
2024 sdl_serialize_encoder_ref(tmp->
encode, tmp_encoders,
out);
2025 sdl_serialize_type_ref(tmp->
element, tmp_types,
out);
2038 sdl_serialize_string(
body->ns,
out);
2039 if (
body->headers) {
2040 i = zend_hash_num_elements(
body->headers);
2050 sdl_serialize_key(
key,
out);
2055 sdl_serialize_string(tmp->
name,
out);
2056 sdl_serialize_string(tmp->
ns,
out);
2057 sdl_serialize_encoder_ref(tmp->
encode, tmp_encoders,
out);
2058 sdl_serialize_type_ref(tmp->
element, tmp_types,
out);
2070 sdl_serialize_key(key_inner,
out);
2075 sdl_serialize_string(tmp2->
name,
out);
2076 sdl_serialize_string(tmp2->
ns,
out);
2077 sdl_serialize_encoder_ref(tmp2->
encode, tmp_encoders,
out);
2078 sdl_serialize_type_ref(tmp2->
element, tmp_types,
out);
2085static void add_sdl_to_cache(
const char *fn,
const char *uri, time_t t,
sdlPtr sdl)
2091 int encoder_num = 1;
2104 if (f < 0) {
return;}
2116 sdl_serialize_string(uri,
out);
2117 sdl_serialize_string(
sdl->source,
out);
2118 sdl_serialize_string(
sdl->target_ns,
out);
2121 i = zend_hash_num_elements(
sdl->groups);
2138 i = zend_hash_num_elements(
sdl->types);
2154 if (
sdl->elements) {
2155 i = zend_hash_num_elements(
sdl->elements);
2171 if (
sdl->encoders) {
2172 i = zend_hash_num_elements(
sdl->encoders);
2202 sdl_serialize_key(
key,
out);
2203 sdl_serialize_type(tmp, &tmp_encoders, &tmp_types,
out);
2212 sdl_serialize_key(
key,
out);
2213 sdl_serialize_type(tmp, &tmp_encoders, &tmp_types,
out);
2217 if (
sdl->elements) {
2222 sdl_serialize_key(
key,
out);
2223 sdl_serialize_type(tmp, &tmp_encoders, &tmp_types,
out);
2227 if (
sdl->encoders) {
2232 sdl_serialize_key(
key,
out);
2233 sdl_serialize_encoder(tmp, &tmp_types,
out);
2238 if (
sdl->bindings) {
2239 i = zend_hash_num_elements(
sdl->bindings);
2246 int binding_num = 1;
2251 sdl_serialize_key(
key,
out);
2252 sdl_serialize_string(tmp->
name,
out);
2270 i = zend_hash_num_elements(&
sdl->functions);
2275 int function_num = 1;
2279 sdl_serialize_key(
key,
out);
2293 sdl_serialize_soap_body(&binding->
input, &tmp_encoders, &tmp_types,
out);
2294 sdl_serialize_soap_body(&binding->
output, &tmp_encoders, &tmp_types,
out);
2311 sdl_serialize_key(key_inner,
out);
2312 sdl_serialize_string(fault->name,
out);
2313 sdl_serialize_parameters(fault->details, &tmp_encoders, &tmp_types,
out);
2320 sdl_serialize_string(binding->ns,
out);
2336 if (
sdl->requests) {
2337 i = zend_hash_num_elements(
sdl->requests);
2350 sdl_serialize_key(
key,
out);
2365 smart_str_free(&
buf);
2374static void make_persistent_restriction_int(
void *
data)
2391 prest->
value = strdup((*rest)->value);
2392 prest->
fixed = (*rest)->fixed;
2401 if ((tmp = zend_hash_str_find_ptr(ptr_map, (
char *)
type,
sizeof(
sdlTypePtr))) !=
NULL) {
2404 zend_hash_next_index_insert_ptr(bp_types, *
type);
2418 if ((tmp = zend_hash_str_find_ptr(ptr_map, (
char *)enc,
sizeof(
encodePtr))) !=
NULL) {
2421 zend_hash_next_index_insert_ptr(bp_encoders, enc);
2435 zend_hash_init(pheaders, zend_hash_num_elements(headers),
NULL, delete_header_persistent, 1);
2442 if (pheader->
name) {
2443 pheader->
name = strdup(pheader->
name);
2446 pheader->
ns = strdup(pheader->
ns);
2450 if ((penc = zend_hash_str_find_ptr(ptr_map, (
char*)&pheader->
encode,
sizeof(
encodePtr))) ==
NULL) {
2456 if ((ptype = zend_hash_str_find_ptr(ptr_map, (
char*)&pheader->
element,
sizeof(
sdlTypePtr))) ==
NULL) {
2470 zend_hash_next_index_insert_ptr(pheaders, pheader);
2484 if (
body->headers) {
2485 body->headers = make_persistent_sdl_function_headers(
body->headers, ptr_map);
2499 zend_hash_init(pparams, zend_hash_num_elements(params),
NULL, delete_parameter_persistent, 1);
2511 if ((penc = zend_hash_str_find_ptr(ptr_map, (
char*)&pparam->
encode,
sizeof(
encodePtr))) ==
NULL) {
2517 if ((ptype = zend_hash_str_find_ptr(ptr_map, (
char*)&pparam->
element,
sizeof(
sdlTypePtr))) ==
NULL) {
2527 zend_hash_next_index_insert_ptr(pparams, pparam);
2541 zend_hash_init(pfaults, zend_hash_num_elements(faults),
NULL, delete_fault_persistent, 1);
2549 pfault->
name = strdup(pfault->
name);
2552 pfault->
details = make_persistent_sdl_parameters(pfault->
details, ptr_map);
2561 if (soap_binding->
ns) {
2562 soap_binding->
ns = strdup(soap_binding->
ns);
2571 zend_hash_next_index_insert_ptr(pfaults, pfault);
2597 pattr->
ref = strdup(pattr->
ref);
2600 pattr->
def = strdup(pattr->
def);
2608 make_persistent_sdl_encoder_ref(&pattr->
encode, ptr_map, bp_encoders);
2623 pextra->
ns = strdup(tmp->
ns);
2626 pextra->
val = strdup(tmp->
val);
2648 switch (pmodel->
kind) {
2651 make_persistent_sdl_type_ref(&pmodel->
u.
element, ptr_map, bp_types);
2662 pcontent = make_persistent_sdl_model(tmp, ptr_map, bp_types, bp_encoders);
2663 zend_hash_next_index_insert_ptr(pmodel->
u.
content, pcontent);
2675 make_persistent_sdl_type_ref(&pmodel->
u.
group, ptr_map, bp_types);
2692 ptype = malloc(
sizeof(
sdlType));
2704 ptype->
def = strdup(ptype->
def);
2710 ptype->
ref = strdup(ptype->
ref);
2715 make_persistent_sdl_encoder_ref(&ptype->
encode, ptr_map, bp_encoders);
2757 if (
type->restrictions->enumeration) {
2763 make_persistent_restriction_char_int(&penum);
2777 pelem = make_persistent_sdl_type(tmp, ptr_map, bp_types, bp_encoders);
2782 zend_hash_next_index_insert_ptr(ptype->
elements, pelem);
2784 zend_hash_str_add_ptr(ptr_map, (
char*)&tmp,
sizeof(tmp), pelem);
2795 pattr = make_persistent_sdl_attribute(tmp, ptr_map, bp_types, bp_encoders);
2800 zend_hash_next_index_insert_ptr(ptype->
attributes, pattr);
2806 ptype->
model = make_persistent_sdl_model(ptype->
model, ptr_map, bp_types, bp_encoders);
2816 penc = malloc(
sizeof(
encode));
2830 make_persistent_sdl_type_ref(&penc->
details.
sdl_type, ptr_map, bp_types);
2886 if ((tmp = zend_hash_str_find_ptr(ptr_map, (
char*)&pfunc->
binding,
sizeof(pfunc->
binding))) ==
NULL) {
2900 make_persistent_sdl_soap_body(&soap_binding->
input, ptr_map);
2901 make_persistent_sdl_soap_body(&soap_binding->
output, ptr_map);
2912 pfunc->
faults = make_persistent_sdl_function_faults(pfunc, pfunc->
faults, ptr_map);
2930 psdl = malloc(
sizeof(*
sdl));
2936 if (
sdl->target_ns) {
2948 ptype = make_persistent_sdl_type(tmp, &ptr_map, &bp_types, &bp_encoders);
2953 zend_hash_next_index_insert_ptr(psdl->
groups, ptype);
2955 zend_hash_str_add_ptr(&ptr_map, (
char*)&tmp,
sizeof(tmp), ptype);
2967 ptype = make_persistent_sdl_type(tmp, &ptr_map, &bp_types, &bp_encoders);
2972 zend_hash_next_index_insert_ptr(psdl->
types, ptype);
2974 zend_hash_str_add_ptr(&ptr_map, (
char*)&tmp,
sizeof(tmp), ptype);
2978 if (
sdl->elements) {
2986 ptype = make_persistent_sdl_type(tmp, &ptr_map, &bp_types, &bp_encoders);
2991 zend_hash_next_index_insert_ptr(psdl->
elements, ptype);
2993 zend_hash_str_add_ptr(&ptr_map, (
char*)&tmp,
sizeof(tmp), ptype);
2997 if (
sdl->encoders) {
3005 penc = make_persistent_sdl_encoder(tmp, &ptr_map, &bp_types, &bp_encoders);
3010 zend_hash_next_index_insert_ptr(psdl->
encoders, penc);
3012 zend_hash_str_add_ptr(&ptr_map, (
char*)&tmp,
sizeof(tmp), penc);
3017 if (zend_hash_num_elements(&bp_types)) {
3021 if ((ptype = zend_hash_str_find_ptr(&ptr_map, (
char*)tmp,
sizeof(*tmp))) ==
NULL) {
3027 if (zend_hash_num_elements(&bp_encoders)) {
3031 if ((penc = zend_hash_str_find_ptr(&ptr_map, (
char*)tmp,
sizeof(*tmp))) ==
NULL) {
3039 if (
sdl->bindings) {
3047 pbind = make_persistent_sdl_binding(tmp, &ptr_map);
3052 zend_hash_next_index_insert_ptr(psdl->
bindings, pbind);
3054 zend_hash_str_add_ptr(&ptr_map, (
char*)&tmp,
sizeof(tmp), pbind);
3059 if (zend_hash_num_elements(&
sdl->functions)) {
3064 pfunc = make_persistent_sdl_function(tmp, &ptr_map);
3069 zend_hash_next_index_insert_ptr(&psdl->
functions, pfunc);
3071 zend_hash_str_add_ptr(&ptr_map, (
char*)&tmp,
sizeof(tmp), pfunc);
3075 if (
sdl->requests) {
3085 if ((preq = zend_hash_str_find_ptr(&ptr_map, (
char*)&tmp,
sizeof(tmp))) ==
NULL) {
3146static void delete_psdl(
zval *
zv)
3159 zval *tmp, orig_context, new_context;
3163 bool has_proxy_authorization = 0;
3164 bool has_authorization = 0;
3194 unsigned char digest[16];
3198 size_t user_len = user ?
strlen(user) + 1 : 0;
3205 key =
emalloc(
len+
sizeof(
"/wsdl-")-1+user_len+2+
sizeof(md5str));
3208 len +=
sizeof(
"/wsdl-")-1;
3229 goto cache_in_memory;
3244 smart_str_appends(&headers,
"User-Agent: ");
3245 smart_str_appends(&headers,
Z_STRVAL_P(tmp));
3246 smart_str_appends(&headers,
"\r\n");
3254 smart_str_appends(&proxy,
"tcp://");
3255 smart_str_appends(&proxy,
Z_STRVAL_P(proxy_host));
3256 smart_str_appends(&proxy,
":");
3257 smart_str_append_long(&proxy,
Z_LVAL_P(proxy_port));
3258 ZVAL_STR(&str_proxy, smart_str_extract(&proxy));
3266 if (uri_len <
sizeof(
"https://")-1 ||
3267 strncasecmp(uri,
"https://",
sizeof(
"https://")-1) != 0) {
3288 smart_str_appendl(&headers,
"Connection: close\r\n",
sizeof(
"Connection: close\r\n")-1);
3300 ZVAL_STR(&str_headers, smart_str_extract(&headers));
3307 php_libxml_switch_context(&new_context, &orig_context);
3312 sdl = load_wsdl(this_ptr, uri);
3314 sdl->is_persistent = 0;
3320 php_libxml_switch_context(&orig_context,
NULL);
3326 add_sdl_to_cache(
key, uri, t,
sdl);
3348 if (q->
time < latest) {
3360 psdl = make_persistent_sdl(
sdl);
3418 if (!
handle->is_persistent) {
3430 if (binding->
name) {
3443static void delete_binding(
zval *
zv)
3445 delete_binding_ex(
zv,
false);
3448static void delete_binding_persistent(
zval *
zv)
3450 delete_binding_ex(
zv,
true);
3481 if (
function->responseParameters) {
3496 delete_sdl_soap_binding_function_body(soapFunction->
input,
persistent);
3503static void delete_function(
zval *
zv)
3505 delete_function_ex(
zv,
false);
3508static void delete_function_persistent(
zval *
zv)
3510 delete_function_ex(
zv,
true);
3522static void delete_parameter(
zval *
zv)
3524 delete_parameter_ex(
zv,
false);
3527static void delete_parameter_persistent(
zval *
zv)
3529 delete_parameter_ex(
zv,
true);
3549 delete_header_int_ex(hdr,
false);
3552static void delete_header(
zval *
zv)
3555 delete_header_int_ex(hdr,
false);
3558static void delete_header_persistent(
zval *
zv)
3561 delete_header_int_ex(hdr,
true);
3570 if (fault->details) {
3574 if (fault->bindingAttributes) {
3585static void delete_fault(
zval *
zv)
3587 delete_fault_ex(
zv,
false);
3590static void delete_fault_persistent(
zval *
zv)
3592 delete_fault_ex(
zv,
true);
3595static void delete_document(
zval *
zv)
unlink(string $filename, $context=null)
strrchr(string $haystack, string $needle, bool $before_needle=false)
header(string $header, bool $replace=true, int $response_code=0)
strstr(string $haystack, string $needle, bool $before_needle=false)
assert(mixed $assertion, Throwable|string|null $description=null)
strchr(string $haystack, string $needle, bool $before_needle=false)
memset(ptr, 0, type->size)
zend_ffi_ctype_name_buf buf
PHPAPI char * php_get_current_user(void)
PHPAPI void make_digest(char *md5str, const unsigned char *digest)
PHPAPI void PHP_MD5Final(unsigned char *result, PHP_MD5_CTX *ctx)
PHPAPI void PHP_MD5Update(PHP_MD5_CTX *ctx, const void *data, size_t size)
void delete_encoder(zval *zv)
void delete_encoder_persistent(zval *zv)
xmlNodePtr sdl_guess_convert_xml(encodeTypePtr enc, zval *data, int style, xmlNodePtr parent)
zval * sdl_guess_convert_zval(zval *ret, encodeTypePtr enc, xmlNodePtr data)
#define WSDL_SOAP12_NAMESPACE
#define WSDL_HTTP11_NAMESPACE
#define WSDL_SOAP11_NAMESPACE
#define RPC_SOAP12_NAMESPACE
#define WSDL_HTTP_TRANSPORT
#define SOAP_1_1_ENC_NAMESPACE
#define WSDL_HTTP12_NAMESPACE
#define SOAP_1_2_ENC_NAMESPACE
unsigned const char * end
int basic_authentication(zval *this_ptr, smart_str *soap_headers)
void http_context_headers(php_stream_context *context, bool has_authorization, bool has_proxy_authorization, bool has_cookies, smart_str *soap_headers)
int proxy_authentication(zval *this_ptr, smart_str *soap_headers)
php_json_error_code error_code
PHPAPI int php_open_temporary_fd_ex(const char *dir, const char *pfx, zend_string **opened_path_p, uint32_t flags)
#define PHP_TMP_FILE_SILENT
unsigned char key[REFLECTION_KEY_LEN]
void schema_pass2(sdlCtx *ctx)
void delete_type(zval *zv)
void delete_restriction_var_char(zval *zv)
void delete_attribute(zval *zv)
void delete_model(zval *zv)
void delete_model_persistent(zval *zv)
void delete_restriction_var_char_persistent(zval *zv)
void delete_extra_attribute(zval *zv)
void delete_extra_attribute_persistent(zval *zv)
int load_schema(sdlCtx *ctx, xmlNodePtr schema)
xmlChar * schema_location_construct_uri(const xmlAttr *attribute)
void delete_type_persistent(zval *zv)
void delete_attribute_persistent(zval *zv)
#define WSDL_NO_STRING_MARKER
#define WSDL_CACHE_VERSION
encodePtr get_encoder_ex(sdlPtr sdl, const char *nscat, size_t len)
struct _sdl_cache_bucket sdl_cache_bucket
void sdl_set_uri_credentials(sdlCtx *ctx, char *uri)
#define WSDL_CACHE_GET_INT(ret, buf)
void sdl_restore_uri_credentials(sdlCtx *ctx)
#define WSDL_CACHE_PUT_1(val, buf)
void delete_sdl(sdl *handle)
#define WSDL_CACHE_PUT_N(val, n, buf)
#define WSDL_CACHE_GET_N(ret, n, buf)
void delete_sdl_impl(void *handle)
#define WSDL_CACHE_GET_1(ret, type, buf)
#define WSDL_CACHE_SKIP(n, buf)
encodePtr get_encoder(sdlPtr sdl, const char *ns, const char *type)
#define WSDL_CACHE_PUT_INT(val, buf)
encodePtr get_encoder_from_prefix(sdlPtr sdl, xmlNodePtr node, const xmlChar *type)
#define WSDL_CACHE_GET(ret, type, buf)
sdlPtr get_sdl(zval *this_ptr, char *uri, zend_long cache_wsdl)
struct _sdlContentModel * sdlContentModelPtr
struct _sdlContentModel sdlContentModel
enum _sdlTypeKind sdlTypeKind
enum _sdlRpcEncodingStyle sdlRpcEncodingStyle
struct _sdlFault * sdlFaultPtr
enum _sdlEncodingStyle sdlEncodingStyle
enum _sdlEncodingUse sdlEncodingUse
struct _sdlFault sdlFault
enum _sdlBindingType sdlBindingType
struct _sdlSoapBindingFunctionFault sdlSoapBindingFunctionFault
struct _sdlExtraAttribute sdlExtraAttribute
struct _sdlSoapBindingFunctionHeader * sdlSoapBindingFunctionHeaderPtr
struct _sdlSoapBindingFunctionHeader sdlSoapBindingFunctionHeader
enum _sdlTransport sdlTransport
enum _sdlContentKind sdlContentKind
struct _sdlSoapBindingFunctionFault * sdlSoapBindingFunctionFaultPtr
struct _sdlExtraAttribute * sdlExtraAttributePtr
struct _sdlFunction sdlFunction
struct _sdlSoapBinding sdlSoapBinding
#define WSDL_CACHE_MEMORY
struct _sdlRestrictionChar * sdlRestrictionCharPtr
#define Z_CLIENT_PROXY_PORT_P(zv)
#define Z_CLIENT_USER_AGENT_P(zv)
struct _encode * encodePtr
struct _sdlRestrictionChar sdlRestrictionChar
#define soap_error2(severity, format, param1, param2)
struct _sdlBinding sdlBinding
#define soap_error1(severity, format, param1)
struct _sdlRestrictions sdlRestrictions
struct _sdlFunction * sdlFunctionPtr
struct _sdlSoapBindingFunctionBody sdlSoapBindingFunctionBody
struct _sdlRestrictionInt * sdlRestrictionIntPtr
struct _sdlRestrictionInt sdlRestrictionInt
zend_class_entry * soap_class_entry
struct _sdlBinding * sdlBindingPtr
struct _sdlSoapBindingFunction sdlSoapBindingFunction
struct _sdlSoapBindingFunction * sdlSoapBindingFunctionPtr
struct _sdlType * sdlTypePtr
struct _sdlAttribute sdlAttribute
#define Z_CLIENT_PROXY_HOST_P(zv)
#define Z_CLIENT_STREAM_CONTEXT_P(zv)
#define soap_error0(severity, format)
struct _sdlAttribute * sdlAttributePtr
struct _sdlParam sdlParam
struct _sdlParam * sdlParamPtr
struct _sdlSoapBinding * sdlSoapBindingPtr
struct _sdlSoapBindingFunctionBody * sdlSoapBindingFunctionBodyPtr
#define php_stream_context_from_zval(zcontext, nocontext)
PHPAPI zval * php_stream_context_get_option(php_stream_context *context, const char *wrappername, const char *optionname)
PHPAPI php_stream_context * php_stream_context_alloc(void)
PHPAPI void php_stream_context_set_option(php_stream_context *context, const char *wrappername, const char *optionname, zval *optionvalue)
struct _php_stream_context php_stream_context
int node_is_equal_ex(xmlNodePtr node, char *name, char *ns)
void parse_namespace(const xmlChar *inval, const char **value, char **namespace)
xmlDocPtr soap_xmlParseFile(const char *filename)
xmlNodePtr get_node_with_attribute_ex(xmlNodePtr node, char *name, char *name_ns, char *attribute, char *value, char *attr_ns)
xmlNodePtr get_node_ex(xmlNodePtr node, char *name, char *ns)
xmlAttrPtr get_attribute_ex(xmlAttrPtr node, char *name, char *ns)
#define zend_hash_str_add(...)
#define node_is_equal(node, name)
#define get_attribute(node, name)
zend_string * clark_notation
xmlNodePtr(* to_xml)(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
zval *(* to_zval)(zval *ret, encodeTypePtr type, xmlNodePtr data)
HashTable * extraAttributes
sdlBindingType bindingType
union _sdlContentModel::@136103057302222375117000326337202052042061025370 u
HashTable * responseParameters
struct _sdlBinding * binding
HashTable * requestParameters
sdlRestrictionIntPtr minInclusive
sdlRestrictionIntPtr length
sdlRestrictionIntPtr maxExclusive
sdlRestrictionCharPtr pattern
sdlRestrictionIntPtr minExclusive
sdlRestrictionIntPtr minLength
sdlRestrictionIntPtr maxLength
sdlRestrictionCharPtr whiteSpace
sdlRestrictionIntPtr maxInclusive
sdlRestrictionIntPtr totalDigits
sdlRestrictionIntPtr fractionDigits
sdlRpcEncodingStyle encodingStyle
sdlRpcEncodingStyle encodingStyle
sdlSoapBindingFunctionBody input
sdlSoapBindingFunctionBody output
sdlRestrictionsPtr restrictions
php_stream_context * context
ZEND_API zend_string * zend_strpprintf(size_t max_len, const char *format,...)
ZEND_API char *ZEND_FASTCALL zend_strndup(const char *s, size_t length)
#define estrndup(s, length)
#define pefree(ptr, persistent)
#define pemalloc(size, persistent)
#define safe_emalloc(nmemb, size, offset)
strncmp(string $string1, string $string2, int $length)
strcmp(string $string1, string $string2)
zend_string_release_ex(func->internal_function.function_name, 0)
#define strncasecmp(s1, s2, n)
ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht)
ZEND_API zval *ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char *str, size_t len)
ZEND_API zend_result ZEND_FASTCALL zend_hash_del(HashTable *ht, zend_string *key)
ZEND_API zend_result ZEND_FASTCALL zend_hash_str_del(HashTable *ht, const char *str, size_t len)
#define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent)
#define ZEND_HASH_FOREACH_STR_KEY_PTR(ht, _key, _ptr)
#define ZEND_HASH_MAP_FOREACH_PTR(ht, _ptr)
#define ZEND_HASH_FOREACH_PTR(ht, _ptr)
#define ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(ht, _key, _ptr)
#define zend_hash_get_current_data_ptr(ht)
#define ZEND_HASH_FOREACH_END()
#define ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(ht, _key, _val)
struct _zend_string zend_string
ZEND_API void ZEND_FASTCALL zend_str_tolower(char *str, size_t length)
#define Z_STRVAL_P(zval_p)
struct _zend_array HashTable
#define Z_STRLEN_P(zval_p)
#define Z_OBJCE_P(zval_p)
#define ZVAL_NEW_STR(z, s)
#define ZVAL_DOUBLE(z, d)
#define IS_STR_PERSISTENT
ZEND_API void zval_ptr_dtor(zval *zval_ptr)
#define VCWD_RENAME(oldname, newname)
#define IS_ABSOLUTE_PATH(path, len)
#define VCWD_UNLINK(path)
#define VCWD_REALPATH(path, real_path)
function(EX_VAR(opline->result.var))