Skip to content
Snippets Groups Projects
Commit 8a52cdf3 authored by Andreas Gohr's avatar Andreas Gohr
Browse files

XML-RPC fix for untyped string values FS#1993

includes unit tests. Extensions welcome.
parent 138cf4d4
No related branches found
No related tags found
No related merge requests found
<?php
require_once DOKU_INC.'inc/IXR_Library.php';
class ixr_library_ixr_message_test extends UnitTestCase {
function test_untypedvalue1(){
$xml = '<?xml version="1.0" encoding="UTF-8"?><methodCall><methodName>wiki.getBackLinks</methodName><params><param><value> change </value></param></params></methodCall>';
$ixrmsg = new IXR_Message($xml);
$ixrmsg->parse();
$this->assertEqual($ixrmsg->messageType,'methodCall');
$this->assertEqual($ixrmsg->methodName,'wiki.getBackLinks');
$this->assertEqual($ixrmsg->params,array(' change '));
}
function test_untypedvalue2(){
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>wiki.getBackLinks</methodName>
<params>
<param>
<value> change </value>
</param>
</params>
</methodCall>';
$ixrmsg = new IXR_Message($xml);
$ixrmsg->parse();
$this->assertEqual($ixrmsg->messageType,'methodCall');
$this->assertEqual($ixrmsg->methodName,'wiki.getBackLinks');
$this->assertEqual($ixrmsg->params,array(' change '));
}
function test_stringvalue1(){
$xml = '<?xml version="1.0" encoding="UTF-8"?><methodCall><methodName>wiki.getBackLinks</methodName><params><param><value><string> change </string></value></param></params></methodCall>';
$ixrmsg = new IXR_Message($xml);
$ixrmsg->parse();
$this->assertEqual($ixrmsg->messageType,'methodCall');
$this->assertEqual($ixrmsg->methodName,'wiki.getBackLinks');
$this->assertEqual($ixrmsg->params,array(' change '));
}
function test_stringvalue2(){
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>wiki.getBackLinks</methodName>
<params>
<param>
<value>
<string> change </string>
</value>
</param>
</params>
</methodCall>';
$ixrmsg = new IXR_Message($xml);
$ixrmsg->parse();
$this->assertEqual($ixrmsg->messageType,'methodCall');
$this->assertEqual($ixrmsg->methodName,'wiki.getBackLinks');
$this->assertEqual($ixrmsg->params,array(' change '));
}
function test_emptyvalue1(){
$xml = '<?xml version="1.0" encoding="UTF-8"?><methodCall><methodName>wiki.getBackLinks</methodName><params><param><value><string></string></value></param></params></methodCall>';
$ixrmsg = new IXR_Message($xml);
$ixrmsg->parse();
$this->assertEqual($ixrmsg->messageType,'methodCall');
$this->assertEqual($ixrmsg->methodName,'wiki.getBackLinks');
$this->assertEqual($ixrmsg->params,array(''));
}
function test_emptyvalue2(){
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>wiki.getBackLinks</methodName>
<params>
<param>
<value>
<string></string>
</value>
</param>
</params>
</methodCall>';
$ixrmsg = new IXR_Message($xml);
$ixrmsg->parse();
$this->assertEqual($ixrmsg->messageType,'methodCall');
$this->assertEqual($ixrmsg->methodName,'wiki.getBackLinks');
$this->assertEqual($ixrmsg->params,array(''));
}
function test_struct(){
$xml = '<?xml version=\'1.0\'?>
<methodCall>
<methodName>wiki.putPage</methodName>
<params>
<param>
<value><string>start</string></value>
</param>
<param>
<value><string>test text</string></value>
</param>
<param>
<value><struct>
<member>
<name>sum</name>
<value><string>xmlrpc edit</string></value>
</member>
<member>
<name>minor</name>
<value><string>1</string></value>
</member>
</struct></value>
</param>
</params>
</methodCall>';
$ixrmsg = new IXR_Message($xml);
$ixrmsg->parse();
$this->assertEqual($ixrmsg->messageType,'methodCall');
$this->assertEqual($ixrmsg->methodName,'wiki.putPage');
$this->assertEqual($ixrmsg->params,array('start','test text',array('sum'=>'xmlrpc edit','minor'=>'1')));
}
}
//Setup VIM: ex: et ts=4 enc=utf-8 :
...@@ -136,6 +136,7 @@ class IXR_Message { ...@@ -136,6 +136,7 @@ class IXR_Message {
var $_value; var $_value;
var $_currentTag; var $_currentTag;
var $_currentTagContents; var $_currentTagContents;
var $_lastseen;
// The XML parser // The XML parser
var $_parser; var $_parser;
function IXR_Message ($message) { function IXR_Message ($message) {
...@@ -194,6 +195,7 @@ class IXR_Message { ...@@ -194,6 +195,7 @@ class IXR_Message {
$this->_arraystructs[] = array(); $this->_arraystructs[] = array();
break; break;
} }
$this->_lastseen = $tag;
} }
function cdata($parser, $cdata) { function cdata($parser, $cdata) {
$this->_currentTagContents .= $cdata; $this->_currentTagContents .= $cdata;
...@@ -225,9 +227,11 @@ class IXR_Message { ...@@ -225,9 +227,11 @@ class IXR_Message {
break; break;
case 'value': case 'value':
// "If no type is indicated, the type is string." // "If no type is indicated, the type is string."
$value = (string)$this->_currentTagContents; if($this->_lastseen == 'value'){
$this->_currentTagContents = ''; $value = (string)$this->_currentTagContents;
$valueFlag = true; $this->_currentTagContents = '';
$valueFlag = true;
}
break; break;
case 'boolean': case 'boolean':
$value = (boolean)trim($this->_currentTagContents); $value = (boolean)trim($this->_currentTagContents);
...@@ -278,6 +282,7 @@ class IXR_Message { ...@@ -278,6 +282,7 @@ class IXR_Message {
$this->params[] = $value; $this->params[] = $value;
} }
} }
$this->_lastseen = $tag;
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment