summaryrefslogtreecommitdiff
path: root/ext/soap/php_encoding.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2004-08-10 16:11:41 +0000
committerDmitry Stogov <dmitry@php.net>2004-08-10 16:11:41 +0000
commitde46ba2ea51cdf1d78eec467a58342c5cd4a7cb8 (patch)
treeed660bca6ed4734c61b42e4dbc54654c95273aaf /ext/soap/php_encoding.c
parentbcdab8f7e6c44ed9c4d2609e353deaea3038bbd1 (diff)
downloadphp-git-de46ba2ea51cdf1d78eec467a58342c5cd4a7cb8.tar.gz
Fixed bug #28969 (Wrong data encoding of special characters).
Diffstat (limited to 'ext/soap/php_encoding.c')
-rw-r--r--ext/soap/php_encoding.c95
1 files changed, 91 insertions, 4 deletions
diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c
index 7174eb9f16..08e80c223f 100644
--- a/ext/soap/php_encoding.c
+++ b/ext/soap/php_encoding.c
@@ -31,6 +31,7 @@ static zval *to_zval_bool(encodeTypePtr type, xmlNodePtr data);
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 @@ encode defaultEncoding[] = {
{{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 @@ static zval *to_zval_string(encodeTypePtr type, xmlNodePtr data)
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 @@ static zval *to_zval_stringr(encodeTypePtr type, xmlNodePtr data)
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 @@ static zval *to_zval_stringc(encodeTypePtr type, xmlNodePtr data)
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) {
@@ -534,6 +603,24 @@ static xmlNodePtr to_xml_string(encodeTypePtr type, zval *data, int style, xmlNo
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);
efree(str);