diff options
| author | Dmitry Stogov <dmitry@php.net> | 2004-01-09 14:16:30 +0000 |
|---|---|---|
| committer | Dmitry Stogov <dmitry@php.net> | 2004-01-09 14:16:30 +0000 |
| commit | 792b0e8f0b1a5ac0f8eb51ad43db364fbae1c6a6 (patch) | |
| tree | 2da0a9be1d511a52a04bf1ed395b45b05bd8732c | |
| parent | cf7afb8f180b36eb675d28e3e760c5c711c98468 (diff) | |
| download | php-git-792b0e8f0b1a5ac0f8eb51ad43db364fbae1c6a6.tar.gz | |
SOAP Encoding/Decoding were improved.
| -rw-r--r-- | ext/soap/TODO | 11 | ||||
| -rw-r--r-- | ext/soap/php_encoding.c | 105 | ||||
| -rw-r--r-- | ext/soap/php_encoding.h | 9 | ||||
| -rw-r--r-- | ext/soap/php_packet_soap.c | 47 | ||||
| -rw-r--r-- | ext/soap/php_schema.c | 8 | ||||
| -rw-r--r-- | ext/soap/php_sdl.c | 16 | ||||
| -rw-r--r-- | ext/soap/soap.c | 48 |
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, ¶m 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; } |
