mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
- Fixed bug #50285 (xmlrpc does not preserve keys in encoded indexed arrays)
This commit is contained in:
parent
58ae9eeb11
commit
74d4059fb1
3 changed files with 134 additions and 3 deletions
|
@ -484,7 +484,7 @@ static void set_output_options(php_output_options* options, zval* output_opts)
|
|||
static XMLRPC_VECTOR_TYPE determine_vector_type (HashTable *ht)
|
||||
{
|
||||
int bArray = 0, bStruct = 0, bMixed = 0;
|
||||
unsigned long num_index;
|
||||
unsigned long num_index, last_num = 0;
|
||||
char* my_key;
|
||||
|
||||
zend_hash_internal_pointer_reset(ht);
|
||||
|
@ -495,8 +495,12 @@ static XMLRPC_VECTOR_TYPE determine_vector_type (HashTable *ht)
|
|||
if (bStruct) {
|
||||
bMixed = 1;
|
||||
break;
|
||||
} else if (last_num > 0 && last_num != num_index-1) {
|
||||
bStruct = 1;
|
||||
break;
|
||||
}
|
||||
bArray = 1;
|
||||
last_num = num_index;
|
||||
} else if (res == HASH_KEY_NON_EXISTANT) {
|
||||
break;
|
||||
} else if (res == HASH_KEY_IS_STRING) {
|
||||
|
@ -557,6 +561,7 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep
|
|||
char* my_key;
|
||||
HashTable *ht = NULL;
|
||||
zval *val_arr;
|
||||
XMLRPC_VECTOR_TYPE vtype;
|
||||
|
||||
ht = HASH_OF(val);
|
||||
if (ht && ht->nApplyCount > 1) {
|
||||
|
@ -570,7 +575,8 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep
|
|||
INIT_PZVAL(val_arr);
|
||||
convert_to_array(val_arr);
|
||||
|
||||
xReturn = XMLRPC_CreateVector(key, determine_vector_type(Z_ARRVAL_P(val_arr)));
|
||||
vtype = determine_vector_type(Z_ARRVAL_P(val_arr));
|
||||
xReturn = XMLRPC_CreateVector(key, vtype);
|
||||
|
||||
zend_hash_internal_pointer_reset(Z_ARRVAL_P(val_arr));
|
||||
while(zend_hash_get_current_data(Z_ARRVAL_P(val_arr), (void**)&pIter) == SUCCESS) {
|
||||
|
@ -586,7 +592,15 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep
|
|||
ht->nApplyCount++;
|
||||
}
|
||||
if (res == HASH_KEY_IS_LONG) {
|
||||
XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(0, *pIter, depth++ TSRMLS_CC));
|
||||
char *num_str = NULL;
|
||||
|
||||
if (vtype != xmlrpc_vector_array) {
|
||||
spprintf(&num_str, 0, "%ld", num_index);
|
||||
}
|
||||
XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(num_str, *pIter, depth++ TSRMLS_CC));
|
||||
if (num_str) {
|
||||
efree(num_str);
|
||||
}
|
||||
} else {
|
||||
XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(my_key, *pIter, depth++ TSRMLS_CC));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue