<?php
/**
- * @version $Id$
* @author Gaetano Giunta
- * @copyright (C) 2005-2009 G. Giunta
- * @license code licensed under the BSD License: http://phpxmlrpc.sourceforge.net/license.txt
+ * @copyright (C) 2005-2021 G. Giunta
+ * @license code licensed under the BSD License: see file license.txt
*
* @todo switch params for http compression from 0,1,2 to values to be used directly
* @todo use ob_start to catch debug info and echo it AFTER method call results?
* @todo be smarter in creating client stub for proxy/auth cases: only set appropriate property of client obj
**/
+header('Content-Type: text/html; charset=utf-8');
+
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
- <title>XMLRPC Debugger</title>
- <meta name="robots" content="index,nofollow" />
-<style type="text/css">
-<!--
-body {border-top: 1px solid gray; padding: 1em; font-family: Verdana, Arial, Helvetica; font-size: 8pt;}
-h3 {font-size: 9.5pt;}
-h2 {font-size: 12pt;}
-.dbginfo {padding: 1em; background-color: #EEEEEE; border: 1px dashed silver; font-family: monospace;}
-#response {padding: 1em; margin-top: 1em; background-color: #DDDDDD; border: 1px solid gray; white-space: pre; font-family: monospace;}
-table {padding: 2px; margin-top: 1em;}
-th {background-color: navy; color: white; padding: 0.5em;}
-td {padding: 0.5em; font-family: monospace;}
-td form {margin: 0;}
-.oddrow {background-color: #EEEEEE;}
-.evidence {color: blue;}
-#phpcode { background-color: #EEEEEE; padding: 1em; margin-top: 1em;}
--->
-</style>
+ <link rel="icon" type="image/vnd.microsoft.icon" href="favicon.ico">
+ <title><?php if (defined('DEFAULT_WSTYPE') && DEFAULT_WSTYPE == 1) echo 'JSONRPC'; else echo 'XMLRPC'; ?> Debugger</title>
+ <meta name="robots" content="index,nofollow"/>
+ <style type="text/css">
+ <!--
+ body {
+ border-top: 1px solid gray;
+ padding: 1em;
+ font-family: Verdana, Arial, Helvetica;
+ font-size: 8pt;
+ }
+
+ h3 {
+ font-size: 9.5pt;
+ }
+
+ h2 {
+ font-size: 12pt;
+ }
+
+ .dbginfo {
+ padding: 1em;
+ background-color: #EEEEEE;
+ border: 1px dashed silver;
+ font-family: monospace;
+ }
+
+ #response {
+ padding: 1em;
+ margin-top: 1em;
+ background-color: #DDDDDD;
+ border: 1px solid gray;
+ white-space: pre;
+ font-family: monospace;
+ }
+
+ table {
+ padding: 2px;
+ margin-top: 1em;
+ }
+
+ th {
+ background-color: navy;
+ color: white;
+ padding: 0.5em;
+ }
+
+ td {
+ padding: 0.5em;
+ font-family: monospace;
+ }
+
+ td form {
+ margin: 0;
+ }
+
+ .oddrow {
+ background-color: #EEEEEE;
+ }
+
+ .evidence {
+ color: blue;
+ }
+
+ #phpcode {
+ background-color: #EEEEEE;
+ padding: 1em;
+ margin-top: 1em;
+ }
+
+ -->
+ </style>
</head>
<body>
<?php
- include(getcwd().'/common.php');
- if ($action)
- {
+include __DIR__ . '/common.php';
+
+if ($action) {
// make sure the script waits long enough for the call to complete...
- if ($timeout)
- set_time_limit($timeout+10);
-
- include('xmlrpc.inc');
- if ($wstype == 1)
- {
- @include('jsonrpc.inc');
- if (!class_exists('jsonrpc_client'))
- {
- die('Error: to debug the jsonrpc protocol the jsonrpc.inc file is needed');
- }
- $clientclass = 'jsonrpc_client';
- $msgclass = 'jsonrpcmsg';
- $protoname = 'JSONRPC';
- }
- else
- {
- $clientclass = 'xmlrpc_client';
- $msgclass = 'xmlrpcmsg';
- $protoname = 'XMLRPC';
+ if ($timeout) {
+ set_time_limit($timeout + 10);
}
- if ($port != "")
- {
- $client =& new $clientclass($path, $host, $port);
- $server = "$host:$port$path";
+ if ($wstype == 1) {
+ //@include 'jsonrpc.inc';
+ if (!class_exists('\PhpXmlRpc\JsonRpc\Client')) {
+ die('Error: to debug the jsonrpc protocol the phpxmlrpc/jsonrpc package is needed');
+ }
+ $clientClass = '\PhpXmlRpc\JsonRpc\Client';
+ $requestClass = '\PhpXmlRpc\JsonRpc\Request';
+ $protoName = 'JSONRPC';
} else {
- $client =& new $clientclass($path, $host);
- $server = "$host$path";
+ $clientClass = '\PhpXmlRpc\Client';
+ $requestClass = '\PhpXmlRpc\Request';
+ $protoName = 'XMLRPC';
}
- if ($protocol == 2)
- {
- $server = 'https://'.$server;
+
+ if ($port != "") {
+ $client = new $clientClass($path, $host, $port);
+ $server = "$host:$port$path";
+ } else {
+ $client = new $clientClass($path, $host);
+ $server = "$host$path";
}
- else
- {
- $server = 'http://'.$server;
+ if ($protocol == 2) {
+ $server = 'https://' . $server;
+ } else {
+ $server = 'http://' . $server;
}
if ($proxy != '') {
- $pproxy = split(':', $proxy);
- if (count($pproxy) > 1)
- $pport = $pproxy[1];
- else
- $pport = 8080;
- $client->setProxy($pproxy[0], $pport, $proxyuser, $proxypwd);
+ $pproxy = explode(':', $proxy);
+ if (count($pproxy) > 1) {
+ $pport = $pproxy[1];
+ } else {
+ $pport = 8080;
+ }
+ $client->setProxy($pproxy[0], $pport, $proxyuser, $proxypwd);
}
- if ($protocol == 2)
- {
- $client->setSSLVerifyPeer($verifypeer);
- $client->setSSLVerifyHost($verifyhost);
- if ($cainfo)
- {
- $client->setCaCertificate($cainfo);
- }
- $httpprotocol = 'https';
+ if ($protocol == 2) {
+ $client->setSSLVerifyPeer($verifypeer);
+ $client->setSSLVerifyHost($verifyhost);
+ if ($cainfo) {
+ $client->setCaCertificate($cainfo);
+ }
+ $httpprotocol = 'https';
+ } elseif ($protocol == 1) {
+ $httpprotocol = 'http11';
+ } else {
+ $httpprotocol = 'http';
}
- else if ($protocol == 1)
- $httpprotocol = 'http11';
- else
- $httpprotocol = 'http';
- if ($username)
- $client->setCredentials($username, $password, $authtype);
+ if ($username) {
+ $client->setCredentials($username, $password, $authtype);
+ }
$client->setDebug($debug);
switch ($requestcompression) {
- case 0:
- $client->request_compression = '';
- break;
- case 1:
- $client->request_compression = 'gzip';
- break;
- case 2:
- $client->request_compression = 'deflate';
- break;
+ case 0:
+ $client->request_compression = '';
+ break;
+ case 1:
+ $client->request_compression = 'gzip';
+ break;
+ case 2:
+ $client->request_compression = 'deflate';
+ break;
}
switch ($responsecompression) {
- case 0:
- $client->accepted_compression = '';
- break;
- case 1:
- $client->accepted_compression = array('gzip');
- break;
- case 2:
- $client->accepted_compression = array('deflate');
- break;
- case 3:
- $client->accepted_compression = array('gzip', 'deflate');
- break;
+ case 0:
+ $client->accepted_compression = '';
+ break;
+ case 1:
+ $client->accepted_compression = array('gzip');
+ break;
+ case 2:
+ $client->accepted_compression = array('deflate');
+ break;
+ case 3:
+ $client->accepted_compression = array('gzip', 'deflate');
+ break;
}
$cookies = explode(',', $clientcookies);
- foreach ($cookies as $cookie)
- {
- if (strpos($cookie, '='))
- {
- $cookie = explode('=', $cookie);
- $client->setCookie(trim($cookie[0]), trim(@$cookie[1]));
- }
+ foreach ($cookies as $cookie) {
+ if (strpos($cookie, '=')) {
+ $cookie = explode('=', $cookie);
+ $client->setCookie(trim($cookie[0]), trim(@$cookie[1]));
+ }
}
$msg = array();
switch ($action) {
-
- case 'wrap':
- @include('xmlrpc_wrappers.inc');
- if (!function_exists('build_remote_method_wrapper_code'))
- {
- die('Error: to enable creation of method stubs the xmlrpc_wrappers.inc file is needed');
- }
// fall thru intentionally
- case 'describe':
- case 'wrap':
- $msg[0] =& new $msgclass('system.methodHelp', null, $id);
- $msg[0]->addparam(new xmlrpcval($method));
- $msg[1] =& new $msgclass('system.methodSignature', null, $id+1);
- $msg[1]->addparam(new xmlrpcval($method));
- $actionname = 'Description of method "'.$method.'"';
- break;
- case 'list':
- $msg[0] =& new $msgclass('system.listMethods', null, $id);
- $actionname = 'List of available methods';
- break;
- case 'execute':
- if (!payload_is_safe($payload))
- die("Tsk tsk tsk, please stop it or I will have to call in the cops!");
- $msg[0] =& new $msgclass($method, null, $id);
- // hack! build xml payload by hand
- if ($wstype == 1)
- {
- $msg[0]->payload = "{\n".
- '"method": "' . $method . "\",\n\"params\": [" .
- $payload .
- "\n],\n\"id\": ";
- // fix: if user gave an empty string, use NULL, or we'll break json syntax
- if ($id == "")
- {
- $msg[0]->payload .= "null\n}";
+ case 'describe':
+ case 'wrap':
+ $msg[0] = new $requestClass('system.methodHelp', array(), $id);
+ $msg[0]->addparam(new PhpXmlRpc\Value($method));
+ $msg[1] = new $requestClass('system.methodSignature', array(), (int)$id + 1);
+ $msg[1]->addparam(new PhpXmlRpc\Value($method));
+ $actionname = 'Description of method "' . $method . '"';
+ break;
+ case 'list':
+ $msg[0] = new $requestClass('system.listMethods', array(), $id);
+ $actionname = 'List of available methods';
+ break;
+ case 'execute':
+ if (!payload_is_safe($payload)) {
+ die("Tsk tsk tsk, please stop it or I will have to call in the cops!");
}
- else
- {
- if (is_numeric($id) || $id == 'false' || $id == 'true' || $id == 'null')
- {
- $msg[0]->payload .= "$id\n}";
- }
- else
- {
- $msg[0]->payload .= "\"$id\"\n}";
- }
+ $msg[0] = new $requestClass($method, array(), $id);
+ // hack! build xml payload by hand
+ if ($wstype == 1) {
+ $msg[0]->payload = "{\n" .
+ '"method": "' . $method . "\",\n\"params\": [" .
+ $payload .
+ "\n],\n\"id\": ";
+ // fix: if user gave an empty string, use NULL, or we'll break json syntax
+ if ($id == "") {
+ $msg[0]->payload .= "null\n}";
+ } else {
+ if (is_numeric($id) || $id == 'false' || $id == 'true' || $id == 'null') {
+ $msg[0]->payload .= "$id\n}";
+ } else {
+ $msg[0]->payload .= "\"$id\"\n}";
+ }
+ }
+ } else {
+ $msg[0]->payload = $msg[0]->xml_header($inputcharset) .
+ '<methodName>' . $method . "</methodName>\n<params>" .
+ $payload .
+ "</params>\n" . $msg[0]->xml_footer();
}
- }
- else
- $msg[0]->payload = $msg[0]->xml_header() .
- '<methodName>' . $method . "</methodName>\n<params>" .
- $payload .
- "</params>\n" . $msg[0]->xml_footer();
- $actionname = 'Execution of method '.$method;
- break;
- default: // give a warning
- $actionname = '[ERROR: unknown action] "'.$action.'"';
+ $actionname = 'Execution of method ' . $method;
+ break;
+ default: // give a warning
+ $actionname = '[ERROR: unknown action] "' . $action . '"';
}
// Before calling execute, echo out brief description of action taken + date and time ???
// this gives good user feedback for long-running methods...
- echo '<h2>'.htmlspecialchars($actionname).' on server '.htmlspecialchars($server)." ...</h2>\n";
+ echo '<h2>' . htmlspecialchars($actionname, ENT_COMPAT, $inputcharset) . ' on server ' . htmlspecialchars($server, ENT_COMPAT, $inputcharset) . " ...</h2>\n";
flush();
$response = null;
// execute method(s)
- if ($debug)
- echo '<div class="dbginfo"><h2>Debug info:</h2>'; /// @todo use ob_start instead
+ if ($debug) {
+ echo '<div class="dbginfo"><h2>Debug info:</h2>';
+ } /// @todo use ob_start instead
$resp = array();
- $mtime = explode(' ',microtime());
- $time = (float)$mtime[0] + (float)$mtime[1];
- foreach ($msg as $message)
- {
- // catch errors: for older xmlrpc libs, send does not return by ref
- @$response =& $client->send($message, $timeout, $httpprotocol);
- $resp[] = $response;
- if (!$response || $response->faultCode())
- break;
+ $time = microtime(true);
+ foreach ($msg as $message) {
+ // catch errors: for older xmlrpc libs, send does not return by ref
+ @$response = $client->send($message, $timeout, $httpprotocol);
+ $resp[] = $response;
+ if (!$response || $response->faultCode()) {
+ break;
+ }
}
- $mtime = explode(' ',microtime());
- $time = (float)$mtime[0] + (float)$mtime[1] - $time;
- if ($debug)
- echo "</div>\n";
-
- if ($response)
- {
-
- if ($response->faultCode())
- {
- // call failed! echo out error msg!
- //echo '<h2>'.htmlspecialchars($actionname).' on server '.htmlspecialchars($server).'</h2>';
- echo "<h3>$protoname call FAILED!</h3>\n";
- echo "<p>Fault code: [" . htmlspecialchars($response->faultCode()) .
- "] Reason: '" . htmlspecialchars($response->faultString()) . "'</p>\n";
- echo (strftime("%d/%b/%Y:%H:%M:%S\n"));
+ $time = microtime(true) - $time;
+ if ($debug) {
+ echo "</div>\n";
}
- else
- {
- // call succeeded: parse results
- //echo '<h2>'.htmlspecialchars($actionname).' on server '.htmlspecialchars($server).'</h2>';
- printf ("<h3>%s call(s) OK (%.2f secs.)</h3>\n", $protoname, $time);
- echo (strftime("%d/%b/%Y:%H:%M:%S\n"));
-
- switch ($action)
- {
- case 'list':
-
- $v = $response->value();
- if ($v->kindOf()=="array")
- {
- $max = $v->arraysize();
- echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n";
- echo "<thead>\n<tr><th>Method</th><th>Description</th></tr>\n</thead>\n<tbody>\n";
- for($i=0; $i < $max; $i++)
- {
- $rec = $v->arraymem($i);
- if ($i%2) $class=' class="oddrow"'; else $class = ' class="evenrow"';
- echo ("<tr><td$class>".htmlspecialchars($rec->scalarval())."</td><td$class><form action=\"controller.php\" method=\"get\" target=\"frmcontroller\">".
- "<input type=\"hidden\" name=\"host\" value=\"".htmlspecialchars($host)."\" />".
- "<input type=\"hidden\" name=\"port\" value=\"".htmlspecialchars($port)."\" />".
- "<input type=\"hidden\" name=\"path\" value=\"".htmlspecialchars($path)."\" />".
- "<input type=\"hidden\" name=\"id\" value=\"".htmlspecialchars($id)."\" />".
- "<input type=\"hidden\" name=\"debug\" value=\"$debug\" />".
- "<input type=\"hidden\" name=\"username\" value=\"".htmlspecialchars($username)."\" />".
- "<input type=\"hidden\" name=\"password\" value=\"".htmlspecialchars($password)."\" />".
- "<input type=\"hidden\" name=\"authtype\" value=\"$authtype\" />".
- "<input type=\"hidden\" name=\"verifyhost\" value=\"$verifyhost\" />".
- "<input type=\"hidden\" name=\"verifypeer\" value=\"$verifypeer\" />".
- "<input type=\"hidden\" name=\"cainfo\" value=\"".htmlspecialchars($cainfo)."\" />".
- "<input type=\"hidden\" name=\"proxy\" value=\"".htmlspecialchars($proxy)."\" />".
- "<input type=\"hidden\" name=\"proxyuser\" value=\"".htmlspecialchars($proxyuser)."\" />".
- "<input type=\"hidden\" name=\"proxypwd\" value=\"".htmlspecialchars($proxypwd)."\" />".
- "<input type=\"hidden\" name=\"responsecompression\" value=\"$responsecompression\" />".
- "<input type=\"hidden\" name=\"requestcompression\" value=\"$requestcompression\" />".
- "<input type=\"hidden\" name=\"clientcookies\" value=\"".htmlspecialchars($clientcookies)."\" />".
- "<input type=\"hidden\" name=\"protocol\" value=\"$protocol\" />".
- "<input type=\"hidden\" name=\"timeout\" value=\"".htmlspecialchars($timeout)."\" />".
- "<input type=\"hidden\" name=\"method\" value=\"".$rec->scalarval()."\" />".
- "<input type=\"hidden\" name=\"wstype\" value=\"$wstype\" />".
- "<input type=\"hidden\" name=\"action\" value=\"describe\" />".
- "<input type=\"hidden\" name=\"run\" value=\"now\" />".
- "<input type=\"submit\" value=\"Describe\" /></form></td>");
- //echo("</tr>\n");
-
- // generate lo scheletro per il method payload per eventuali test
- //$methodpayload="<methodCall>\n<methodName>".$rec->scalarval()."</methodName>\n<params>\n<param><value></value></param>\n</params>\n</methodCall>";
-
- /*echo ("<form action=\"{$_SERVER['PHP_SELF']}\" method=\"get\"><td>".
- "<input type=\"hidden\" name=\"host\" value=\"$host\" />".
- "<input type=\"hidden\" name=\"port\" value=\"$port\" />".
- "<input type=\"hidden\" name=\"path\" value=\"$path\" />".
- "<input type=\"hidden\" name=\"method\" value=\"".$rec->scalarval()."\" />".
- "<input type=\"hidden\" name=\"methodpayload\" value=\"$payload\" />".
- "<input type=\"hidden\" name=\"action\" value=\"execute\" />".
- "<input type=\"submit\" value=\"Test\" /></td></form>");*/
- echo("</tr>\n");
- }
- echo "</tbody>\n</table>";
- }
- break;
- case 'describe':
-
- $r1 = $resp[0]->value();
- $r2 = $resp[1]->value();
-
- echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n";
- echo "<thead>\n<tr><th>Method</th><th>".htmlspecialchars($method)."</th><th> </th><th> </th></tr>\n</thead>\n<tbody>\n";
- $desc = htmlspecialchars($r1->scalarval());
- if ($desc == "")
- $desc = "-";
- echo "<tr><td class=\"evenrow\">Description</td><td colspan=\"3\" class=\"evenrow\">$desc</td></tr>\n";
- $payload="";
- $alt_payload="";
- if ($r2->kindOf()!="array")
- echo "<tr><td class=\"oddrow\">Signature</td><td class=\"oddrow\">Unknown</td><td class=\"oddrow\"> </td></tr>\n";
- else
- {
- for($i=0; $i < $r2->arraysize(); $i++)
- {
- if ($i+1%2) $class=' class="oddrow"'; else $class = ' class="evenrow"';
- echo "<tr><td$class>Signature ".($i+1)."</td><td$class>";
- $x = $r2->arraymem($i);
- if ($x->kindOf()=="array")
- {
- $ret = $x->arraymem(0);
- echo "<code>OUT: " . htmlspecialchars($ret->scalarval()) . "<br />IN: (";
- if ($x->arraysize() > 1)
- {
- for($k = 1; $k < $x->arraysize(); $k++)
- {
- $y = $x->arraymem($k);
- echo $y->scalarval();
- if ($wstype != 1)
- {
- $payload = $payload . '<param><value><'.htmlspecialchars($y->scalarval()).'></'.htmlspecialchars($y->scalarval())."></value></param>\n";
- }
- $alt_payload .= $y->scalarval();
- if ($k < $x->arraysize()-1)
- {
- $alt_payload .= ';';
- echo ", ";
- }
- }
- }
- echo ")</code>";
+ if ($response) {
+ if ($response->faultCode()) {
+ // call failed! echo out error msg!
+ //echo '<h2>'.htmlspecialchars($actionname, ENT_COMPAT, $inputcharset).' on server '.htmlspecialchars($server, ENT_COMPAT, $inputcharset).'</h2>';
+ echo "<h3>$protoName call FAILED!</h3>\n";
+ echo "<p>Fault code: [" . htmlspecialchars($response->faultCode(), ENT_COMPAT, \PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding) .
+ "] Reason: '" . htmlspecialchars($response->faultString(), ENT_COMPAT, \PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding) . "'</p>\n";
+ echo(strftime("%d/%b/%Y:%H:%M:%S\n"));
+ } else {
+ // call succeeded: parse results
+ //echo '<h2>'.htmlspecialchars($actionname, ENT_COMPAT, $inputcharset).' on server '.htmlspecialchars($server, ENT_COMPAT, $inputcharset).'</h2>';
+ printf("<h3>%s call(s) OK (%.2f secs.)</h3>\n", $protoName, $time);
+ echo(strftime("%d/%b/%Y:%H:%M:%S\n"));
+
+ switch ($action) {
+ case 'list':
+
+ $v = $response->value();
+ if ($v->kindOf() == "array") {
+ $max = $v->count();
+ echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n";
+ echo "<thead>\n<tr><th>Method ($max)</th><th>Description</th></tr>\n</thead>\n<tbody>\n";
+ foreach($v as $i => $rec) {
+ if ($i % 2) {
+ $class = ' class="oddrow"';
+ } else {
+ $class = ' class="evenrow"';
+ }
+ echo("<tr><td$class>" . htmlspecialchars($rec->scalarval(), ENT_COMPAT, \PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding) . "</td><td$class><form action=\"controller.php\" method=\"get\" target=\"frmcontroller\">" .
+ "<input type=\"hidden\" name=\"host\" value=\"" . htmlspecialchars($host, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"port\" value=\"" . htmlspecialchars($port, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"path\" value=\"" . htmlspecialchars($path, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"id\" value=\"" . htmlspecialchars($id, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"debug\" value=\"$debug\" />" .
+ "<input type=\"hidden\" name=\"username\" value=\"" . htmlspecialchars($username, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"password\" value=\"" . htmlspecialchars($password, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"authtype\" value=\"$authtype\" />" .
+ "<input type=\"hidden\" name=\"verifyhost\" value=\"$verifyhost\" />" .
+ "<input type=\"hidden\" name=\"verifypeer\" value=\"$verifypeer\" />" .
+ "<input type=\"hidden\" name=\"cainfo\" value=\"" . htmlspecialchars($cainfo, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"proxy\" value=\"" . htmlspecialchars($proxy, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"proxyuser\" value=\"" . htmlspecialchars($proxyuser, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"proxypwd\" value=\"" . htmlspecialchars($proxypwd, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"responsecompression\" value=\"$responsecompression\" />" .
+ "<input type=\"hidden\" name=\"requestcompression\" value=\"$requestcompression\" />" .
+ "<input type=\"hidden\" name=\"clientcookies\" value=\"" . htmlspecialchars($clientcookies, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"protocol\" value=\"$protocol\" />" .
+ "<input type=\"hidden\" name=\"timeout\" value=\"" . htmlspecialchars($timeout, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"method\" value=\"" . htmlspecialchars($rec->scalarval(), ENT_COMPAT, \PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding) . "\" />" .
+ "<input type=\"hidden\" name=\"wstype\" value=\"$wstype\" />" .
+ "<input type=\"hidden\" name=\"action\" value=\"describe\" />" .
+ "<input type=\"hidden\" name=\"run\" value=\"now\" />" .
+ "<input type=\"submit\" value=\"Describe\" /></form></td>");
+ //echo("</tr>\n");
+
+ // generate the skeleton for method payload per possible tests
+ //$methodpayload="<methodCall>\n<methodName>".$rec->scalarval()."</methodName>\n<params>\n<param><value></value></param>\n</params>\n</methodCall>";
+
+ /*echo ("<form action=\"{$_SERVER['PHP_SELF']}\" method=\"get\"><td>".
+ "<input type=\"hidden\" name=\"host\" value=\"$host\" />".
+ "<input type=\"hidden\" name=\"port\" value=\"$port\" />".
+ "<input type=\"hidden\" name=\"path\" value=\"$path\" />".
+ "<input type=\"hidden\" name=\"method\" value=\"".$rec->scalarval()."\" />".
+ "<input type=\"hidden\" name=\"methodpayload\" value=\"$payload\" />".
+ "<input type=\"hidden\" name=\"action\" value=\"execute\" />".
+ "<input type=\"submit\" value=\"Test\" /></td></form>");*/
+ echo("</tr>\n");
+ }
+ echo "</tbody>\n</table>";
+ }
+ break;
+
+ case 'describe':
+
+ $r1 = $resp[0]->value();
+ $r2 = $resp[1]->value();
+
+ echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n";
+ echo "<thead>\n<tr><th>Method</th><th>" . htmlspecialchars($method, ENT_COMPAT, $inputcharset) . "</th><th> </th><th> </th></tr>\n</thead>\n<tbody>\n";
+ $desc = htmlspecialchars($r1->scalarval(), ENT_COMPAT, \PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding);
+ if ($desc == "") {
+ $desc = "-";
+ }
+ echo "<tr><td class=\"evenrow\">Description</td><td colspan=\"3\" class=\"evenrow\">$desc</td></tr>\n";
+
+ if ($r2->kindOf() != "array") {
+ echo "<tr><td class=\"oddrow\">Signature</td><td class=\"oddrow\">Unknown</td><td class=\"oddrow\"> </td></tr>\n";
+ } else {
+ foreach($r2 as $i => $x) {
+ $payload = "";
+ $alt_payload = "";
+ if ($i + 1 % 2) {
+ $class = ' class="oddrow"';
+ } else {
+ $class = ' class="evenrow"';
+ }
+ echo "<tr><td$class>Signature " . ($i + 1) . "</td><td$class>";
+ if ($x->kindOf() == "array") {
+ $ret = $x[0];
+ echo "<code>OUT: " . htmlspecialchars($ret->scalarval(), ENT_COMPAT, \PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding) . "<br />IN: (";
+ if ($x->count() > 1) {
+ foreach($x as $k => $y) {
+ if ($k == 0) continue;
+ echo htmlspecialchars($y->scalarval(), ENT_COMPAT, \PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding);
+ if ($wstype != 1) {
+ $type = $y->scalarval();
+ $payload .= '<param><value>';
+ switch($type) {
+ case 'undefined':
+ break;
+ case 'null';
+ $type = 'nil';
+ // fall thru intentionally
+ default:
+ $payload .= '<' .
+ htmlspecialchars($type, ENT_COMPAT, \PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding) .
+ '></' . htmlspecialchars($type, ENT_COMPAT, \PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding) .
+ '>';
+ }
+ $payload .= "</value></param>\n";
+ }
+ $alt_payload .= $y->scalarval();
+ if ($k < $x->count() - 1) {
+ $alt_payload .= ';';
+ echo ", ";
+ }
+ }
+ }
+ echo ")</code>";
+ } else {
+ echo 'Unknown';
+ }
+ echo '</td>';
+ // button to test this method
+ //$payload="<methodCall>\n<methodName>$method</methodName>\n<params>\n$payload</params>\n</methodCall>";
+ echo "<td$class><form action=\"controller.php\" target=\"frmcontroller\" method=\"get\">" .
+ "<input type=\"hidden\" name=\"host\" value=\"" . htmlspecialchars($host, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"port\" value=\"" . htmlspecialchars($port, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"path\" value=\"" . htmlspecialchars($path, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"id\" value=\"" . htmlspecialchars($id, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"debug\" value=\"$debug\" />" .
+ "<input type=\"hidden\" name=\"username\" value=\"" . htmlspecialchars($username, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"password\" value=\"" . htmlspecialchars($password, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"authtype\" value=\"$authtype\" />" .
+ "<input type=\"hidden\" name=\"verifyhost\" value=\"$verifyhost\" />" .
+ "<input type=\"hidden\" name=\"verifypeer\" value=\"$verifypeer\" />" .
+ "<input type=\"hidden\" name=\"cainfo\" value=\"" . htmlspecialchars($cainfo, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"proxy\" value=\"" . htmlspecialchars($proxy, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"proxyuser\" value=\"" . htmlspecialchars($proxyuser, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"proxypwd\" value=\"" . htmlspecialchars($proxypwd, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"responsecompression\" value=\"$responsecompression\" />" .
+ "<input type=\"hidden\" name=\"requestcompression\" value=\"$requestcompression\" />" .
+ "<input type=\"hidden\" name=\"clientcookies\" value=\"" . htmlspecialchars($clientcookies, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"protocol\" value=\"$protocol\" />" .
+ "<input type=\"hidden\" name=\"timeout\" value=\"" . htmlspecialchars($timeout, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"method\" value=\"" . htmlspecialchars($method, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"methodpayload\" value=\"" . htmlspecialchars($payload, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"altmethodpayload\" value=\"" . htmlspecialchars($alt_payload, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"wstype\" value=\"$wstype\" />" .
+ "<input type=\"hidden\" name=\"action\" value=\"execute\" />";
+ if ($wstype != 1) {
+ echo "<input type=\"submit\" value=\"Load method synopsis\" />";
+ }
+ echo "</form></td>\n";
+
+ echo "<td$class><form action=\"controller.php\" target=\"frmcontroller\" method=\"get\">" .
+ "<input type=\"hidden\" name=\"host\" value=\"" . htmlspecialchars($host, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"port\" value=\"" . htmlspecialchars($port, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"path\" value=\"" . htmlspecialchars($path, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"id\" value=\"" . htmlspecialchars($id, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"debug\" value=\"$debug\" />" .
+ "<input type=\"hidden\" name=\"username\" value=\"" . htmlspecialchars($username, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"password\" value=\"" . htmlspecialchars($password, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"authtype\" value=\"$authtype\" />" .
+ "<input type=\"hidden\" name=\"verifyhost\" value=\"$verifyhost\" />" .
+ "<input type=\"hidden\" name=\"verifypeer\" value=\"$verifypeer\" />" .
+ "<input type=\"hidden\" name=\"cainfo\" value=\"" . htmlspecialchars($cainfo, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"proxy\" value=\"" . htmlspecialchars($proxy, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"proxyuser\" value=\"" . htmlspecialchars($proxyuser, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"proxypwd\" value=\"" . htmlspecialchars($proxypwd, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"responsecompression\" value=\"$responsecompression\" />" .
+ "<input type=\"hidden\" name=\"requestcompression\" value=\"$requestcompression\" />" .
+ "<input type=\"hidden\" name=\"clientcookies\" value=\"" . htmlspecialchars($clientcookies, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"protocol\" value=\"$protocol\" />" .
+ "<input type=\"hidden\" name=\"timeout\" value=\"" . htmlspecialchars($timeout, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"method\" value=\"" . htmlspecialchars($method, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"methodsig\" value=\"" . $i . "\" />" .
+ "<input type=\"hidden\" name=\"methodpayload\" value=\"" . htmlspecialchars($payload, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"altmethodpayload\" value=\"" . htmlspecialchars($alt_payload, ENT_COMPAT, $inputcharset) . "\" />" .
+ "<input type=\"hidden\" name=\"wstype\" value=\"$wstype\" />" .
+ "<input type=\"hidden\" name=\"run\" value=\"now\" />" .
+ "<input type=\"hidden\" name=\"action\" value=\"wrap\" />" .
+ "<input type=\"submit\" value=\"Generate method call stub code\" />";
+ echo "</form></td></tr>\n";
+ }
+ }
+ echo "</tbody>\n</table>";
+
+ break;
+
+ case 'wrap':
+ $r1 = $resp[0]->value();
+ $r2 = $resp[1]->value();
+ if ($r2->kindOf() != "array" || $r2->count() <= $methodsig) {
+ echo "Error: signature unknown\n";
+ } else {
+ $mdesc = $r1->scalarval();
+ $encoder = new PhpXmlRpc\Encoder();
+ $msig = $encoder->decode($r2);
+ $msig = $msig[$methodsig];
+ $proto = $protocol == 2 ? 'https' : ( $protocol == 1 ? 'http11' : '' );
+ if ($proxy == '' && $username == '' && !$requestcompression && !$responsecompression &&
+ $clientcookies == ''
+ ) {
+ $opts = 1; // simple client copy in stub code
+ } else {
+ $opts = 0; // complete client copy in stub code
+ }
+ if ($wstype == 1) {
+ $prefix = 'jsonrpc';
+ } else {
+ $prefix = 'xmlrpc';
+ }
+ $wrapper = new PhpXmlRpc\Wrapper();
+ $code = $wrapper->buildWrapMethodSource($client, $method, array('timeout' => $timeout, 'protocol' => $proto, 'simple_client_copy' => $opts, 'prefix' => $prefix), str_replace('.', '_', $prefix . '_' . $method), $msig, $mdesc);
+ //if ($code)
+ //{
+ echo "<div id=\"phpcode\">\n";
+ highlight_string("<?php\n" . $code['docstring'] . $code['source'] . '?>');
+ echo "\n</div>";
+ //}
+ //else
+ //{
+ // echo 'Error while building php code stub...';
+ }
+
+ break;
+
+ case 'execute':
+ echo '<div id="response"><h2>Response:</h2>' . htmlspecialchars($response->serialize()) . '</div>';
+ break;
+
+ default: // give a warning
}
- else
- {
- echo 'Unknown';
- }
- echo '</td>';
- //bottone per testare questo metodo
- //$payload="<methodCall>\n<methodName>$method</methodName>\n<params>\n$payload</params>\n</methodCall>";
- echo "<td$class><form action=\"controller.php\" target=\"frmcontroller\" method=\"get\">".
- "<input type=\"hidden\" name=\"host\" value=\"".htmlspecialchars($host)."\" />".
- "<input type=\"hidden\" name=\"port\" value=\"".htmlspecialchars($port)."\" />".
- "<input type=\"hidden\" name=\"path\" value=\"".htmlspecialchars($path)."\" />".
- "<input type=\"hidden\" name=\"id\" value=\"".htmlspecialchars($id)."\" />".
- "<input type=\"hidden\" name=\"debug\" value=\"$debug\" />".
- "<input type=\"hidden\" name=\"username\" value=\"".htmlspecialchars($username)."\" />".
- "<input type=\"hidden\" name=\"password\" value=\"".htmlspecialchars($password)."\" />".
- "<input type=\"hidden\" name=\"authtype\" value=\"$authtype\" />".
- "<input type=\"hidden\" name=\"verifyhost\" value=\"$verifyhost\" />".
- "<input type=\"hidden\" name=\"verifypeer\" value=\"$verifypeer\" />".
- "<input type=\"hidden\" name=\"cainfo\" value=\"".htmlspecialchars($cainfo)."\" />".
- "<input type=\"hidden\" name=\"proxy\" value=\"".htmlspecialchars($proxy)."\" />".
- "<input type=\"hidden\" name=\"proxyuser\" value=\"".htmlspecialchars($proxyuser)."\" />".
- "<input type=\"hidden\" name=\"proxypwd\" value=\"".htmlspecialchars($proxypwd)."\" />".
- "<input type=\"hidden\" name=\"responsecompression\" value=\"$responsecompression\" />".
- "<input type=\"hidden\" name=\"requestcompression\" value=\"$requestcompression\" />".
- "<input type=\"hidden\" name=\"clientcookies\" value=\"".htmlspecialchars($clientcookies)."\" />".
- "<input type=\"hidden\" name=\"protocol\" value=\"$protocol\" />".
- "<input type=\"hidden\" name=\"timeout\" value=\"".htmlspecialchars($timeout)."\" />".
- "<input type=\"hidden\" name=\"method\" value=\"".htmlspecialchars($method)."\" />".
- "<input type=\"hidden\" name=\"methodpayload\" value=\"".htmlspecialchars($payload)."\" />".
- "<input type=\"hidden\" name=\"altmethodpayload\" value=\"".htmlspecialchars($alt_payload)."\" />".
- "<input type=\"hidden\" name=\"wstype\" value=\"$wstype\" />".
- "<input type=\"hidden\" name=\"action\" value=\"execute\" />";
- if ($wstype != 1)
- echo "<input type=\"submit\" value=\"Load method synopsis\" />";
- echo "</form></td>\n";
-
- echo "<td$class><form action=\"controller.php\" target=\"frmcontroller\" method=\"get\">".
- "<input type=\"hidden\" name=\"host\" value=\"".htmlspecialchars($host)."\" />".
- "<input type=\"hidden\" name=\"port\" value=\"".htmlspecialchars($port)."\" />".
- "<input type=\"hidden\" name=\"path\" value=\"".htmlspecialchars($path)."\" />".
- "<input type=\"hidden\" name=\"id\" value=\"".htmlspecialchars($id)."\" />".
- "<input type=\"hidden\" name=\"debug\" value=\"$debug\" />".
- "<input type=\"hidden\" name=\"username\" value=\"".htmlspecialchars($username)."\" />".
- "<input type=\"hidden\" name=\"password\" value=\"".htmlspecialchars($password)."\" />".
- "<input type=\"hidden\" name=\"authtype\" value=\"$authtype\" />".
- "<input type=\"hidden\" name=\"verifyhost\" value=\"$verifyhost\" />".
- "<input type=\"hidden\" name=\"verifypeer\" value=\"$verifypeer\" />".
- "<input type=\"hidden\" name=\"cainfo\" value=\"".htmlspecialchars($cainfo)."\" />".
- "<input type=\"hidden\" name=\"proxy\" value=\"".htmlspecialchars($proxy)."\" />".
- "<input type=\"hidden\" name=\"proxyuser\" value=\"".htmlspecialchars($proxyuser)."\" />".
- "<input type=\"hidden\" name=\"proxypwd\" value=\"".htmlspecialchars($proxypwd)."\" />".
- "<input type=\"hidden\" name=\"responsecompression\" value=\"$responsecompression\" />".
- "<input type=\"hidden\" name=\"requestcompression\" value=\"$requestcompression\" />".
- "<input type=\"hidden\" name=\"clientcookies\" value=\"".htmlspecialchars($clientcookies)."\" />".
- "<input type=\"hidden\" name=\"protocol\" value=\"$protocol\" />".
- "<input type=\"hidden\" name=\"timeout\" value=\"".htmlspecialchars($timeout)."\" />".
- "<input type=\"hidden\" name=\"method\" value=\"".htmlspecialchars($method)."\" />".
- "<input type=\"hidden\" name=\"methodsig\" value=\"".$i."\" />".
- "<input type=\"hidden\" name=\"methodpayload\" value=\"".htmlspecialchars($payload)."\" />".
- "<input type=\"hidden\" name=\"altmethodpayload\" value=\"".htmlspecialchars($alt_payload)."\" />".
- "<input type=\"hidden\" name=\"wstype\" value=\"$wstype\" />".
- "<input type=\"hidden\" name=\"run\" value=\"now\" />".
- "<input type=\"hidden\" name=\"action\" value=\"wrap\" />".
- "<input type=\"submit\" value=\"Generate method call stub code\" />";
- echo "</form></td></tr>\n";
-
- }
- }
- echo "</tbody>\n</table>";
-
- break;
-
- case 'wrap':
- $r1 = $resp[0]->value();
- $r2 = $resp[1]->value();
- if ($r2->kindOf()!="array" || $r2->arraysize() <= $methodsig)
- echo "Error: signature unknown\n";
- else
- {
- $mdesc = $r1->scalarval();
- $msig = php_xmlrpc_decode($r2);
- $msig = $msig[$methodsig];
- $proto = $protocol == 2 ? 'https' : $protocol == 1 ? 'http11' : '';
- if ($proxy == '' && $username == '' && !$requestcompression && !$responsecompression &&
- $clientcookies == '')
- {
- $opts = 0; // simple client copy in stub code
- }
- else
- {
- $opts = 1; // complete client copy in stub code
- }
- if ($wstype == 1)
- {
- $prefix = 'jsonrpc';
- }
- else
- {
- $prefix = 'xmlrpc';
- }
- //$code = wrap_xmlrpc_method($client, $method, $methodsig, 0, $proto, '', $opts);
- $code = build_remote_method_wrapper_code($client, $method, str_replace('.', '_', $prefix.'_'.$method), $msig, $mdesc, $timeout, $proto, $opts, $prefix);
- //if ($code)
- //{
- echo "<div id=\"phpcode\">\n";
- highlight_string("<?php\n".$code['docstring'].$code['source'].'?>');
- echo "\n</div>";
- //}
- //else
- //{
- // echo 'Error while building php code stub...';
- }
-
- break;
-
- case 'execute':
- echo '<div id="response"><h2>Response:</h2>'.htmlspecialchars($response->serialize()).'</div>';
- break;
-
- default: // give a warning
- }
- } // if !$response->faultCode()
+ } // if !$response->faultCode()
} // if $response
- }
- else
- {
+} else {
// no action taken yet: give some instructions on debugger usage
-?>
-
-<h3>Instructions on usage of the debugger:</h3>
-<ol>
-<li>Run a 'list available methods' action against desired server</li>
-<li>If list of methods appears, click on 'describe method' for desired method</li>
-<li>To run method: click on 'load method synopsis' for desired method. This will load a skeleton for method call parameters in the form above. Complete all xmlrpc values with appropriate data and click 'Execute'</li>
-</ol>
+ ?>
+
+ <h3>Instructions on usage of the debugger</h3>
+ <ol>
+ <li>Run a 'list available methods' action against desired server</li>
+ <li>If list of methods appears, click on 'describe method' for desired method</li>
+ <li>To run method: click on 'load method synopsis' for desired method. This will load a skeleton for method call
+ parameters in the form above. Complete all xmlrpc values with appropriate data and click 'Execute'
+ </li>
+ </ol>
+ <?php
+ if (!extension_loaded('curl')) {
+ echo "<p class=\"evidence\">You will need to enable the CURL extension to use the HTTPS and HTTP 1.1 transports</p>\n";
+ }
+ ?>
+
+ <h3>Example</h3>
+ <p>
+ Server Address: phpxmlrpc.sourceforge.net<br/>
+ Path: /server.php
+ </p>
+
+ <h3>Notice</h3>
+ <p>all usernames and passwords entered on the above form will be written to the web server logs of this server. Use
+ with care.</p>
+
+ <h3>Changelog</h3>
+ <ul>
+ <li>2020-12-11: fix problems with running the debugger on php 8</li>
+ <li>2015-05-30: fix problems with generating method payloads for NIL and Undefined parameters</li>
+ <li>2015-04-19: fix problems with LATIN-1 characters in payload</li>
+ <li>2007-02-20: add visual editor for method payload; allow strings, bools as jsonrpc msg id</li>
+ <li>2006-06-26: support building php code stub for calling remote methods</li>
+ <li>2006-05-25: better support for long running queries; check for no-curl installs</li>
+ <li>2006-05-02: added support for JSON-RPC. Note that many interesting json-rpc features are not implemented
+ yet, such as notifications or multicall.
+ </li>
+ <li>2006-04-22: added option for setting custom CA certs to verify peer with in SSLmode</li>
+ <li>2006-03-05: added option for setting Basic/Digest/NTLM auth type</li>
+ <li>2006-01-18: added option echoing to screen xmlrpc request before sending it ('More' debug)</li>
+ <li>2005-10-01: added option for setting cookies to be sent to server</li>
+ <li>2005-08-07: added switches for compression of requests and responses and http 1.1</li>
+ <li>2005-06-27: fixed possible security breach in parsing malformed xml</li>
+ <li>2005-06-24: fixed error with calling methods having parameters...</li>
+ </ul>
<?php
- if (!extension_loaded('curl'))
- {
- echo "<p class=\"evidence\">You will need to enable the CURL extension to use the HTTPS and HTTP 1.1 transports</p>\n";
- }
-?>
-<h3>Example:</h3>
-<p>
-Server Address: phpxmlrpc.sourceforge.net<br/>
-Path: /server.php
-</p>
-
-<h3>Notice:</h3>
-<p>all usernames and passwords entered on the above form will be written to the web server logs of this server. Use with care.</p>
-
-<h3>Changelog</h3>
-<ul>
-<li>2007-02-20: add visual editor for method payload; allow strings, bools as jsonrpc msg id</li>
-<li>2006-06-26: support building php code stub for calling remote methods</li>
-<li>2006-05-25: better support for long running queries; check for no-curl installs</li>
-<li>2006-05-02: added support for JSON-RPC. Note that many interesting json-rpc features are not implemented yet, such as notifications or multicall.</li>
-<li>2006-04-22: added option for setting custom CA certs to verify peer with in SSLmode</li>
-<li>2006-03-05: added option for setting Basic/Digest/NTLM auth type</li>
-<li>2006-01-18: added option echoing to screen xmlrpc request before sending it ('More' debug)</li>
-<li>2005-10-01: added option for setting cookies to be sent to server</li>
-<li>2005-08-07: added switches for compression of requests and responses and http 1.1</li>
-<li>2005-06-27: fixed possible security breach in parsing malformed xml</li>
-<li>2005-06-24: fixed error with calling methods having parameters...</li>
-</ul>
-<?php
- }
+}
?>
</body>
</html>