fix: the client can now successfully call methods using ISO-8859-1 or UTF-8 character...
authorgggeek <giunta.gaetano@gmail.com>
Sat, 18 Apr 2015 01:06:44 +0000 (02:06 +0100)
committergggeek <giunta.gaetano@gmail.com>
Sat, 18 Apr 2015 01:06:44 +0000 (02:06 +0100)
NEWS
demo/server/server.php
src/Request.php
tests/3LocalhostTest.php

diff --git a/NEWS b/NEWS
index 6d86918..e1045d3 100644 (file)
--- 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)
index 93585bf..88938d4 100644 (file)
@@ -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)<br/>
 recipient, cc, and bcc are strings, comma-separated lists of email addresses, as described above.<br/>
 subject is a string, the subject of the message.<br/>
@@ -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,
index 7d5a8a0..df899e3 100644 (file)
@@ -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 .= '<methodName>' . $this->methodname . "</methodName>\n";
+        $this->payload .= '<methodName>' . Charset::instance()->encodeEntities($this->methodname, PhpXmlRpc::$xmlrpc_internalencoding, $charsetEncoding) . "</methodName>\n";
         $this->payload .= "<params>\n";
         foreach ($this->params as $p) {
             $this->payload .= "<param>\n" . $p->serialize($charsetEncoding) .
index e73bf61..e6cc42d 100644 (file)
@@ -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 = '<?xml version="1.0" encoding="ISO-8859-1"?><methodCall><methodName>examples.stringecho</methodName><params><param><value>'.
-            $sendstring.
+            $sendString.
             '</value></param></params></methodCall>';
         $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>e<v&gxs<ytjzkami<";
+        $sendString = "h'fd>onc>>l>>rw&bpu>q>e<v&gxs<ytjzkami<";
         $f = new xmlrpcmsg('validator1.countTheEntities', array(
-            new xmlrpcval($sendstring, 'string'),
+            new xmlrpcval($sendString, 'string'),
         ));
         $v = $this->send($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']);