From: Ilia Alshanetsky Date: Wed, 27 Jul 2005 14:52:52 +0000 (+0000) Subject: Fixed bug #32139 (SOAP client does not auto-handle base64 encoding). X-Git-Tag: RELEASE_2_0_0~98 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3674649c5925ad488a7873688099d7b6e4ba7072;p=php Fixed bug #32139 (SOAP client does not auto-handle base64 encoding). --- diff --git a/NEWS b/NEWS index 5b419f046f..ddeef95997 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,7 @@ PHP NEWS - Fixed bug #33578 (strtotime() problem with "Oct17" format). (Derick) - Fixed bug #33558 (warning with nested calls to functions returning by reference). (Dmitry) +- Fixed bug #32139 (SOAP client does not auto-handle base64 encoding). (Ilia) 14 Jul 2005, PHP 5.1 Beta 3 - Upgraded bundled SQLite library for PDO:SQLite to 3.2.2 (Ilia) diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index 68709dc343..9d3d10c220 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -23,6 +23,7 @@ #include "php_soap.h" #include "ext/libxml/php_libxml.h" +#include "ext/standard/base64.h" #include #include "zend_strtod.h" @@ -607,9 +608,26 @@ static zval *to_zval_stringb(encodeTypePtr type, xmlNodePtr data) 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); + + if (type->type_str && !strcmp(type->type_str, "base64Binary")) { + unsigned char *str; + int str_len; + + str = php_base64_decode(data->children->content, strlen(data->children->content), &str_len); + ZVAL_STRINGL(ret, str, str_len, 0); + } 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); + if (type->type_str && !strcmp(type->type_str, "base64Binary")) { + unsigned char *str; + int str_len; + + str = php_base64_decode(data->children->content, strlen(data->children->content), &str_len); + ZVAL_STRINGL(ret, str, str_len, 0); + } else { + ZVAL_STRING(ret, data->children->content, 1); + } } else { soap_error0(E_ERROR, "Encoding: Violation of encoding rules"); } @@ -637,7 +655,7 @@ static xmlNodePtr to_xml_string(encodeTypePtr type, zval *data, int style, xmlNo zval_copy_ctor(&tmp); convert_to_string(&tmp); - str = php_escape_html_entities(Z_STRVAL(tmp), Z_STRLEN(tmp), &new_len, 0, 0, NULL TSRMLS_CC); + str = php_escape_html_entities(Z_STRVAL(tmp), Z_STRLEN(tmp), &new_len, 0, 0, NULL TSRMLS_CC); zval_dtor(&tmp); } @@ -671,19 +689,38 @@ static xmlNodePtr to_xml_string(encodeTypePtr type, zval *data, int style, xmlNo static xmlNodePtr to_xml_stringl(encodeTypePtr type, zval *data, int style, xmlNodePtr parent) { xmlNodePtr ret; + zend_bool benc = type->type_str && !strcmp(type->type_str, "base64Binary"); ret = xmlNewNode(NULL,"BOGUS"); xmlAddChild(parent, ret); FIND_ZVAL_NULL(data, ret, style); if (Z_TYPE_P(data) == IS_STRING) { - xmlNodeSetContentLen(ret, Z_STRVAL_P(data), Z_STRLEN_P(data)); + if (!benc) { + xmlNodeSetContentLen(ret, Z_STRVAL_P(data), Z_STRLEN_P(data)); + } else { + char *str; + int str_len; + + str = php_base64_encode(Z_STRVAL_P(data), Z_STRLEN_P(data), &str_len); + xmlNodeSetContentLen(ret, str, str_len); + efree(str); + } } else { zval tmp = *data; zval_copy_ctor(&tmp); convert_to_string(&tmp); - xmlNodeSetContentLen(ret, Z_STRVAL(tmp), Z_STRLEN(tmp)); + if (!benc) { + xmlNodeSetContentLen(ret, Z_STRVAL(tmp), Z_STRLEN(tmp)); + } else { + char *str; + int str_len; + + str = php_base64_encode(Z_STRVAL(tmp), Z_STRLEN(tmp), &str_len); + xmlNodeSetContentLen(ret, str, str_len); + efree(str); + } zval_dtor(&tmp); } diff --git a/ext/soap/tests/interop/Round2/Base/r2_base_017p.phpt b/ext/soap/tests/interop/Round2/Base/r2_base_017p.phpt index 92261b6266..5f6b3c3143 100644 --- a/ext/soap/tests/interop/Round2/Base/r2_base_017p.phpt +++ b/ext/soap/tests/interop/Round2/Base/r2_base_017p.phpt @@ -5,7 +5,7 @@ SOAP Interop Round2 base 017 (php/direct): echoBase64 --FILE-- "test://","uri"=>"http://soapinterop.org/","trace"=>1,"exceptions"=>0)); -$client->__soapCall("echoBase64", array('TmVicmFza2E='), array("soapaction"=>"http://soapinterop.org/","uri"=>"http://soapinterop.org/")); +$client->__soapCall("echoBase64", array('Nebraska'), array("soapaction"=>"http://soapinterop.org/","uri"=>"http://soapinterop.org/")); echo $client->__getlastrequest(); $HTTP_RAW_POST_DATA = $client->__getlastrequest(); include("round2_base.inc"); @@ -13,7 +13,7 @@ echo "ok\n"; ?> --EXPECT-- -TmVicmFza2E= +Nebraska TmVicmFza2E= ok diff --git a/ext/soap/tests/interop/Round2/Base/r2_base_017s.phpt b/ext/soap/tests/interop/Round2/Base/r2_base_017s.phpt index 21b5f61a7a..3e3c6e1272 100644 --- a/ext/soap/tests/interop/Round2/Base/r2_base_017s.phpt +++ b/ext/soap/tests/interop/Round2/Base/r2_base_017s.phpt @@ -5,7 +5,7 @@ SOAP Interop Round2 base 017 (soap/direct): echoBase64 --FILE-- "test://","uri"=>"http://soapinterop.org/","trace"=>1,"exceptions"=>0)); -$client->__soapCall("echoBase64", array(new SoapParam(new SoapVar('TmVicmFza2E=',XSD_BASE64BINARY),"inputBase64")), array("soapaction"=>"http://soapinterop.org/","uri"=>"http://soapinterop.org/")); +$client->__soapCall("echoBase64", array(new SoapParam(new SoapVar('Nebraska',XSD_BASE64BINARY),"inputBase64")), array("soapaction"=>"http://soapinterop.org/","uri"=>"http://soapinterop.org/")); echo $client->__getlastrequest(); $HTTP_RAW_POST_DATA = $client->__getlastrequest(); include("round2_base.inc"); diff --git a/ext/soap/tests/interop/Round2/Base/r2_base_017w.phpt b/ext/soap/tests/interop/Round2/Base/r2_base_017w.phpt index af351b59e8..7471c371d9 100644 --- a/ext/soap/tests/interop/Round2/Base/r2_base_017w.phpt +++ b/ext/soap/tests/interop/Round2/Base/r2_base_017w.phpt @@ -5,7 +5,7 @@ SOAP Interop Round2 base 017 (php/wsdl): echoBase64 --FILE-- 1,"exceptions"=>0)); -$client->echoBase64('TmVicmFza2E='); +$client->echoBase64('Nebraska'); echo $client->__getlastrequest(); $HTTP_RAW_POST_DATA = $client->__getlastrequest(); include("round2_base.inc"); diff --git a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_006w.phpt b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_006w.phpt index 58e6b46b0f..c9d9534070 100644 Binary files a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_006w.phpt and b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_006w.phpt differ