Browse Source

Fixed bug #46419 (Elements of associative arrays with NULL value are lost)

experimental/5.3-FPM
Dmitry Stogov 18 years ago
parent
commit
f946918fc6
  1. 44
      ext/soap/php_encoding.c
  2. 43
      ext/soap/tests/bugs/bug46419.phpt

44
ext/soap/php_encoding.c

@ -2775,33 +2775,31 @@ static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style, xmlNodeP
ulong int_val;
zend_hash_get_current_data(data->value.ht, (void **)&temp_data);
if (Z_TYPE_PP(temp_data) != IS_NULL) {
item = xmlNewNode(NULL, BAD_CAST("item"));
xmlAddChild(xmlParam, item);
key = xmlNewNode(NULL, BAD_CAST("key"));
xmlAddChild(item,key);
if (zend_hash_get_current_key(data->value.ht, &key_val, &int_val, FALSE) == HASH_KEY_IS_STRING) {
if (style == SOAP_ENCODED) {
set_xsi_type(key, "xsd:string");
}
xmlNodeSetContent(key, BAD_CAST(key_val));
} else {
smart_str tmp = {0};
smart_str_append_long(&tmp, int_val);
smart_str_0(&tmp);
if (style == SOAP_ENCODED) {
set_xsi_type(key, "xsd:int");
}
xmlNodeSetContentLen(key, BAD_CAST(tmp.c), tmp.len);
smart_str_free(&tmp);
item = xmlNewNode(NULL, BAD_CAST("item"));
xmlAddChild(xmlParam, item);
key = xmlNewNode(NULL, BAD_CAST("key"));
xmlAddChild(item,key);
if (zend_hash_get_current_key(data->value.ht, &key_val, &int_val, FALSE) == HASH_KEY_IS_STRING) {
if (style == SOAP_ENCODED) {
set_xsi_type(key, "xsd:string");
}
xmlNodeSetContent(key, BAD_CAST(key_val));
} else {
smart_str tmp = {0};
smart_str_append_long(&tmp, int_val);
smart_str_0(&tmp);
xparam = master_to_xml(get_conversion((*temp_data)->type), (*temp_data), style, item);
if (style == SOAP_ENCODED) {
set_xsi_type(key, "xsd:int");
}
xmlNodeSetContentLen(key, BAD_CAST(tmp.c), tmp.len);
xmlNodeSetName(xparam, BAD_CAST("value"));
smart_str_free(&tmp);
}
xparam = master_to_xml(get_conversion((*temp_data)->type), (*temp_data), style, item);
xmlNodeSetName(xparam, BAD_CAST("value"));
zend_hash_move_forward(data->value.ht);
}
}

43
ext/soap/tests/bugs/bug46419.phpt

@ -0,0 +1,43 @@
--TEST--
Bug #46419 (Elements of associative arrays with NULL value are lost)
--SKIPIF--
<?php require_once('skipif.inc'); ?>
--FILE--
<?php
function bar() {
return array('a' => 1, 'b' => NULL, 'c' => 2, 'd'=>'');
}
class LocalSoapClient extends SoapClient {
function __construct($wsdl, $options) {
parent::__construct($wsdl, $options);
$this->server = new SoapServer($wsdl, $options);
$this->server->addFunction('bar');
}
function __doRequest($request, $location, $action, $version, $one_way = 0) {
ob_start();
$this->server->handle($request);
$response = ob_get_contents();
ob_end_clean();
return $response;
}
}
$x = new LocalSoapClient(NULL,array('location'=>'test://',
'uri'=>'http://testuri.org'));
var_dump($x->bar());
?>
--EXPECT--
array(4) {
["a"]=>
int(1)
["b"]=>
NULL
["c"]=>
int(2)
["d"]=>
string(0) ""
}
Loading…
Cancel
Save