2
require_once 'XML/RPC/Server.php';
4
class PEAR_test_mock_pearweb {
8
function setRemote(&$r)
13
function addHtmlConfig($address, $filename)
15
$this->_config['html'][$address] = array(basename($filename), file_get_contents($filename));
18
function addXmlrpcConfig($method, $params, $return)
20
$this->_config['xmlrpc'][$method][serialize($params)] = $return;
23
function _encode($val)
25
$val = XML_RPC_encode($val);
26
$ser = new XML_RPC_Response($val);
27
return $ser->serialize();
30
function receiveHttp($address)
32
if (!isset($this->_config) || !is_array($this->_config)) {
33
return $this->do404($address);
35
if (!isset($this->_config['html'][$address])) {
36
return $this->do404($address);
38
return $this->do200() .
39
'content-length: ' . strlen($this->_config['html'][$address][1]) . "\n\n" .
40
$this->_config['html'][$address][1];
44
function receiveXmlrpc($postpayload)
46
$info = $this->parseRequest($postpayload);
47
if (!isset($this->_config['xmlrpc'][$info['method']])) {
48
return $this->doXmlrpcFault($info);
50
if (!isset($this->_config['xmlrpc'][serialize($info['params'])])) {
51
var_dump($info['param']);
52
die("Error - parameters not configured properly for $info[method]");
54
return $this->do200() .
55
$this->_encode($this->_config['xmlrpc'][$info['method']][serialize($info['params'])]);
58
function call($method, $params)
60
if (!isset($this->_config['xmlrpc'][$method])) {
61
include_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'php_dump.php.inc';
63
switch (count($args)) {
65
$result = $this->_remote->parentcall($method);
68
$result = $this->_remote->parentcall($method, $args[0]);
71
$result = $this->_remote->parentcall($method, $args[0], $args[1]);
74
$result = $this->_remote->parentcall($method, $args[0], $args[1], $args[2]);
77
$result = $this->_remote->parentcall($method, $args[0], $args[1], $args[2], $args[3]);
80
$result = $this->_remote->parentcall($method, $args[0], $args[1], $args[2], $args[3], $args[4]);
83
$result = $this->_remote->parentcall($method, $args[0], $args[1], $args[2], $args[3], $args[4], $args[5]);
86
$dump = new PHP_Dump($result);
87
$args = new PHP_Dump($args);
88
if (!isset($this->_pearweb->_config['xmlrpc'][$method][serialize($args)]))
89
$GLOBALS['totalPHP'][$method . serialize($args)] = '$pearweb->addXmlrpcConfig("' .
91
$args->toPHP() . ', ' .
93
foreach($GLOBALS['totalPHP'] as $php) {
96
var_dump(array_keys($this->_config['xmlrpc'][$method]), $params);
97
die("Error - parameters not configured properly for $method");
100
if (!isset($this->_config['xmlrpc'][$method][serialize($params)])) {
101
include_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'php_dump.php.inc';
103
switch (count($args)) {
105
$result = $this->_remote->parentcall($method);
108
$result = $this->_remote->parentcall($method, $args[0]);
111
$result = $this->_remote->parentcall($method, $args[0], $args[1]);
114
$result = $this->_remote->parentcall($method, $args[0], $args[1], $args[2]);
117
$result = $this->_remote->parentcall($method, $args[0], $args[1], $args[2], $args[3]);
120
$result = $this->_remote->parentcall($method, $args[0], $args[1], $args[2], $args[3], $args[4]);
123
$result = $this->_remote->parentcall($method, $args[0], $args[1], $args[2], $args[3], $args[4], $args[5]);
126
$dump = new PHP_Dump($result);
127
$args = new PHP_Dump($args);
128
if (!isset($this->_pearweb->_config['xmlrpc'][$method][serialize($args)]))
129
$GLOBALS['totalPHP'][$method . serialize($args)] = '$pearweb->addXmlrpcConfig("' .
131
$args->toPHP() . ', ' .
132
$dump->toPHP() .");";
133
foreach($GLOBALS['totalPHP'] as $php) {
136
var_dump(array_keys($this->_config['xmlrpc'][$method]), $params);
137
die("Error - parameters not configured properly for $method");
139
return $this->_config['xmlrpc'][$method][serialize($params)];
142
function doXmlrpcFault($info)
144
$r = new XML_RPC_Response(0, 1, 'Unknown method');
145
return $this->do200() . $r->serialize();
150
return "HTTP/1.1 200 \n";
153
function do404($address)
155
return 'HTTP/1.1 404 ' . $address . ' Is not valid';
159
* Parse an xmlrpc request
160
* @param string fake HTTP_RAW_POST_DATA
161
* @return string|array serialized fault string, or array containing method name and parameters
163
function parseRequest($data)
165
// copied from XML_RPC_Server
167
global $XML_RPC_err, $XML_RPC_str, $XML_RPC_errxml,
168
$XML_RPC_defencoding, $XML_RPC_Server_dmap;
170
$parser = xml_parser_create($XML_RPC_defencoding);
172
$XML_RPC_xh[$parser] = array();
173
$XML_RPC_xh[$parser]['st'] = "";
174
$XML_RPC_xh[$parser]['cm'] = 0;
175
$XML_RPC_xh[$parser]['isf'] = 0;
176
$XML_RPC_xh[$parser]['params'] = array();
177
$XML_RPC_xh[$parser]['method'] = "";
181
// decompose incoming XML into request structure
183
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
184
xml_set_element_handler($parser, "XML_RPC_se", "XML_RPC_ee");
185
xml_set_character_data_handler($parser, "XML_RPC_cd");
186
xml_set_default_handler($parser, "XML_RPC_dh");
187
if (!xml_parse($parser, $data, 1)) {
188
// return XML error as a faultCode
189
$r = new XML_RPC_Response(0,
190
$XML_RPC_errxml+xml_get_error_code($parser),
191
sprintf("XML error: %s at line %d",
192
xml_error_string(xml_get_error_code($parser)),
193
xml_get_current_line_number($parser)));
194
xml_parser_free($parser);
195
return $r->serialize();
197
xml_parser_free($parser);
199
// now add parameters in
200
for ($i = 0; $i < sizeof($XML_RPC_xh[$parser]['params']); $i++) {
201
// print "<!-- " . $XML_RPC_xh[$parser]['params'][$i]. "-->\n";
202
$plist .= "$i - " . $XML_RPC_xh[$parser]['params'][$i] . " \n";
203
eval('$val = ' . $XML_RPC_xh[$parser]['params'][$i] . ";");
204
$param = $val->scalarval();
205
$param = PEAR_test_mock_pearweb::_convertScalar($param);
208
return array('method' => $XML_RPC_xh[$parser]['method'], 'params' => $params);
213
* Converts the mishmash returned from XML_RPC parsing into a regular PHP value,
214
* handling nested arrays gracefully.
218
function _convertScalar($val)
220
if (is_a($val, 'XML_RPC_Value')) {
221
$val = $val->scalarval();
223
if (!is_array($val)) {
227
foreach ($val as $i => $contents)
229
$newval[$i] = PEAR_test_mock_pearweb::_convertScalar($contents);
b'\\ No newline at end of file'