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
 
 
 * 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)
 
 * 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;
 function findState($m)
 {
     global $stateNames;
+
     $err = "";
     // get the first param
     $sno = $m->getParam(0);
     $err = "";
     // get the first param
     $sno = $m->getParam(0);
@@ -122,6 +123,7 @@ function findState($m)
 function inner_findstate($stateNo)
 {
     global $stateNames;
 function inner_findstate($stateNo)
 {
     global $stateNames;
+
     if (isset($stateNames[$stateNo - 1])) {
         return $stateNames[$stateNo - 1];
     } else {
     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
 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));
 }
 
 $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)
 {
 $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"));
     $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,
 ));
     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/>
 $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
         "docstring" => $bitflipper_doc,
     ),
     // signature omitted on purpose
-    "examples.generatePHPWarning" => array(
+    "tests.generatePHPWarning" => array(
         "function" => array($object, "phpWarningGenerator"),
     ),
     // signature omitted on purpose
         "function" => array($object, "phpWarningGenerator"),
     ),
     // signature omitted on purpose
-    "examples.raiseException" => array(
+    "tests.raiseException" => array(
         "function" => array($object, "exceptionGenerator"),
     ),
         "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,
     "examples.getallheaders" => array(
         "function" => 'getallheaders_xmlrpc',
         "signature" => $getallheaders_sig,
index 7d5a8a0..df899e3 100644 (file)
@@ -2,9 +2,10 @@
 
 namespace PhpXmlRpc;
 
 
 namespace PhpXmlRpc;
 
+use PhpXmlRpc\Helper\Charset;
 use PhpXmlRpc\Helper\Http;
 use PhpXmlRpc\Helper\Http;
-use PhpXmlRpc\Helper\XMLParser;
 use PhpXmlRpc\Helper\Logger;
 use PhpXmlRpc\Helper\Logger;
+use PhpXmlRpc\Helper\XMLParser;
 
 class Request
 {
 
 class Request
 {
@@ -52,7 +53,7 @@ class Request
             $this->content_type = 'text/xml';
         }
         $this->payload = $this->xml_header($charsetEncoding);
             $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) .
         $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);
     {
         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($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 {
         } 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 (!$r->faultCode()) {
-            if ($return_response) {
+            if ($returnResponse) {
                 return $r;
             } else {
                 return $r->value();
                 return $r;
             } else {
                 return $r->value();
@@ -137,7 +137,7 @@ class LocalhostTest extends PHPUnit_Framework_TestCase
 
     public function testString()
     {
 
     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]. " .
             "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(
             "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...
         ));
         $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) {
             $l2 = strlen($v->scalarval());
             if ($l1 == $l2) {
-                $this->assertEquals($sendstring, $v->scalarval());
+                $this->assertEquals($sendString, $v->scalarval());
             } else {
             } 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()
     {
             }
         }
     }
 
     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>'.
             "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) {
             '</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
     public function testAddingDoubles()
     {
         // note that rounding errors mean we
@@ -250,7 +272,7 @@ class LocalhostTest extends PHPUnit_Framework_TestCase
 
     public function testBase64()
     {
 
     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.
 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(
 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) {
         ));
         $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 {
             } 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()
     {
 
     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(
         $f = new xmlrpcmsg('validator1.countTheEntities', array(
-            new xmlrpcval($sendstring, 'string'),
+            new xmlrpcval($sendString, 'string'),
         ));
         $v = $this->send($f);
         if ($v) {
         ));
         $v = $this->send($f);
         if ($v) {
@@ -491,7 +513,7 @@ And turned it into nylon';
 
     public function testCatchWarnings()
     {
 
     public function testCatchWarnings()
     {
-        $f = new xmlrpcmsg('examples.generatePHPWarning', array(
+        $f = new xmlrpcmsg('tests.generatePHPWarning', array(
             new xmlrpcval('whatever', 'string'),
         ));
         $v = $this->send($f);
             new xmlrpcval('whatever', 'string'),
         ));
         $v = $this->send($f);
@@ -502,7 +524,7 @@ And turned it into nylon';
 
     public function testCatchExceptions()
     {
 
     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']);
             new xmlrpcval('whatever', 'string'),
         ));
         $v = $this->send($f, $GLOBALS['xmlrpcerr']['server_error']);