dmitry Tue Aug 10 12:11:41 2004 EDT Modified files: /php-src NEWS /php-src/ext/soap php_encoding.c php_soap.h soap.c Log: Fixed bug #28969 (Wrong data encoding of special characters).
http://cvs.php.net/diff.php/php-src/NEWS?r1=1.1787&r2=1.1788&ty=u Index: php-src/NEWS diff -u php-src/NEWS:1.1787 php-src/NEWS:1.1788 --- php-src/NEWS:1.1787 Tue Aug 10 10:57:47 2004 +++ php-src/NEWS Tue Aug 10 12:11:40 2004 @@ -1,6 +1,7 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2004, PHP 5.1.0 +- Fixed bug #28969 (Wrong data encoding of special characters). (Dmitry) - Fixed bug #29256 (SOAP HTTP Error when envelop size is more than 24345 bytes) (Dmitry, Wez) - Fixed bug #29522 (accessing properties without connection) (Georg) http://cvs.php.net/diff.php/php-src/ext/soap/php_encoding.c?r1=1.71&r2=1.72&ty=u Index: php-src/ext/soap/php_encoding.c diff -u php-src/ext/soap/php_encoding.c:1.71 php-src/ext/soap/php_encoding.c:1.72 --- php-src/ext/soap/php_encoding.c:1.71 Wed May 5 06:31:25 2004 +++ php-src/ext/soap/php_encoding.c Tue Aug 10 12:11:41 2004 @@ -17,7 +17,7 @@ | Dmitry Stogov <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: php_encoding.c,v 1.71 2004/05/05 10:31:25 dmitry Exp $ */ +/* $Id: php_encoding.c,v 1.72 2004/08/10 16:11:41 dmitry Exp $ */ #include <time.h> @@ -31,6 +31,7 @@ static zval *to_zval_string(encodeTypePtr type, xmlNodePtr data); static zval *to_zval_stringr(encodeTypePtr type, xmlNodePtr data); static zval *to_zval_stringc(encodeTypePtr type, xmlNodePtr data); +static zval *to_zval_stringb(encodeTypePtr type, xmlNodePtr data); static zval *to_zval_map(encodeTypePtr type, xmlNodePtr data); static zval *to_zval_null(encodeTypePtr type, xmlNodePtr data); @@ -145,8 +146,8 @@ {{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_stringc, to_xml_stringl}, - {{XSD_BASE64BINARY, XSD_BASE64BINARY_STRING, XSD_NAMESPACE, NULL}, to_zval_stringc, to_xml_stringl}, + {{XSD_HEXBINARY, XSD_HEXBINARY_STRING, XSD_NAMESPACE, NULL}, to_zval_stringb, to_xml_stringl}, + {{XSD_BASE64BINARY, XSD_BASE64BINARY_STRING, XSD_NAMESPACE, NULL}, to_zval_stringb, 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}, @@ -460,7 +461,23 @@ FIND_XML_NULL(data, ret); if (data && data->children) { if (data->children->type == XML_TEXT_NODE && data->children->next == NULL) { - ZVAL_STRING(ret, data->children->content, 1); + TSRMLS_FETCH(); + + if (SOAP_GLOBAL(encoding) != NULL) { + xmlBufferPtr in = xmlBufferCreateStatic(data->children->content, strlen(data->children->content)); + xmlBufferPtr out = xmlBufferCreate(); + int n = xmlCharEncOutFunc(SOAP_GLOBAL(encoding), out, in); + + if (n >= 0) { + ZVAL_STRING(ret, (char*)xmlBufferContent(out), 1); + } else { + ZVAL_STRING(ret, data->children->content, 1); + } + xmlBufferFree(out); + xmlBufferFree(in); + } else { + ZVAL_STRING(ret, data->children->content, 1); + } } else if (data->children->type == XML_CDATA_SECTION_NODE && data->children->next == NULL) { ZVAL_STRING(ret, data->children->content, 1); } else { @@ -479,8 +496,24 @@ FIND_XML_NULL(data, ret); if (data && data->children) { if (data->children->type == XML_TEXT_NODE && data->children->next == NULL) { + TSRMLS_FETCH(); + whiteSpace_replace(data->children->content); - ZVAL_STRING(ret, data->children->content, 1); + if (SOAP_GLOBAL(encoding) != NULL) { + xmlBufferPtr in = xmlBufferCreateStatic(data->children->content, strlen(data->children->content)); + xmlBufferPtr out = xmlBufferCreate(); + int n = xmlCharEncOutFunc(SOAP_GLOBAL(encoding), out, in); + + if (n >= 0) { + ZVAL_STRING(ret, (char*)xmlBufferContent(out), 1); + } else { + ZVAL_STRING(ret, data->children->content, 1); + } + xmlBufferFree(out); + xmlBufferFree(in); + } else { + ZVAL_STRING(ret, data->children->content, 1); + } } else if (data->children->type == XML_CDATA_SECTION_NODE && data->children->next == NULL) { ZVAL_STRING(ret, data->children->content, 1); } else { @@ -499,6 +532,42 @@ FIND_XML_NULL(data, ret); if (data && data->children) { if (data->children->type == XML_TEXT_NODE && data->children->next == NULL) { + TSRMLS_FETCH(); + + whiteSpace_collapse(data->children->content); + if (SOAP_GLOBAL(encoding) != NULL) { + xmlBufferPtr in = xmlBufferCreateStatic(data->children->content, strlen(data->children->content)); + xmlBufferPtr out = xmlBufferCreate(); + int n = xmlCharEncOutFunc(SOAP_GLOBAL(encoding), out, in); + + if (n >= 0) { + ZVAL_STRING(ret, (char*)xmlBufferContent(out), 1); + } else { + ZVAL_STRING(ret, data->children->content, 1); + } + xmlBufferFree(out); + xmlBufferFree(in); + } else { + ZVAL_STRING(ret, data->children->content, 1); + } + } else if (data->children->type == XML_CDATA_SECTION_NODE && data->children->next == NULL) { + ZVAL_STRING(ret, data->children->content, 1); + } else { + soap_error0(E_ERROR, "Encoding: Violation of encoding rules"); + } + } else { + ZVAL_EMPTY_STRING(ret); + } + return ret; +} + +static zval *to_zval_stringb(encodeTypePtr type, xmlNodePtr data) +{ + zval *ret; + MAKE_STD_ZVAL(ret); + FIND_XML_NULL(data, ret); + if (data && data->children) { + if (data->children->type == XML_TEXT_NODE && data->children->next == NULL) { whiteSpace_collapse(data->children->content); ZVAL_STRING(ret, data->children->content, 1); } else if (data->children->type == XML_CDATA_SECTION_NODE && data->children->next == NULL) { @@ -532,6 +601,24 @@ convert_to_string(&tmp); str = php_escape_html_entities(Z_STRVAL(tmp), Z_STRLEN(tmp), &new_len, 0, 0, NULL TSRMLS_CC); zval_dtor(&tmp); + } + + if (SOAP_GLOBAL(encoding) != NULL) { + xmlBufferPtr in = xmlBufferCreateStatic(str, new_len); + xmlBufferPtr out = xmlBufferCreate(); + int n = xmlCharEncInFunc(SOAP_GLOBAL(encoding), out, in); + + if (n >= 0) { + efree(str); + str = estrdup(xmlBufferContent(out)); + new_len = n; + } else if (!xmlCheckUTF8(str)) { + soap_error1(E_ERROR, "Encoding: string '%s' is not a valid utf-8 string", str); + } + xmlBufferFree(out); + xmlBufferFree(in); + } else if (!xmlCheckUTF8(str)) { + soap_error1(E_ERROR, "Encoding: string '%s' is not a valid utf-8 string", str); } xmlNodeSetContentLen(ret, str, new_len); http://cvs.php.net/diff.php/php-src/ext/soap/php_soap.h?r1=1.33&r2=1.34&ty=u Index: php-src/ext/soap/php_soap.h diff -u php-src/ext/soap/php_soap.h:1.33 php-src/ext/soap/php_soap.h:1.34 --- php-src/ext/soap/php_soap.h:1.33 Wed May 5 06:31:26 2004 +++ php-src/ext/soap/php_soap.h Tue Aug 10 12:11:41 2004 @@ -17,7 +17,7 @@ | Dmitry Stogov <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: php_soap.h,v 1.33 2004/05/05 10:31:26 dmitry Exp $ */ +/* $Id: php_soap.h,v 1.34 2004/08/10 16:11:41 dmitry Exp $ */ #ifndef PHP_SOAP_H #define PHP_SOAP_H @@ -115,6 +115,7 @@ int type; char *actor; char *uri; + xmlCharEncodingHandlerPtr encoding; }; #define SOAP_CLASS 1 @@ -158,6 +159,7 @@ zend_bool cache_enabled; char* cache_dir; long cache_ttl; + xmlCharEncodingHandlerPtr encoding; ZEND_END_MODULE_GLOBALS(soap) #ifdef PHP_WIN32 http://cvs.php.net/diff.php/php-src/ext/soap/soap.c?r1=1.114&r2=1.115&ty=u Index: php-src/ext/soap/soap.c diff -u php-src/ext/soap/soap.c:1.114 php-src/ext/soap/soap.c:1.115 --- php-src/ext/soap/soap.c:1.114 Tue Jul 20 03:39:32 2004 +++ php-src/ext/soap/soap.c Tue Aug 10 12:11:41 2004 @@ -17,7 +17,7 @@ | Dmitry Stogov <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: soap.c,v 1.114 2004/07/20 07:39:32 dmitry Exp $ */ +/* $Id: soap.c,v 1.115 2004/08/10 16:11:41 dmitry Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -423,6 +423,7 @@ SOAP_GLOBAL(error_object) = NULL; SOAP_GLOBAL(sdl) = NULL; SOAP_GLOBAL(soap_version) = SOAP_1_1; + SOAP_GLOBAL(encoding) = NULL; return SUCCESS; } @@ -835,6 +836,19 @@ Z_TYPE_PP(tmp) == IS_STRING) { service->actor = estrndup(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); } + + if (zend_hash_find(ht, "encoding", sizeof("encoding"), (void**)&tmp) == SUCCESS && + Z_TYPE_PP(tmp) == IS_STRING) { + xmlCharEncodingHandlerPtr encoding; + + encoding = xmlFindCharEncodingHandler(Z_STRVAL_PP(tmp)); + if (encoding == NULL) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid arguments. Invalid 'encoding' option - '%s'.", Z_STRVAL_PP(tmp)); + } else { + service->encoding = encoding; + } + } + } else if (wsdl == NULL) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid arguments. 'uri' option is required in nonWSDL mode."); } @@ -1233,6 +1247,7 @@ sdlFunctionPtr function; char *arg = NULL; int arg_len; + xmlCharEncodingHandlerPtr old_encoding; SOAP_SERVER_BEGIN_CODE(); @@ -1374,6 +1389,8 @@ old_sdl = SOAP_GLOBAL(sdl); SOAP_GLOBAL(sdl) = service->sdl; + old_encoding = SOAP_GLOBAL(encoding); + SOAP_GLOBAL(encoding) = service->encoding; old_soap_version = SOAP_GLOBAL(soap_version); function = deserialize_function_call(service->sdl, doc_request, service->actor, &function_name, &num_params, ¶ms, &soap_version, &soap_headers TSRMLS_CC); xmlFreeDoc(doc_request); @@ -1636,6 +1653,7 @@ fail: SOAP_GLOBAL(soap_version) = old_soap_version; + SOAP_GLOBAL(encoding) = old_encoding; SOAP_GLOBAL(sdl) = old_sdl; /* Free soap headers */ @@ -1936,6 +1954,18 @@ zend_hash_exists(EG(function_table), "gzencode", sizeof("gzencode"))) { add_property_long(this_ptr, "compression", Z_LVAL_PP(tmp)); } + if (zend_hash_find(ht, "encoding", sizeof("encoding"), (void**)&tmp) == SUCCESS && + Z_TYPE_PP(tmp) == IS_STRING) { + xmlCharEncodingHandlerPtr encoding; + + encoding = xmlFindCharEncodingHandler(Z_STRVAL_PP(tmp)); + if (encoding == NULL) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid 'encoding' option - '%s'.", Z_STRVAL_PP(tmp)); + } else { + xmlCharEncCloseFunc(encoding); + add_property_stringl(this_ptr, "_encoding", Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), 1); + } + } } else if (wsdl == NULL) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "'location' and 'uri' options are requred in nonWSDL mode."); return; @@ -2046,6 +2076,7 @@ int ret = FALSE; int soap_version; zval response; + xmlCharEncodingHandlerPtr old_encoding; SOAP_CLIENT_BEGIN_CODE(); @@ -2070,6 +2101,14 @@ SOAP_GLOBAL(soap_version) = soap_version; old_sdl = SOAP_GLOBAL(sdl); SOAP_GLOBAL(sdl) = sdl; + old_encoding = SOAP_GLOBAL(encoding); + if (zend_hash_find(Z_OBJPROP_P(this_ptr), "_encoding", sizeof("_encoding"), (void **) &tmp) == SUCCESS && + Z_TYPE_PP(tmp) == IS_STRING) { + SOAP_GLOBAL(encoding) = xmlFindCharEncodingHandler(Z_STRVAL_PP(tmp)); + } else { + SOAP_GLOBAL(encoding) = NULL; + } + if (sdl != NULL) { fn = get_function(sdl, function); if (fn != NULL) { @@ -2166,6 +2205,10 @@ zend_throw_exception_object(exception TSRMLS_CC); } #endif + if (SOAP_GLOBAL(encoding) != NULL) { + xmlCharEncCloseFunc(SOAP_GLOBAL(encoding)); + } + SOAP_GLOBAL(encoding) = old_encoding; SOAP_GLOBAL(sdl) = old_sdl; SOAP_CLIENT_END_CODE(); } @@ -3909,6 +3952,9 @@ } if (service->sdl) { delete_sdl(service->sdl); + } + if (service->encoding) { + xmlCharEncCloseFunc(service->encoding); } efree(service); }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php