dmitry          Mon Jul 10 07:41:52 2006 UTC

  Modified files:              
    /php-src/ext/soap   php_packet_soap.c soap.c 
    /php-src/ext/soap/tests/bugs        bug38005.phpt 
  Log:
  Fixed bug #38005 (SoapFault faultstring doesn't follow encoding rules)
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/soap/php_packet_soap.c?r1=1.43&r2=1.44&diff_format=u
Index: php-src/ext/soap/php_packet_soap.c
diff -u php-src/ext/soap/php_packet_soap.c:1.43 
php-src/ext/soap/php_packet_soap.c:1.44
--- php-src/ext/soap/php_packet_soap.c:1.43     Sun Jan  1 13:09:53 2006
+++ php-src/ext/soap/php_packet_soap.c  Mon Jul 10 07:41:52 2006
@@ -17,7 +17,7 @@
   |          Dmitry Stogov <[EMAIL PROTECTED]>                             |
   +----------------------------------------------------------------------+
 */
-/* $Id: php_packet_soap.c,v 1.43 2006/01/01 13:09:53 sniper Exp $ */
+/* $Id: php_packet_soap.c,v 1.44 2006/07/10 07:41:52 dmitry Exp $ */
 
 #include "php_soap.h"
 
@@ -191,12 +191,16 @@
 
                        tmp = get_node(fault->children,"faultstring");
                        if (tmp != NULL && tmp->children != NULL) {
-                               faultstring = tmp->children->content;
+                               zval *zv = 
master_to_zval(get_conversion(IS_STRING), tmp);
+                               faultstring = Z_STRVAL_P(zv);
+                               FREE_ZVAL(zv);
                        }
 
                        tmp = get_node(fault->children,"faultactor");
                        if (tmp != NULL && tmp->children != NULL) {
-                               faultactor = tmp->children->content;
+                               zval *zv = 
master_to_zval(get_conversion(IS_STRING), tmp);
+                               faultactor = Z_STRVAL_P(zv);
+                               FREE_ZVAL(zv);
                        }
 
                        tmp = get_node(fault->children,"detail");
@@ -217,7 +221,9 @@
                                /* TODO: lang attribute */
                                tmp = get_node(tmp->children,"Text");
                                if (tmp != NULL && tmp->children != NULL) {
-                                       faultstring = tmp->children->content;
+                                       zval *zv = 
master_to_zval(get_conversion(IS_STRING), tmp);
+                                       faultstring = Z_STRVAL_P(zv);
+                                       FREE_ZVAL(zv);
                                }
                        }
 
@@ -227,6 +233,12 @@
                        }
                }
                add_soap_fault(this_ptr, faultcode, faultstring, faultactor, 
details TSRMLS_CC);
+               if (faultstring) {
+                       efree(faultstring);
+               }
+               if (faultactor) {
+                       efree(faultactor);
+               }
 #ifdef ZEND_ENGINE_2
                if (details) {
                        details->refcount--;
http://cvs.php.net/viewvc.cgi/php-src/ext/soap/soap.c?r1=1.191&r2=1.192&diff_format=u
Index: php-src/ext/soap/soap.c
diff -u php-src/ext/soap/soap.c:1.191 php-src/ext/soap/soap.c:1.192
--- php-src/ext/soap/soap.c:1.191       Sat Jun  3 11:19:43 2006
+++ php-src/ext/soap/soap.c     Mon Jul 10 07:41:52 2006
@@ -17,7 +17,7 @@
   |          Dmitry Stogov <[EMAIL PROTECTED]>                             |
   +----------------------------------------------------------------------+
 */
-/* $Id: soap.c,v 1.191 2006/06/03 11:19:43 mike Exp $ */
+/* $Id: soap.c,v 1.192 2006/07/10 07:41:52 dmitry Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -3731,20 +3731,12 @@
                                efree(str);
                        }
                        if (zend_hash_find(prop, "faultstring", 
sizeof("faultstring"), (void**)&tmp) == SUCCESS) {
-                               int new_len;
-                               xmlNodePtr node = xmlNewNode(NULL, 
"faultstring");
-                               char *str = 
php_escape_html_entities(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &new_len, 0, 0, 
NULL TSRMLS_CC);
-                               xmlAddChild(param, node);
-                               xmlNodeSetContentLen(node, str, new_len);
-                               efree(str);
+                               xmlNodePtr node = 
master_to_xml(get_conversion(IS_STRING), *tmp, SOAP_LITERAL, param);
+                               xmlNodeSetName(node, "faultstring");
                        }
                        if (zend_hash_find(prop, "faultactor", 
sizeof("faultactor"), (void**)&tmp) == SUCCESS) {
-                               int new_len;
-                               xmlNodePtr node = xmlNewNode(NULL, 
"faultactor");
-                               char *str = 
php_escape_html_entities(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &new_len, 0, 0, 
NULL TSRMLS_CC);
-                               xmlAddChild(param, node);
-                               xmlNodeSetContentLen(node, str, new_len);
-                               efree(str);
+                               xmlNodePtr node = 
master_to_xml(get_conversion(IS_STRING), *tmp, SOAP_LITERAL, param);
+                               xmlNodeSetName(node, "faultactor");
                        }
                        detail_name = "detail";
                } else {
@@ -3762,12 +3754,10 @@
                                efree(str);
                        }
                        if (zend_hash_find(prop, "faultstring", 
sizeof("faultstring"), (void**)&tmp) == SUCCESS) {
-                               int new_len;
                                xmlNodePtr node = xmlNewChild(param, ns, 
"Reason", NULL);
-                               char *str = 
php_escape_html_entities(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp), &new_len, 0, 0, 
NULL TSRMLS_CC);
-                               node = xmlNewChild(node, ns, "Text", NULL);
-                               xmlNodeSetContentLen(node, str, new_len);
-                               efree(str);
+                               node = master_to_xml(get_conversion(IS_STRING), 
*tmp, SOAP_LITERAL, node);
+                               xmlNodeSetName(node, "Text");
+                               xmlSetNs(node, ns);
                        }
                        detail_name = SOAP_1_2_ENV_NS_PREFIX":Detail";
                }
http://cvs.php.net/viewvc.cgi/php-src/ext/soap/tests/bugs/bug38005.phpt?r1=1.1&r2=1.2&diff_format=u
Index: php-src/ext/soap/tests/bugs/bug38005.phpt
diff -u /dev/null php-src/ext/soap/tests/bugs/bug38005.phpt:1.2
--- /dev/null   Mon Jul 10 07:41:52 2006
+++ php-src/ext/soap/tests/bugs/bug38005.phpt   Mon Jul 10 07:41:52 2006
@@ -0,0 +1,41 @@
+--TEST--
+Bug #38005 (SoapFault faultstring doesn't follow encoding rules)
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+function Test($param) {
+       return new SoapFault('Test', 'This is our fault: Ä');
+}
+
+class TestSoapClient extends SoapClient {
+  function __construct($wsdl, $opt) {
+    parent::__construct($wsdl, $opt);
+    $this->server = new SoapServer($wsdl, $opt);
+    $this->server->addFunction('Test');
+  }
+
+  function __doRequest($request, $location, $action, $version) {
+    ob_start();
+    $this->server->handle($request);
+    $response = ob_get_contents();
+    ob_end_clean();
+    return $response;
+  }
+}
+
+$client = new TestSoapClient(NULL, array(
+    'encoding' => 'ISO-8859-1',
+       'uri' => "test://",
+       'location' => "test://",
+       'soap_version'=>SOAP_1_2,
+       'trace'=>1, 
+       'exceptions'=>0));
+$res = $client->Test();
+echo($res->faultstring."\n");
+echo($client->__getLastResponse());
+?>
+--EXPECT--
+This is our fault: Ä
+<?xml version="1.0" encoding="UTF-8"?>
+<env:Envelope 
xmlns:env="http://www.w3.org/2003/05/soap-envelope";><env:Body><env:Fault><env:Code><env:Value>Test</env:Value></env:Code><env:Reason><env:Text>This
 is our fault: Ä</env:Text></env:Reason></env:Fault></env:Body></env:Envelope>

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to