summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2004-01-09 14:16:30 +0000
committerDmitry Stogov <dmitry@php.net>2004-01-09 14:16:30 +0000
commit792b0e8f0b1a5ac0f8eb51ad43db364fbae1c6a6 (patch)
tree2da0a9be1d511a52a04bf1ed395b45b05bd8732c
parentcf7afb8f180b36eb675d28e3e760c5c711c98468 (diff)
downloadphp-git-792b0e8f0b1a5ac0f8eb51ad43db364fbae1c6a6.tar.gz
SOAP Encoding/Decoding were improved.
-rw-r--r--ext/soap/TODO11
-rw-r--r--ext/soap/php_encoding.c105
-rw-r--r--ext/soap/php_encoding.h9
-rw-r--r--ext/soap/php_packet_soap.c47
-rw-r--r--ext/soap/php_schema.c8
-rw-r--r--ext/soap/php_sdl.c16
-rw-r--r--ext/soap/soap.c48
7 files changed, 171 insertions, 73 deletions
diff --git a/ext/soap/TODO b/ext/soap/TODO
index 17b8cfe261..594260cb8e 100644
--- a/ext/soap/TODO
+++ b/ext/soap/TODO
@@ -7,7 +7,10 @@ General
SOAP
----
+ SOAP versioning model
+- SOAP message must not contain a Document Type Declaration
+- SOAP message MUST NOT contain Processing Instructions
- support for SOAP headers
+ - actor attribute
- mustUnderstend attribute
- make sure soap 1.1 and 1.2 are supported fully
@@ -50,6 +53,10 @@ Encoding
? arrays of arrays
- encoding of arrays with holes
- full support for structures???
+- references (id,href)
+- references to external resources
+- default values
+- root attribute
? provide schema 1999/2001 support???
? make internal refrences for soap encoding (use seralization logic)???
? provide user space overriding of serialization certin objects and types???
@@ -110,11 +117,13 @@ Error Handling
Transport
---------
+ support for https://
-- support for persistent HTTP connections (keep_alive)
++ support for persistent HTTP connections (keep_alive)
- support for HTTP compression (gzip,x-gzip,defalte)
+ support for HTTP authentication
- support for HTTP proxies
- transport abstraction layer
+? SoapAction HTTP header field
+? HTTP status codes
UDDI
----
diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c
index 57a6c83b51..bd6ec43978 100644
--- a/ext/soap/php_encoding.c
+++ b/ext/soap/php_encoding.c
@@ -17,22 +17,22 @@ encode defaultEncoding[] = {
{{XSD_STRING, XSD_STRING_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_string},
{{XSD_BOOLEAN, XSD_BOOLEAN_STRING, XSD_NAMESPACE, NULL}, to_zval_bool, to_xml_bool},
- {{XSD_DECIMAL, XSD_DECIMAL_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_string},
+ {{XSD_DECIMAL, XSD_DECIMAL_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
{{XSD_FLOAT, XSD_FLOAT_STRING, XSD_NAMESPACE, NULL}, to_zval_double, to_xml_double},
{{XSD_DOUBLE, XSD_DOUBLE_STRING, XSD_NAMESPACE, NULL}, to_zval_double, to_xml_double},
- {{XSD_DATETIME, XSD_DATETIME_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_datetime},
- {{XSD_TIME, XSD_TIME_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_time},
- {{XSD_DATE, XSD_DATE_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_date},
- {{XSD_GYEARMONTH, XSD_GYEARMONTH_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_gyearmonth},
- {{XSD_GYEAR, XSD_GYEAR_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_gyear},
- {{XSD_GMONTHDAY, XSD_GMONTHDAY_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_gmonthday},
- {{XSD_GDAY, XSD_GDAY_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_gday},
- {{XSD_GMONTH, XSD_GMONTH_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_gmonth},
- {{XSD_DURATION, XSD_DURATION_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_duration},
+ {{XSD_DATETIME, XSD_DATETIME_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_datetime},
+ {{XSD_TIME, XSD_TIME_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_time},
+ {{XSD_DATE, XSD_DATE_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_date},
+ {{XSD_GYEARMONTH, XSD_GYEARMONTH_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_gyearmonth},
+ {{XSD_GYEAR, XSD_GYEAR_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_gyear},
+ {{XSD_GMONTHDAY, XSD_GMONTHDAY_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_gmonthday},
+ {{XSD_GDAY, XSD_GDAY_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_gday},
+ {{XSD_GMONTH, XSD_GMONTH_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_gmonth},
+ {{XSD_DURATION, XSD_DURATION_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_duration},
- {{XSD_HEXBINARY, XSD_HEXBINARY_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_stringl},
- {{XSD_BASE64BINARY, XSD_BASE64BINARY_STRING, XSD_NAMESPACE, NULL}, to_zval_string, to_xml_stringl},
+ {{XSD_HEXBINARY, XSD_HEXBINARY_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_stringl},
+ {{XSD_BASE64BINARY, XSD_BASE64BINARY_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_stringl},
{{XSD_LONG, XSD_LONG_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_long},
{{XSD_INT, XSD_INT_STRING, XSD_NAMESPACE, NULL}, to_zval_long, to_xml_long},
@@ -48,6 +48,20 @@ encode defaultEncoding[] = {
{{XSD_UNSIGNEDLONG, XSD_UNSIGNEDLONG_STRING, XSD_NAMESPACE, NULL}, to_zval_ulong, to_xml_ulong},
{{XSD_ANYTYPE, XSD_ANYTYPE_STRING, XSD_NAMESPACE, NULL}, guess_zval_convert, guess_xml_convert},
+ {{XSD_ANYURI, XSD_ANYURI_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_QNAME, XSD_QNAME_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_NOTATION, XSD_NOTATION_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_NORMALIZEDSTRING, XSD_NORMALIZEDSTRING_STRING, XSD_NAMESPACE, NULL}, to_zval_stringr, to_xml_string},
+ {{XSD_TOKEN, XSD_TOKEN_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_LANGUAGE, XSD_LANGUAGE_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_NMTOKEN, XSD_NMTOKEN_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_NAME, XSD_NAME_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_NCNAME, XSD_NCNAME_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_ID, XSD_ID_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_IDREF, XSD_IDREF_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_IDREFS, XSD_IDREFS_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_ENTITY, XSD_ENTITY_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
+ {{XSD_ENTITIES, XSD_ENTITIES_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
{{APACHE_MAP, APACHE_MAP_STRING, APACHE_NAMESPACE, NULL}, to_zval_map, to_xml_map},
@@ -57,7 +71,7 @@ encode defaultEncoding[] = {
/* support some of the 1999 data types */
{{XSD_STRING, XSD_STRING_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_string, to_xml_string},
{{XSD_BOOLEAN, XSD_BOOLEAN_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_bool, to_xml_bool},
- {{XSD_DECIMAL, XSD_DECIMAL_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_string, to_xml_string},
+ {{XSD_DECIMAL, XSD_DECIMAL_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
{{XSD_FLOAT, XSD_FLOAT_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_double, to_xml_double},
{{XSD_DOUBLE, XSD_DOUBLE_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_double, to_xml_double},
@@ -65,11 +79,49 @@ encode defaultEncoding[] = {
{{XSD_INT, XSD_INT_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_long, to_xml_long},
{{XSD_SHORT, XSD_SHORT_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_long, to_xml_long},
{{XSD_BYTE, XSD_BYTE_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_long, to_xml_long},
- {{XSD_1999_TIMEINSTANT, XSD_1999_TIMEINSTANT_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_string, to_xml_string},
+ {{XSD_1999_TIMEINSTANT, XSD_1999_TIMEINSTANT_STRING, XSD_1999_NAMESPACE, NULL}, to_zval_stringc, to_xml_string},
{{END_KNOWN_TYPES, NULL, NULL, NULL}, guess_zval_convert, guess_xml_convert}
};
+void whiteSpace_replace(char* str)
+{
+ while (*str != '\0') {
+ if (*str == '\x9' || *str == '\xA' || *str == '\xD') {
+ *str = ' ';
+ }
+ str++;
+ }
+}
+
+void whiteSpace_collapse(char* str)
+{
+ char *orig = str;
+ char *tmp = do_alloca(strlen(str)+1);
+ char *pos;
+ char old;
+
+ whiteSpace_replace(str);
+ while (*str == ' ') {
+ str++;
+ }
+ pos = tmp; old = '\0';
+ while (*str != '\0') {
+ if (*str != ' ' || old != ' ') {
+ *pos = *str;
+ pos++;
+ }
+ old = *str;
+ str++;
+ }
+ if (old == ' ') {
+ --pos;
+ }
+ *pos = '\0';
+ memcpy(orig,tmp,(pos-tmp)+1);
+ free_alloca(tmp);
+}
+
xmlNodePtr master_to_xml(encodePtr encode, zval *data, int style)
{
xmlNodePtr node;
@@ -235,15 +287,30 @@ zval *to_zval_string(encodeType type, xmlNodePtr data)
return ret;
}
-zval *to_zval_stringl(encodeType type, xmlNodePtr data)
+zval *to_zval_stringr(encodeType type, xmlNodePtr data)
{
zval *ret;
MAKE_STD_ZVAL(ret);
FIND_XML_NULL(data, ret);
if(data && data->children && data->children->content) {
- ZVAL_STRINGL(ret, data->children->content, xmlStrlen(data->children->content), 1);
+ whiteSpace_replace(data->children->content);
+ ZVAL_STRING(ret, data->children->content, 1);
} else {
- ZVAL_EMPTY_STRING(ret)
+ ZVAL_EMPTY_STRING(ret);
+ }
+ return ret;
+}
+
+zval *to_zval_stringc(encodeType type, xmlNodePtr data)
+{
+ zval *ret;
+ MAKE_STD_ZVAL(ret);
+ FIND_XML_NULL(data, ret);
+ if(data && data->children && data->children->content) {
+ whiteSpace_collapse(data->children->content);
+ ZVAL_STRING(ret, data->children->content, 1);
+ } else {
+ ZVAL_EMPTY_STRING(ret);
}
return ret;
}
@@ -309,6 +376,7 @@ zval *to_zval_double(encodeType type, xmlNodePtr data)
FIND_XML_NULL(data, ret);
if (data && data->children && data->children->content) {
+ whiteSpace_collapse(data->children->content);
ZVAL_DOUBLE(ret, atof(data->children->content));
} else {
ZVAL_NULL(ret);
@@ -323,6 +391,7 @@ zval *to_zval_long(encodeType type, xmlNodePtr data)
FIND_XML_NULL(data, ret);
if (data && data->children && data->children->content) {
+ whiteSpace_collapse(data->children->content);
ZVAL_LONG(ret, atol(data->children->content));
} else {
ZVAL_NULL(ret);
@@ -337,6 +406,7 @@ zval *to_zval_ulong(encodeType type, xmlNodePtr data)
FIND_XML_NULL(data, ret);
if (data && data->children && data->children->content) {
+ whiteSpace_collapse(data->children->content);
/* TODO: long overflow */
ZVAL_LONG(ret, atol(data->children->content));
} else {
@@ -419,6 +489,7 @@ zval *to_zval_bool(encodeType type, xmlNodePtr data)
FIND_XML_NULL(data, ret);
if (data && data->children && data->children->content) {
+ whiteSpace_collapse(data->children->content);
if(stricmp(data->children->content,"true") == 0 ||
stricmp(data->children->content,"t") == 0 ||
strcmp(data->children->content,"1") == 0)
diff --git a/ext/soap/php_encoding.h b/ext/soap/php_encoding.h
index 1d7a16b8a6..88a02bffad 100644
--- a/ext/soap/php_encoding.h
+++ b/ext/soap/php_encoding.h
@@ -75,8 +75,8 @@
#define XSD_IDREFS_STRING "IDREFS"
#define XSD_ENTITY 128
#define XSD_ENTITY_STRING "ENTITY"
-#define XSD_ENTITYS 129
-#define XSD_ENTITYS_STRING "ENTITYS"
+#define XSD_ENTITIES 129
+#define XSD_ENTITIES_STRING "ENTITYS"
#define XSD_INTEGER 130
#define XSD_INTEGER_STRING "integer"
#define XSD_NONPOSITIVEINTEGER 131
@@ -168,6 +168,9 @@ zval *to_zval_user(encodeType type, xmlNodePtr node);
zval *to_zval_after_user(encodeType type, zval *data);
#endif
+void whiteSpace_replace(char* str);
+void whiteSpace_collapse(char* str);
+
/* zval type decode */
zval *to_zval_double(encodeType type, xmlNodePtr data);
zval *to_zval_long(encodeType type, xmlNodePtr data);
@@ -175,6 +178,8 @@ zval *to_zval_ulong(encodeType type, xmlNodePtr data);
zval *to_zval_bool(encodeType type, xmlNodePtr data);
zval *to_zval_object(encodeType type, xmlNodePtr data);
zval *to_zval_string(encodeType type, xmlNodePtr data);
+zval *to_zval_stringr(encodeType type, xmlNodePtr data);
+zval *to_zval_stringc(encodeType type, xmlNodePtr data);
zval *to_zval_array(encodeType type, xmlNodePtr data);
zval *to_zval_map(encodeType type, xmlNodePtr data);
zval *to_zval_null(encodeType type, xmlNodePtr data);
diff --git a/ext/soap/php_packet_soap.c b/ext/soap/php_packet_soap.c
index 16bcb62638..b8cda52f5e 100644
--- a/ext/soap/php_packet_soap.c
+++ b/ext/soap/php_packet_soap.c
@@ -5,7 +5,7 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction
{
char* envelope_ns;
xmlDocPtr response;
- xmlNodePtr trav, /*trav2,*/ env, body, resp, cur, fault;
+ xmlNodePtr trav, env, head, body, resp, cur, fault;
int param_count = 0;
ZVAL_NULL(return_value);
@@ -23,22 +23,16 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction
trav = response->children;
while (trav != NULL) {
if (trav->type == XML_ELEMENT_NODE) {
- if (node_is_equal_ex(trav,"Envelope",SOAP_1_1_ENV)) {
- if (env != NULL) {
- add_soap_fault(this_ptr, "SOAP-ENV:Client", "looks like we got XML with several \"Envelope\" elements\n", NULL, NULL TSRMLS_CC);
- xmlFreeDoc(response);
- return FALSE;
- }
+ if (env == NULL && node_is_equal_ex(trav,"Envelope",SOAP_1_1_ENV)) {
env = trav;
envelope_ns = SOAP_1_1_ENV;
- } else if (node_is_equal_ex(trav,"Envelope",SOAP_1_2_ENV)) {
- if (env != NULL) {
- add_soap_fault(this_ptr, "SOAP-ENV:Client", "looks like we got XML with several \"Envelope\" elements\n", NULL, NULL TSRMLS_CC);
- xmlFreeDoc(response);
- return FALSE;
- }
+ } else if (env == NULL && node_is_equal_ex(trav,"Envelope",SOAP_1_2_ENV)) {
env = trav;
envelope_ns = SOAP_1_2_ENV;
+ } else {
+ add_soap_fault(this_ptr, "SOAP-ENV:Client", "looks like we got bad SOAP response\n", NULL, NULL TSRMLS_CC);
+ xmlFreeDoc(response);
+ return FALSE;
}
}
trav = trav->next;
@@ -49,18 +43,28 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction
return FALSE;
}
+ /* Get <Header> element */
+ head = NULL;
+ trav = env->children;
+ while (trav != NULL && trav->type != XML_ELEMENT_NODE) {
+ trav = trav->next;
+ }
+ if (trav != NULL && node_is_equal_ex(trav,"Header",envelope_ns)) {
+ head = trav;
+ trav = trav->next;
+ }
+
/* Get <Body> element */
body = NULL;
- trav = env->children;
while (trav != NULL) {
- if (trav->type == XML_ELEMENT_NODE &&
- node_is_equal_ex(trav,"Body",envelope_ns)) {
- if (body != NULL) {
- add_soap_fault(this_ptr, "SOAP-ENV:Client", "looks like we got \"Envelope\" with several \"Body\" elements\n", NULL, NULL TSRMLS_CC);
+ if (trav->type == XML_ELEMENT_NODE) {
+ if (body == NULL && node_is_equal_ex(trav,"Body",envelope_ns)) {
+ body = trav;
+ } else {
+ add_soap_fault(this_ptr, "SOAP-ENV:Client", "looks like we got bad SOAP response\n", NULL, NULL TSRMLS_CC);
xmlFreeDoc(response);
return FALSE;
- }
- body = trav;
+ }
}
trav = trav->next;
}
@@ -143,6 +147,9 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction
if (val == NULL && res_count == 1) {
val = get_node(cur->children, "return");
}
+ if (val == NULL && res_count == 1) {
+ val = get_node(cur->children, "result");
+ }
}
}
diff --git a/ext/soap/php_schema.c b/ext/soap/php_schema.c
index ce0c9b1a1a..647accc19b 100644
--- a/ext/soap/php_schema.c
+++ b/ext/soap/php_schema.c
@@ -716,7 +716,7 @@ static int schema_complexContent(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr compCon
}
content = get_node(compCont->children, "extension");
- if(content == NULL) {
+ if(content != NULL) {
// php_error(E_ERROR, "Error parsing schema (doesn't support extensions on complexContent)");
schema_extension_complexContent(sdl, tsn, content, cur_type);
return TRUE;
@@ -778,6 +778,9 @@ static int schema_complexType(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr compType,
cur_type = (*ptr);
create_encoder((*sdl), cur_type, ns->children->content, name->children->content);
smart_str_free(&key);
+ if (cur_type->encode == NULL) {
+ cur_type->encode = get_conversion(SOAP_ENC_OBJECT);
+ }
}
content = get_node(compType->children, "simpleContent");
@@ -816,9 +819,6 @@ static int schema_complexType(sdlPtr *sdl, xmlAttrPtr tsn, xmlNodePtr compType,
schema_sequence(sdl, tsn, content, cur_type);
}
-// if (cur_type->encode == NULL) {
-// cur_type->encode = get_conversion(SOAP_ENC_OBJECT);
-// }
return TRUE;
}
/*
diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c
index 157e781d75..cc1e719497 100644
--- a/ext/soap/php_sdl.c
+++ b/ext/soap/php_sdl.c
@@ -98,19 +98,19 @@ zval *sdl_guess_convert_zval(encodeType enc, xmlNodePtr data)
type = enc.sdl_type;
if(type->encode) {
-// if(type->encode->details.type == IS_ARRAY ||
-// type->encode->details.type == SOAP_ENC_ARRAY) {
-// return to_zval_array(enc, data);
-// } else if (type->encode->details.type == IS_OBJECT ||
-// type->encode->details.type == SOAP_ENC_OBJECT) {
-// return to_zval_object(enc, data);
-// } else {
+ if(type->encode->details.type == IS_ARRAY ||
+ type->encode->details.type == SOAP_ENC_ARRAY) {
+ return to_zval_array(enc, data);
+ } else if (type->encode->details.type == IS_OBJECT ||
+ type->encode->details.type == SOAP_ENC_OBJECT) {
+ return to_zval_object(enc, data);
+ } else {
if (memcmp(&type->encode->details,&enc,sizeof(enc))!=0) {
return master_to_zval(type->encode, data);
} else {
return master_to_zval(get_conversion(UNKNOWN_TYPE), data);
}
-// }
+ }
} else if (type->elements) {
return to_zval_object(enc, data);
} else {
diff --git a/ext/soap/soap.c b/ext/soap/soap.c
index 6e73995222..4929f82053 100644
--- a/ext/soap/soap.c
+++ b/ext/soap/soap.c
@@ -341,6 +341,7 @@ PHP_MINIT_FUNCTION(soap)
REGISTER_LONG_CONSTANT("SOAP_ENC_OBJECT", SOAP_ENC_OBJECT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SOAP_ENC_ARRAY", SOAP_ENC_ARRAY, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("XSD_ANYTYPE", XSD_ANYTYPE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("XSD_STRING", XSD_STRING, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("XSD_BOOLEAN", XSD_BOOLEAN, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("XSD_DECIMAL", XSD_DECIMAL, CONST_CS | CONST_PERSISTENT);
@@ -370,7 +371,7 @@ PHP_MINIT_FUNCTION(soap)
REGISTER_LONG_CONSTANT("XSD_IDREF", XSD_IDREF, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("XSD_IDREFS", XSD_IDREFS, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("XSD_ENTITY", XSD_ENTITY, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("XSD_ENTITYS", XSD_ENTITYS, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("XSD_ENTITIES", XSD_ENTITIES, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("XSD_INTEGER", XSD_INTEGER, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("XSD_NONPOSITIVEINTEGER", XSD_NONPOSITIVEINTEGER, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("XSD_NEGATIVEINTEGER", XSD_NEGATIVEINTEGER, CONST_CS | CONST_PERSISTENT);
@@ -1035,7 +1036,7 @@ PHP_METHOD(soapserver, handle)
INIT_ZVAL(readfile_ret);
MAKE_STD_ZVAL(param);
- sapi_add_header("Content-Type: text/xml", sizeof("Content-Type: text/xml"), 1);
+ sapi_add_header("Content-Type: text/xml; charset=\"utf-8\"", sizeof("Content-Type: text/xml; charset=\"utf-8\""), 1);
ZVAL_STRING(param, service->sdl->source, 1);
ZVAL_STRING(&readfile, "readfile", 1);
if(call_user_function(EG(function_table), NULL, &readfile, &readfile_ret, 1, &param TSRMLS_CC) == FAILURE)
@@ -1050,7 +1051,7 @@ PHP_METHOD(soapserver, handle)
} else {
php_error(E_ERROR, "WSDL generation is not supported yet");
/*
- sapi_add_header("Content-Type: text/xml", sizeof("Content-Type: text/xml"), 1);
+ sapi_add_header("Content-Type: text/xml; charset=\"utf-8\"", sizeof("Content-Type: text/xml; charset=\"utf-8\""), 1);
PUTS("<?xml version=\"1.0\" ?>\n<definitions\n");
PUTS(" xmlns=\"http://schemas.xmlsoap.org/wsdl/\"\n");
PUTS(" targetNamespace=\"");
@@ -1194,7 +1195,7 @@ PHP_METHOD(soapserver, handle)
php_error(E_ERROR, "Dump memory failed");
sprintf(cont_len, "Content-Length: %d", size);
- sapi_add_header("Content-Type: text/xml", sizeof("Content-Type: text/xml"), 1);
+ sapi_add_header("Content-Type: text/xml; charset=\"utf-8\"", sizeof("Content-Type: text/xml; charset=\"utf-8\""), 1);
sapi_add_header(cont_len, strlen(cont_len) + 1, 1);
/* Free Memory */
@@ -1274,7 +1275,7 @@ void soap_error_handler(int error_num, const char *error_filename, const uint er
xmlDocDumpMemory(doc_return, &buf, &size);
sprintf(cont_len,"Content-Length: %d", size);
sapi_add_header(cont_len, strlen(cont_len) + 1, 1);
- sapi_add_header("Content-Type: text/xml", sizeof("Content-Type: text/xml"), 1);
+ sapi_add_header("Content-Type: text/xml; charset=\"utf-8\"", sizeof("Content-Type: text/xml; charset=\"utf-8\""), 1);
/*
Want to return HTTP 500 but apache wants to over write
@@ -1761,7 +1762,7 @@ void set_soap_fault(zval *obj, char *fault_code, char *fault_string, char *fault
void deseralize_function_call(sdlPtr sdl, xmlDocPtr request, zval *function_name, int *num_params, zval ***parameters, int *version TSRMLS_DC)
{
char* envelope_ns;
- xmlNodePtr trav,env,body,func;
+ xmlNodePtr trav,env,head,body,func;
int cur_param = 0,num_of_params = 0;
zval tmp_function_name, **tmp_parameters = NULL;
sdlFunctionPtr function;
@@ -1774,20 +1775,16 @@ void deseralize_function_call(sdlPtr sdl, xmlDocPtr request, zval *function_name
trav = request->children;
while (trav != NULL) {
if (trav->type == XML_ELEMENT_NODE) {
- if (node_is_equal_ex(trav,"Envelope",SOAP_1_1_ENV)) {
- if (env != NULL) {
- php_error(E_ERROR,"looks like we got XML with several \"Envelope\" elements\n");
- }
+ if (env == NULL && node_is_equal_ex(trav,"Envelope",SOAP_1_1_ENV)) {
env = trav;
*version = SOAP_1_1;
envelope_ns = SOAP_1_1_ENV;
- } else if (node_is_equal_ex(trav,"Envelope",SOAP_1_2_ENV)) {
- if (env != NULL) {
- php_error(E_ERROR,"looks like we got XML with several \"Envelope\" elements\n");
- }
+ } else if (env == NULL && node_is_equal_ex(trav,"Envelope",SOAP_1_2_ENV)) {
env = trav;
*version = SOAP_1_2;
envelope_ns = SOAP_1_2_ENV;
+ } else {
+ php_error(E_ERROR,"looks like we got bad SOAP request\n");
}
}
trav = trav->next;
@@ -1796,17 +1793,26 @@ void deseralize_function_call(sdlPtr sdl, xmlDocPtr request, zval *function_name
php_error(E_ERROR,"looks like we got XML without \"Envelope\" element\n");
}
+ /* Get <Header> element */
+ head = NULL;
+ trav = env->children;
+ while (trav != NULL && trav->type != XML_ELEMENT_NODE) {
+ trav = trav->next;
+ }
+ if (trav != NULL && node_is_equal_ex(trav,"Header",envelope_ns)) {
+ head = trav;
+ trav = trav->next;
+ }
/* Get <Body> element */
body = NULL;
- trav = env->children;
while (trav != NULL) {
- if (trav->type == XML_ELEMENT_NODE &&
- node_is_equal_ex(trav,"Body",envelope_ns)) {
- if (body != NULL) {
- php_error(E_ERROR,"looks like we got \"Envelope\" with several \"Body\" elements\n");
- }
- body = trav;
+ if (trav->type == XML_ELEMENT_NODE) {
+ if (body == NULL && node_is_equal_ex(trav,"Body",envelope_ns)) {
+ body = trav;
+ } else {
+ php_error(E_ERROR,"looks like we got bad SOAP request\n");
+ }
}
trav = trav->next;
}