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'; } elseif ($protocol == 1) { $httpprotocol = 'http11'; } else { $httpprotocol = 'http'; } 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; } 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; } $cookies = explode(',', $clientcookies); foreach ($cookies as $cookie) { if (strpos($cookie, '=')) { $cookie = explode('=', $cookie); $client->setCookie(trim($cookie[0]), trim(@$cookie[1])); } } $msg = array(); switch ($action) { // fall thru intentionally 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(), $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!"); } $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) . '' . $method . "\n" . $payload . "\n" . $msg[0]->xml_footer(); } $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 '

' . htmlspecialchars($actionname, ENT_COMPAT, $inputcharset) . ' on server ' . htmlspecialchars($server, ENT_COMPAT, $inputcharset) . " ...

\n"; flush(); $response = null; // execute method(s) if ($debug) { echo '

Debug info:

'; } /// @todo use ob_start instead $resp = array(); $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; } } $time = microtime(true) - $time; if ($debug) { echo "
\n"; } if ($response) { if ($response->faultCode()) { // call failed! echo out error msg! //echo '

'.htmlspecialchars($actionname, ENT_COMPAT, $inputcharset).' on server '.htmlspecialchars($server, ENT_COMPAT, $inputcharset).'

'; echo "

$protoName call FAILED!

\n"; echo "

Fault code: [" . htmlspecialchars($response->faultCode(), ENT_COMPAT, \PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding) . "] Reason: '" . htmlspecialchars($response->faultString(), ENT_COMPAT, \PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding) . "'

\n"; echo(strftime("%d/%b/%Y:%H:%M:%S\n")); } else { // call succeeded: parse results //echo '

'.htmlspecialchars($actionname, ENT_COMPAT, $inputcharset).' on server '.htmlspecialchars($server, ENT_COMPAT, $inputcharset).'

'; printf("

%s call(s) OK (%.2f secs.)

\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 "\n"; echo "\n\n\n\n"; foreach($v as $i => $rec) { if ($i % 2) { $class = ' class="oddrow"'; } else { $class = ' class="evenrow"'; } echo("" . htmlspecialchars($rec->scalarval(), ENT_COMPAT, \PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding) . "
" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "scalarval(), ENT_COMPAT, \PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding) . "\" />" . "" . "" . "" . ""); //echo("
\n"); // generate the skeleton for method payload per possible tests //$methodpayload="\n".$rec->scalarval()."\n\n\n\n"; /*echo ("");*/ echo("\n"); } echo "\n
Method ($max)Description
". "". "". "". "scalarval()."\" />". "". "". "
"; } break; case 'describe': $r1 = $resp[0]->value(); $r2 = $resp[1]->value(); echo "\n"; echo "\n\n\n\n"; $desc = htmlspecialchars($r1->scalarval(), ENT_COMPAT, \PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding); if ($desc == "") { $desc = "-"; } echo "\n"; if ($r2->kindOf() != "array") { echo "\n"; } else { foreach($r2 as $i => $x) { $payload = ""; $alt_payload = ""; if ($i + 1 % 2) { $class = ' class="oddrow"'; } else { $class = ' class="evenrow"'; } echo "Signature " . ($i + 1) . ""; if ($x->kindOf() == "array") { $ret = $x[0]; echo "OUT: " . htmlspecialchars($ret->scalarval(), ENT_COMPAT, \PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding) . "
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 .= ''; switch($type) { case 'undefined': break; case 'null'; $type = 'nil'; // fall thru intentionally default: $payload .= '<' . htmlspecialchars($type, ENT_COMPAT, \PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding) . '>'; } $payload .= "\n"; } $alt_payload .= $y->scalarval(); if ($k < $x->count() - 1) { $alt_payload .= ';'; echo ", "; } } } echo ")
"; } else { echo 'Unknown'; } echo ''; // button to test this method //$payload="\n$method\n\n$payload\n"; echo "
" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . ""; if ($wstype != 1) { echo ""; } echo "\n"; echo "
" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . "" . ""; echo "
\n"; } } echo "\n
Method" . htmlspecialchars($method, ENT_COMPAT, $inputcharset) . "  
Description$desc
SignatureUnknown 
"; 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 "
\n"; highlight_string("'); echo "\n
"; //} //else //{ // echo 'Error while building php code stub...'; } break; case 'execute': echo '

Response:

' . htmlspecialchars($response->serialize()) . '
'; break; default: // give a warning } } // if !$response->faultCode() } // if $response } else { // no action taken yet: give some instructions on debugger usage ?>

Instructions on usage of the debugger

  1. Run a 'list available methods' action against desired server
  2. If list of methods appears, click on 'describe method' for desired method
  3. 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'
You will need to enable the CURL extension to use the HTTPS and HTTP 1.1 transports

\n"; } ?>

Example

Server Address: phpxmlrpc.sourceforge.net
Path: /server.php

Notice

all usernames and passwords entered on the above form will be written to the web server logs of this server. Use with care.

Changelog