2004-05-23 05:33:25 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
class PEAR_test_mock_pearweb {
|
|
|
|
var $_config;
|
2004-05-29 08:51:59 +00:00
|
|
|
var $_remote;
|
2004-05-23 05:33:25 +00:00
|
|
|
|
2004-05-29 08:51:59 +00:00
|
|
|
function setRemote(&$r)
|
2004-05-23 05:33:25 +00:00
|
|
|
{
|
2004-05-29 08:51:59 +00:00
|
|
|
$this->_remote = &$r;
|
|
|
|
}
|
|
|
|
|
|
|
|
function addHtmlConfig($address, $filename)
|
|
|
|
{
|
|
|
|
$this->_config['html'][$address] = array(basename($filename), file_get_contents($filename));
|
2004-05-23 05:33:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function addXmlrpcConfig($method, $params, $return)
|
|
|
|
{
|
2004-05-29 08:51:59 +00:00
|
|
|
$this->_config['xmlrpc'][$method][serialize($params)] = $return;
|
|
|
|
}
|
|
|
|
|
|
|
|
function _encode($val)
|
|
|
|
{
|
|
|
|
$val = XML_RPC_encode($val);
|
2004-05-23 05:33:25 +00:00
|
|
|
$ser = new XML_RPC_Response($val);
|
2004-05-29 08:51:59 +00:00
|
|
|
return $ser->serialize();
|
2004-05-23 05:33:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function receiveHttp($address)
|
|
|
|
{
|
|
|
|
if (!isset($this->_config) || !is_array($this->_config)) {
|
|
|
|
return $this->do404($address);
|
|
|
|
}
|
2004-05-29 08:51:59 +00:00
|
|
|
if (!isset($this->_config['html'][$address])) {
|
2004-05-23 05:33:25 +00:00
|
|
|
return $this->do404($address);
|
2004-05-29 08:51:59 +00:00
|
|
|
} else {
|
|
|
|
return $this->do200() .
|
|
|
|
'content-length: ' . strlen($this->_config['html'][$address][1]) . "\n\n" .
|
|
|
|
$this->_config['html'][$address][1];
|
2004-05-23 05:33:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function receiveXmlrpc($postpayload)
|
|
|
|
{
|
|
|
|
$info = $this->parseRequest($postpayload);
|
|
|
|
if (!isset($this->_config['xmlrpc'][$info['method']])) {
|
|
|
|
return $this->doXmlrpcFault($info);
|
|
|
|
}
|
|
|
|
if (!isset($this->_config['xmlrpc'][serialize($info['params'])])) {
|
|
|
|
var_dump($info['param']);
|
|
|
|
die("Error - parameters not configured properly for $info[method]");
|
|
|
|
}
|
2004-05-29 08:51:59 +00:00
|
|
|
return $this->do200() .
|
|
|
|
$this->_encode($this->_config['xmlrpc'][$info['method']][serialize($info['params'])]);
|
|
|
|
}
|
|
|
|
|
|
|
|
function call($method, $params)
|
|
|
|
{
|
|
|
|
if (!isset($this->_config['xmlrpc'][$method])) {
|
2004-06-06 16:05:30 +00:00
|
|
|
include_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'php_dump.php.inc';
|
|
|
|
$args = $params;
|
|
|
|
switch (count($args)) {
|
|
|
|
case 0:
|
|
|
|
$result = $this->_remote->parentcall($method);
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
$result = $this->_remote->parentcall($method, $args[0]);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
$result = $this->_remote->parentcall($method, $args[0], $args[1]);
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
$result = $this->_remote->parentcall($method, $args[0], $args[1], $args[2]);
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
$result = $this->_remote->parentcall($method, $args[0], $args[1], $args[2], $args[3]);
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
$result = $this->_remote->parentcall($method, $args[0], $args[1], $args[2], $args[3], $args[4]);
|
|
|
|
break;
|
|
|
|
case 6:
|
|
|
|
$result = $this->_remote->parentcall($method, $args[0], $args[1], $args[2], $args[3], $args[4], $args[5]);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
$dump = new PHP_Dump($result);
|
|
|
|
$args = new PHP_Dump($args);
|
|
|
|
if (!isset($this->_pearweb->_config['xmlrpc'][$method][serialize($args)]))
|
|
|
|
$GLOBALS['totalPHP'][$method . serialize($args)] = '$pearweb->addXmlrpcConfig("' .
|
|
|
|
$method . '", ' .
|
|
|
|
$args->toPHP() . ', ' .
|
|
|
|
$dump->toPHP() .");";
|
|
|
|
foreach($GLOBALS['totalPHP'] as $php) {
|
|
|
|
echo $php . "\n";
|
|
|
|
}
|
|
|
|
var_dump(array_keys($this->_config['xmlrpc'][$method]), $params);
|
|
|
|
die("Error - parameters not configured properly for $method");
|
2004-05-29 08:51:59 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (!isset($this->_config['xmlrpc'][$method][serialize($params)])) {
|
2004-05-29 09:09:46 +00:00
|
|
|
include_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'php_dump.php.inc';
|
2004-05-29 08:51:59 +00:00
|
|
|
$args = $params;
|
|
|
|
switch (count($args)) {
|
|
|
|
case 0:
|
|
|
|
$result = $this->_remote->parentcall($method);
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
$result = $this->_remote->parentcall($method, $args[0]);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
$result = $this->_remote->parentcall($method, $args[0], $args[1]);
|
|
|
|
break;
|
|
|
|
case 3:
|
2004-06-06 16:05:30 +00:00
|
|
|
$result = $this->_remote->parentcall($method, $args[0], $args[1], $args[2]);
|
2004-05-29 08:51:59 +00:00
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
$result = $this->_remote->parentcall($method, $args[0], $args[1], $args[2], $args[3]);
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
$result = $this->_remote->parentcall($method, $args[0], $args[1], $args[2], $args[3], $args[4]);
|
|
|
|
break;
|
|
|
|
case 6:
|
|
|
|
$result = $this->_remote->parentcall($method, $args[0], $args[1], $args[2], $args[3], $args[4], $args[5]);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
$dump = new PHP_Dump($result);
|
|
|
|
$args = new PHP_Dump($args);
|
|
|
|
if (!isset($this->_pearweb->_config['xmlrpc'][$method][serialize($args)]))
|
|
|
|
$GLOBALS['totalPHP'][$method . serialize($args)] = '$pearweb->addXmlrpcConfig("' .
|
|
|
|
$method . '", ' .
|
|
|
|
$args->toPHP() . ', ' .
|
|
|
|
$dump->toPHP() .");";
|
|
|
|
foreach($GLOBALS['totalPHP'] as $php) {
|
|
|
|
echo $php . "\n";
|
|
|
|
}
|
|
|
|
var_dump(array_keys($this->_config['xmlrpc'][$method]), $params);
|
|
|
|
die("Error - parameters not configured properly for $method");
|
|
|
|
}
|
|
|
|
return $this->_config['xmlrpc'][$method][serialize($params)];
|
2004-05-23 05:33:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function doXmlrpcFault($info)
|
|
|
|
{
|
|
|
|
$r = new XML_RPC_Response(0, 1, 'Unknown method');
|
|
|
|
return $this->do200() . $r->serialize();
|
|
|
|
}
|
|
|
|
|
|
|
|
function do200()
|
|
|
|
{
|
2004-05-29 08:51:59 +00:00
|
|
|
return "HTTP/1.1 200 \n";
|
2004-05-23 05:33:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function do404($address)
|
|
|
|
{
|
|
|
|
return 'HTTP/1.1 404 ' . $address . ' Is not valid';
|
|
|
|
}
|
2004-05-29 08:51:59 +00:00
|
|
|
|
2004-05-23 05:33:25 +00:00
|
|
|
/**
|
|
|
|
* Parse an xmlrpc request
|
|
|
|
* @param string fake HTTP_RAW_POST_DATA
|
|
|
|
* @return string|array serialized fault string, or array containing method name and parameters
|
|
|
|
*/
|
|
|
|
function parseRequest($data)
|
|
|
|
{
|
|
|
|
// copied from XML_RPC_Server
|
|
|
|
global $XML_RPC_xh;
|
|
|
|
global $XML_RPC_err, $XML_RPC_str, $XML_RPC_errxml,
|
|
|
|
$XML_RPC_defencoding, $XML_RPC_Server_dmap;
|
|
|
|
|
|
|
|
$parser = xml_parser_create($XML_RPC_defencoding);
|
|
|
|
|
|
|
|
$XML_RPC_xh[$parser] = array();
|
|
|
|
$XML_RPC_xh[$parser]['st'] = "";
|
|
|
|
$XML_RPC_xh[$parser]['cm'] = 0;
|
|
|
|
$XML_RPC_xh[$parser]['isf'] = 0;
|
|
|
|
$XML_RPC_xh[$parser]['params'] = array();
|
|
|
|
$XML_RPC_xh[$parser]['method'] = "";
|
|
|
|
|
|
|
|
$plist = '';
|
|
|
|
|
|
|
|
// decompose incoming XML into request structure
|
|
|
|
|
|
|
|
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
|
|
|
|
xml_set_element_handler($parser, "XML_RPC_se", "XML_RPC_ee");
|
|
|
|
xml_set_character_data_handler($parser, "XML_RPC_cd");
|
|
|
|
xml_set_default_handler($parser, "XML_RPC_dh");
|
|
|
|
if (!xml_parse($parser, $data, 1)) {
|
|
|
|
// return XML error as a faultCode
|
|
|
|
$r = new XML_RPC_Response(0,
|
|
|
|
$XML_RPC_errxml+xml_get_error_code($parser),
|
|
|
|
sprintf("XML error: %s at line %d",
|
|
|
|
xml_error_string(xml_get_error_code($parser)),
|
|
|
|
xml_get_current_line_number($parser)));
|
|
|
|
xml_parser_free($parser);
|
|
|
|
return $r->serialize();
|
|
|
|
} else {
|
|
|
|
xml_parser_free($parser);
|
|
|
|
$params = array();
|
|
|
|
// now add parameters in
|
|
|
|
for ($i = 0; $i < sizeof($XML_RPC_xh[$parser]['params']); $i++) {
|
|
|
|
// print "<!-- " . $XML_RPC_xh[$parser]['params'][$i]. "-->\n";
|
|
|
|
$plist .= "$i - " . $XML_RPC_xh[$parser]['params'][$i] . " \n";
|
|
|
|
eval('$val = ' . $XML_RPC_xh[$parser]['params'][$i] . ";");
|
|
|
|
$param = $val->scalarval();
|
|
|
|
$param = PEAR_test_mock_pearweb::_convertScalar($param);
|
|
|
|
$params[] = $param;
|
|
|
|
}
|
|
|
|
return array('method' => $XML_RPC_xh[$parser]['method'], 'params' => $params);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Converts the mishmash returned from XML_RPC parsing into a regular PHP value,
|
|
|
|
* handling nested arrays gracefully.
|
|
|
|
* @param mixed
|
|
|
|
* @return mixed
|
|
|
|
*/
|
|
|
|
function _convertScalar($val)
|
|
|
|
{
|
|
|
|
if (is_a($val, 'XML_RPC_Value')) {
|
|
|
|
$val = $val->scalarval();
|
|
|
|
}
|
|
|
|
if (!is_array($val)) {
|
|
|
|
return $val;
|
|
|
|
}
|
|
|
|
$newval = array();
|
|
|
|
foreach ($val as $i => $contents)
|
|
|
|
{
|
|
|
|
$newval[$i] = PEAR_test_mock_pearweb::_convertScalar($contents);
|
|
|
|
}
|
|
|
|
return $newval;
|
|
|
|
}
|
|
|
|
}
|
2005-08-11 16:43:26 +00:00
|
|
|
?>
|