summaryrefslogtreecommitdiff
path: root/ext/xmlrpc/xmlrpc-epi-php.c
diff options
context:
space:
mode:
authorFelipe Pena <felipe@php.net>2009-11-25 02:03:02 +0000
committerFelipe Pena <felipe@php.net>2009-11-25 02:03:02 +0000
commit74d4059fb1114b65cd531597158ac68ee2e2b46a (patch)
treee76b6dd08a6d2c2fe1e9892b29087c3c9e9ef2a4 /ext/xmlrpc/xmlrpc-epi-php.c
parent58ae9eeb11cc6bf49f6608973ad12820fd90fed3 (diff)
downloadphp-git-74d4059fb1114b65cd531597158ac68ee2e2b46a.tar.gz
- Fixed bug #50285 (xmlrpc does not preserve keys in encoded indexed arrays)
Diffstat (limited to 'ext/xmlrpc/xmlrpc-epi-php.c')
-rw-r--r--ext/xmlrpc/xmlrpc-epi-php.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/ext/xmlrpc/xmlrpc-epi-php.c b/ext/xmlrpc/xmlrpc-epi-php.c
index df63759dcb..01de63fec2 100644
--- a/ext/xmlrpc/xmlrpc-epi-php.c
+++ b/ext/xmlrpc/xmlrpc-epi-php.c
@@ -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));
}