From 85f6c5ecb5094c17aa7a0134006534a8b8387274 Mon Sep 17 00:00:00 2001 From: gggeek Date: Sat, 18 Apr 2015 02:06:44 +0100 Subject: [PATCH] fix: the client can now successfully call methods using ISO-8859-1 or UTF-8 characters in their name --- NEWS | 11 ++++--- demo/server/server.php | 30 ++++++++++++------ src/Request.php | 5 +-- tests/3LocalhostTest.php | 66 ++++++++++++++++++++++++++-------------- 4 files changed, 74 insertions(+), 38 deletions(-) diff --git a/NEWS b/NEWS index 6d86918..e1045d3 100644 --- a/NEWS +++ b/NEWS @@ -38,13 +38,16 @@ PLEASE READ CAREFULLY THE NOTES BELOW to insure a smooth upgrade. * improved: the testsuite has basic checks for the debugger and demo files -* fixed: the debugger would fail sending a request with ISO-8859-1 payload (it missed the character set declaration) +* fixed: the debugger would fail sending a request with ISO-8859-1 payload (it missed the character set declaration). + It would have a hard time coping with ISO-8859-1 in other fields, such as e.g. the remote method name -* fixed: the server would fail to decode a request with ISO-8859-1 payload and character set declaration in the xml prologue only +* fixed: the server would fail to decode a request with ISO-8859-1 payload and character set declaration in the xml prolog only -* fixed: the client would fail to decode a response with ISO-8859-1 payload and character set declaration in the xml prologue only +* fixed: the client would fail to decode a response with ISO-8859-1 payload and character set declaration in the xml prolog only -* fixed: the function decode_xml() would not decode an xml with character set declaration in the xml prologue +* fixed: the function decode_xml() would not decode an xml with character set declaration in the xml prolog + +* fixed: the client can now successfully call methods using ISO-8859-1 or UTF-8 characters in their name * improved: echo all debug messages even when there are characters in them which php deems in a wrong encoding (this is visible e.g. in the debugger) diff --git a/demo/server/server.php b/demo/server/server.php index 93585bf..88938d4 100644 --- a/demo/server/server.php +++ b/demo/server/server.php @@ -86,6 +86,7 @@ in an alphabetic order.'; function findState($m) { global $stateNames; + $err = ""; // get the first param $sno = $m->getParam(0); @@ -122,6 +123,7 @@ function findState($m) function inner_findstate($stateNo) { global $stateNames; + if (isset($stateNames[$stateNo - 1])) { return $stateNames[$stateNo - 1]; } else { @@ -166,10 +168,7 @@ $stringecho_doc = 'Accepts a string parameter, returns the string.'; function stringEcho($m) { // just sends back a string - $s = $m->getParam(0); - $v = $s->scalarval(); - - return new PhpXmlRpc\Response(new Value($s->scalarval())); + return new PhpXmlRpc\Response(new Value($m->getParam(0)->scalarval())); } $echoback_sig = array(array(Value::$xmlrpcString, Value::$xmlrpcString)); @@ -186,9 +185,8 @@ $echosixtyfour_sig = array(array(Value::$xmlrpcString, Value::$xmlrpcBase64)); $echosixtyfour_doc = 'Accepts a base64 parameter and returns it decoded as a string'; function echoSixtyFour($m) { - // accepts an encoded value, but sends it back - // as a normal string. this is to test base64 encoding - // is working as expected + // Accepts an encoded value, but sends it back as a normal string. + // This is to test that base64 encoding is working as expected $incoming = $m->getParam(0); return new PhpXmlRpc\Response(new Value($incoming->scalarval(), "string")); @@ -306,7 +304,6 @@ $mailsend_sig = array(array( Value::$xmlrpcString, Value::$xmlrpcString, Value::$xmlrpcString, Value::$xmlrpcString, Value::$xmlrpcString, )); - $mailsend_doc = 'mail.send(recipient, subject, text, sender, cc, bcc, mimetype)
recipient, cc, and bcc are strings, comma-separated lists of email addresses, as described above.
subject is a string, the subject of the message.
@@ -719,13 +716,26 @@ $signatures = array( "docstring" => $bitflipper_doc, ), // signature omitted on purpose - "examples.generatePHPWarning" => array( + "tests.generatePHPWarning" => array( "function" => array($object, "phpWarningGenerator"), ), // signature omitted on purpose - "examples.raiseException" => array( + "tests.raiseException" => array( "function" => array($object, "exceptionGenerator"), ), + /* + // Greek word 'kosme'. NB: NOT a valid ISO8859 string! + // We can only register this when setting internal encoding to UTF-8, or it will break system.listMethods + "tests.utf8methodname." . 'κόσμε' => array( + "function" => "stringEcho", + "signature" => $stringecho_sig, + "docstring" => $stringecho_doc, + ),*/ + "tests.iso88591methodname." . chr(224) . chr(252) . chr(232) => array( + "function" => "stringEcho", + "signature" => $stringecho_sig, + "docstring" => $stringecho_doc, + ), "examples.getallheaders" => array( "function" => 'getallheaders_xmlrpc', "signature" => $getallheaders_sig, diff --git a/src/Request.php b/src/Request.php index 7d5a8a0..df899e3 100644 --- a/src/Request.php +++ b/src/Request.php @@ -2,9 +2,10 @@ namespace PhpXmlRpc; +use PhpXmlRpc\Helper\Charset; use PhpXmlRpc\Helper\Http; -use PhpXmlRpc\Helper\XMLParser; use PhpXmlRpc\Helper\Logger; +use PhpXmlRpc\Helper\XMLParser; class Request { @@ -52,7 +53,7 @@ class Request $this->content_type = 'text/xml'; } $this->payload = $this->xml_header($charsetEncoding); - $this->payload .= '' . $this->methodname . "\n"; + $this->payload .= '' . Charset::instance()->encodeEntities($this->methodname, PhpXmlRpc::$xmlrpc_internalencoding, $charsetEncoding) . "\n"; $this->payload .= "\n"; foreach ($this->params as $p) { $this->payload .= "\n" . $p->serialize($charsetEncoding) . diff --git a/tests/3LocalhostTest.php b/tests/3LocalhostTest.php index e73bf61..e6cc42d 100644 --- a/tests/3LocalhostTest.php +++ b/tests/3LocalhostTest.php @@ -108,7 +108,7 @@ class LocalhostTest extends PHPUnit_Framework_TestCase } } - protected function send($msg, $errrorcode = 0, $return_response = false) + protected function send($msg, $errorCode = 0, $returnResponse = false) { if ($this->collectCodeCoverageInformation) { $this->client->setCookie('PHPUNIT_SELENIUM_TEST_ID', $this->testId); @@ -119,13 +119,13 @@ class LocalhostTest extends PHPUnit_Framework_TestCase if (is_array($r)) { return $r; } - if (is_array($errrorcode)) { - $this->assertContains($r->faultCode(), $errrorcode, 'Error ' . $r->faultCode() . ' connecting to server: ' . $r->faultString()); + if (is_array($errorCode)) { + $this->assertContains($r->faultCode(), $errorCode, 'Error ' . $r->faultCode() . ' connecting to server: ' . $r->faultString()); } else { - $this->assertEquals($r->faultCode(), $errrorcode, 'Error ' . $r->faultCode() . ' connecting to server: ' . $r->faultString()); + $this->assertEquals($r->faultCode(), $errorCode, 'Error ' . $r->faultCode() . ' connecting to server: ' . $r->faultString()); } if (!$r->faultCode()) { - if ($return_response) { + if ($returnResponse) { return $r; } else { return $r->value(); @@ -137,7 +137,7 @@ class LocalhostTest extends PHPUnit_Framework_TestCase public function testString() { - $sendstring = "here are 3 \"entities\": < > & " . + $sendString = "here are 3 \"entities\": < > & " . "and here's a dollar sign: \$pretendvarname and a backslash too: " . chr(92) . " - isn't that great? \\\"hackery\\\" at it's best " . " also don't want to miss out on \$item[0]. " . @@ -147,35 +147,57 @@ class LocalhostTest extends PHPUnit_Framework_TestCase "and then LFCR" . chr(10) . chr(13) . "last but not least weird names: G" . chr(252) . "nter, El" . chr(232) . "ne, and an xml comment closing tag: -->"; $f = new xmlrpcmsg('examples.stringecho', array( - new xmlrpcval($sendstring, 'string'), + new xmlrpcval($sendString, 'string'), )); $v = $this->send($f); if ($v) { // when sending/receiving non-US-ASCII encoded strings, XML says cr-lf can be normalized. // so we relax our tests... - $l1 = strlen($sendstring); + $l1 = strlen($sendString); $l2 = strlen($v->scalarval()); if ($l1 == $l2) { - $this->assertEquals($sendstring, $v->scalarval()); + $this->assertEquals($sendString, $v->scalarval()); } else { - $this->assertEquals(str_replace(array("\r\n", "\r"), array("\n", "\n"), $sendstring), $v->scalarval()); + $this->assertEquals(str_replace(array("\r\n", "\r"), array("\n", "\n"), $sendString), $v->scalarval()); } } } public function testLatin1String() { - $sendstring = + $sendString = "last but not least weird names: G" . chr(252) . "nter, El" . chr(232) . "ne"; $f = 'examples.stringecho'. - $sendstring. + $sendString. ''; $v = $this->send($f); if ($v) { - $this->assertEquals($sendstring, $v->scalarval()); + $this->assertEquals($sendString, $v->scalarval()); } } + public function testLatin1Method() + { + $f = new xmlrpcmsg("tests.iso88591methodname." . chr(224) . chr(252) . chr(232), array( + new xmlrpcval('hello') + )); + $v = $this->send($f); + if ($v) { + $this->assertEquals('hello', $v->scalarval()); + } + } + + /*public function testUtf8Method() + { + $f = new xmlrpcmsg("tests.utf8methodname." . 'κόσμε', array( + new xmlrpcval('hello') + )); + $v = $this->send($f); + if ($v) { + $this->assertEquals('hello', $v->scalarval()); + } + }*/ + public function testAddingDoubles() { // note that rounding errors mean we @@ -250,7 +272,7 @@ class LocalhostTest extends PHPUnit_Framework_TestCase public function testBase64() { - $sendstring = 'Mary had a little lamb, + $sendString = 'Mary had a little lamb, Whose fleece was white as snow, And everywhere that Mary went the lamb was sure to go. @@ -260,14 +282,14 @@ She tied it to a pylon Ten thousand volts went down its back And turned it into nylon'; $f = new xmlrpcmsg('examples.decode64', array( - new xmlrpcval($sendstring, 'base64'), + new xmlrpcval($sendString, 'base64'), )); $v = $this->send($f); if ($v) { - if (strlen($sendstring) == strlen($v->scalarval())) { - $this->assertEquals($sendstring, $v->scalarval()); + if (strlen($sendString) == strlen($v->scalarval())) { + $this->assertEquals($sendString, $v->scalarval()); } else { - $this->assertEquals(str_replace(array("\r\n", "\r"), array("\n", "\n"), $sendstring), $v->scalarval()); + $this->assertEquals(str_replace(array("\r\n", "\r"), array("\n", "\n"), $sendString), $v->scalarval()); } } } @@ -290,9 +312,9 @@ And turned it into nylon'; public function testCountEntities() { - $sendstring = "h'fd>onc>>l>>rw&bpu>q>esend($f); if ($v) { @@ -491,7 +513,7 @@ And turned it into nylon'; public function testCatchWarnings() { - $f = new xmlrpcmsg('examples.generatePHPWarning', array( + $f = new xmlrpcmsg('tests.generatePHPWarning', array( new xmlrpcval('whatever', 'string'), )); $v = $this->send($f); @@ -502,7 +524,7 @@ And turned it into nylon'; public function testCatchExceptions() { - $f = new xmlrpcmsg('examples.raiseException', array( + $f = new xmlrpcmsg('tests.raiseException', array( new xmlrpcval('whatever', 'string'), )); $v = $this->send($f, $GLOBALS['xmlrpcerr']['server_error']); -- 2.43.0