* Please do not copy this file verbatim into your production server.
**/
-// give user a chance to see the source for this server instead of running the services
-if ($_SERVER['REQUEST_METHOD'] != 'POST' && isset($_GET['showSource'])) {
- highlight_file(__FILE__);
- die();
-}
-
-include_once __DIR__ . "/../../vendor/autoload.php";
+require_once __DIR__ . "/_bootstrap.php";
-// out-of-band information: let the client manipulate the server operations.
-// we do this to help the testsuite script: do not reproduce in production!
+// Out-of-band information: let the client manipulate the server operations.
+// We do this to help the testsuite script: do not reproduce in production!
if (isset($_COOKIE['PHPUNIT_SELENIUM_TEST_ID']) && extension_loaded('xdebug')) {
$GLOBALS['PHPUNIT_COVERAGE_DATA_DIRECTORY'] = '/tmp/phpxmlrpc_coverage';
if (!is_dir($GLOBALS['PHPUNIT_COVERAGE_DATA_DIRECTORY'])) {
{
/**
* Method used to test logging of php warnings generated by user functions.
+ * @param PhpXmlRpc\Request $req
+ * @return PhpXmlRpc\Response
*/
public function phpWarningGenerator($req)
{
$a = $undefinedVariable; // this triggers a warning in E_ALL mode, since $undefinedVariable is undefined
- return new PhpXmlRpc\Response(new Value(1, 'boolean'));
+ return new PhpXmlRpc\Response(new Value(1, Value::$xmlrpcBoolean));
}
/**
* Method used to test catching of exceptions in the server.
+ * @param PhpXmlRpc\Request $req
+ * @throws Exception
*/
public function exceptionGenerator($req)
{
throw new Exception("it's just a test", 1);
}
+ /**
+ * @param string $msg
+ */
+ public function debugMessageGenerator($msg)
+ {
+ PhpXmlRpc\Server::xmlrpc_debugmsg($msg);
+ }
+
/**
* A PHP version of the state-number server. Send me an integer and i'll sell you a state.
+ * Used to test wrapping of PHP methods into xmlrpc methods.
*
* @param integer $num
* @return string
{
return inner_findstate($num);
}
+
+ /**
+ * Returns an instance of stdClass.
+ * Used to test wrapping of PHP objects with class preservation
+ */
+ public function returnObject()
+ {
+ $obj = new stdClass();
+ $obj->hello = 'world';
+ return $obj;
+ }
}
// a PHP version of the state-number server
$wrapper = new PhpXmlRpc\Wrapper();
-$findstate2_sig = $wrapper->wrap_php_function('inner_findstate');
+$findstate2_sig = $wrapper->wrapPhpFunction('inner_findstate');
-$findstate3_sig = $wrapper->wrap_php_function(array('xmlrpcServerMethodsContainer', 'findState'));
+$findstate3_sig = $wrapper->wrapPhpFunction(array('xmlrpcServerMethodsContainer', 'findState'));
$obj = new xmlrpcServerMethodsContainer();
-$findstate4_sig = $wrapper->wrap_php_function(array($obj, 'findstate'));
+$findstate4_sig = $wrapper->wrapPhpFunction(array($obj, 'findstate'));
-$findstate5_sig = $wrapper->wrap_php_function('xmlrpcServerMethodsContainer::findState', '', array('return_source' => true));
+$findstate5_sig = $wrapper->wrapPhpFunction('xmlrpcServerMethodsContainer::findState', '', array('return_source' => true));
eval($findstate5_sig['source']);
-$findstate6_sig = $wrapper->wrap_php_function('inner_findstate', '', array('return_source' => true));
+$findstate6_sig = $wrapper->wrapPhpFunction('inner_findstate', '', array('return_source' => true));
eval($findstate6_sig['source']);
-$findstate7_sig = $wrapper->wrap_php_function(array('xmlrpcServerMethodsContainer', 'findState'), '', array('return_source' => true));
+$findstate7_sig = $wrapper->wrapPhpFunction(array('xmlrpcServerMethodsContainer', 'findState'), '', array('return_source' => true));
eval($findstate7_sig['source']);
$obj = new xmlrpcServerMethodsContainer();
-$findstate8_sig = $wrapper->wrap_php_function(array($obj, 'findstate'), '', array('return_source' => true));
+$findstate8_sig = $wrapper->wrapPhpFunction(array($obj, 'findstate'), '', array('return_source' => true));
eval($findstate8_sig['source']);
-$findstate9_sig = $wrapper->wrap_php_function('xmlrpcServerMethodsContainer::findState', '', array('return_source' => true));
+$findstate9_sig = $wrapper->wrapPhpFunction('xmlrpcServerMethodsContainer::findState', '', array('return_source' => true));
eval($findstate9_sig['source']);
$findstate10_sig = array(
"docstring" => $findstate_doc,
);
-$findstate11_sig = $wrapper->wrap_php_function(function ($stateNo) { return inner_findstate($stateNo); });
+$findstate11_sig = $wrapper->wrapPhpFunction(function ($stateNo) { return inner_findstate($stateNo); });
$c = new xmlrpcServerMethodsContainer;
-$moreSignatures = $wrapper->wrap_php_class($c, array('prefix' => 'tests.', 'method_type' => 'all'));
+$moreSignatures = $wrapper->wrapPhpClass($c, array('prefix' => 'tests.', 'method_type' => 'all'));
+
+$returnObj_sig = $wrapper->wrapPhpFunction(array($c, 'returnObject'), '', array('encode_php_objs' => true));
+
+// used to test signatures with NULL params
+$findstate12_sig = array(
+ array(Value::$xmlrpcString, Value::$xmlrpcInt, Value::$xmlrpcNull),
+ array(Value::$xmlrpcString, Value::$xmlrpcNull, Value::$xmlrpcInt),
+);
+
+function findStateWithNulls($req)
+{
+ $a = $req->getParam(0);
+ $b = $req->getParam(1);
+
+ if ($a->scalartyp() == Value::$xmlrpcNull)
+ return new PhpXmlRpc\Response(new Value(inner_findstate($b->scalarval())));
+ else
+ return new PhpXmlRpc\Response(new Value(inner_findstate($a->scalarval())));
+}
$addtwo_sig = array(array(Value::$xmlrpcInt, Value::$xmlrpcInt, Value::$xmlrpcInt));
$addtwo_doc = 'Add two integers together and return the result';
$s = $req->getParam(0);
$t = $req->getParam(1);
- return new PhpXmlRpc\Response(new Value($s->scalarval() + $t->scalarval(), "int"));
+ return new PhpXmlRpc\Response(new Value($s->scalarval() + $t->scalarval(), Value::$xmlrpcInt));
}
$addtwodouble_sig = array(array(Value::$xmlrpcDouble, Value::$xmlrpcDouble, Value::$xmlrpcDouble));
$s = $req->getParam(0);
$t = $req->getParam(1);
- return new PhpXmlRpc\Response(new Value($s->scalarval() + $t->scalarval(), "double"));
+ return new PhpXmlRpc\Response(new Value($s->scalarval() + $t->scalarval(), Value::$xmlrpcDouble));
}
$stringecho_sig = array(array(Value::$xmlrpcString, Value::$xmlrpcString));
// This is to test that base64 encoding is working as expected
$incoming = $req->getParam(0);
- return new PhpXmlRpc\Response(new Value($incoming->scalarval(), "string"));
+ return new PhpXmlRpc\Response(new Value($incoming->scalarval(), Value::$xmlrpcString));
}
$bitflipper_sig = array(array(Value::$xmlrpcArray, Value::$xmlrpcArray));
function bitFlipper($req)
{
$v = $req->getParam(0);
- $sz = $v->arraysize();
$rv = new Value(array(), Value::$xmlrpcArray);
- for ($j = 0; $j < $sz; $j++) {
- $b = $v->arraymem($j);
+ foreach ($v as $b) {
if ($b->scalarval()) {
- $rv->addScalar(false, "boolean");
+ $rv[] = new Value(false, Value::$xmlrpcBoolean);
} else {
- $rv->addScalar(true, "boolean");
+ $rv[] = new Value(true, Value::$xmlrpcBoolean);
}
}
$sno = $req->getParam(0);
// error string for [if|when] things go wrong
$err = "";
- // create the output value
- $v = new Value();
$agar = array();
- $max = $sno->arraysize();
+ $max = $sno->count();
PhpXmlRpc\Server::xmlrpc_debugmsg("Found $max array elements");
- for ($i = 0; $i < $max; $i++) {
- $rec = $sno->arraymem($i);
+ foreach ($sno as $i => $rec) {
if ($rec->kindOf() != "struct") {
$err = "Found non-struct in array at element $i";
break;
}
// extract name and age from struct
- $n = $rec->structmem("name");
- $a = $rec->structmem("age");
+ $n = $rec["name"];
+ $a = $rec["age"];
// $n and $a are xmlrpcvals,
// so get the scalarval from them
$agar[$n->scalarval()] = $a->scalarval();
}
+ // create the output value
+ $v = new Value(array(), Value::$xmlrpcArray);
+
$agesorter_arr = $agar;
// hack, must make global as uksort() won't
// allow us to pass any other auxiliary information
uksort($agesorter_arr, 'agesorter_compare');
- $outAr = array();
- while (list($key, $val) = each($agesorter_arr)) {
+ foreach($agesorter_arr as $key => $val) {
// recreate each struct element
- $outAr[] = new Value(array("name" => new Value($key),
- "age" => new Value($val, "int"),), "struct");
+ $v[] = new Value(
+ array(
+ "name" => new Value($key),
+ "age" => new Value($val, "int")
+ ),
+ Value::$xmlrpcStruct
+ );
}
- // add this array to the output value
- $v->addArray($outAr);
if ($err) {
return new PhpXmlRpc\Response(0, PhpXmlRpc\PhpXmlRpc::$xmlrpcerruser, $err);
}
}
-// signature and instructions, place these in the dispatch
-// map
+// signature and instructions, place these in the dispatch map
$mailsend_sig = array(array(
Value::$xmlrpcBoolean, Value::$xmlrpcString, Value::$xmlrpcString,
Value::$xmlrpcString, Value::$xmlrpcString, Value::$xmlrpcString,
if ($err) {
return new PhpXmlRpc\Response(0, PhpXmlRpc\PhpXmlRpc::$xmlrpcerruser, $err);
} else {
- return new PhpXmlRpc\Response(new Value("true", Value::$xmlrpcBoolean));
+ return new PhpXmlRpc\Response(new Value(true, Value::$xmlrpcBoolean));
}
}
function setCookies($req)
{
$encoder = new PhpXmlRpc\Encoder();
- $m = $req->getParam(0);
- while (list($name, $value) = $m->structeach()) {
+ $cookies = $req->getParam(0);
+ foreach ($cookies as $name => $value) {
$cookieDesc = $encoder->decode($value);
setcookie($name, @$cookieDesc['value'], @$cookieDesc['expires'], @$cookieDesc['path'], @$cookieDesc['domain'], @$cookieDesc['secure']);
}
- return new PhpXmlRpc\Response(new Value(1, 'int'));
+ return new PhpXmlRpc\Response(new Value(1, Value::$xmlrpcInt));
}
$getcookies_sig = array(array(Value::$xmlrpcStruct));
{
$sno = $req->getParam(0);
$numCurly = 0;
- for ($i = 0; $i < $sno->arraysize(); $i++) {
- $str = $sno->arraymem($i);
- $str->structreset();
- while (list($key, $val) = $str->structeach()) {
+ foreach ($sno as $str) {
+ foreach ($str as $key => $val) {
if ($key == "curly") {
$numCurly += $val->scalarval();
}
}
}
- return new PhpXmlRpc\Response(new Value($numCurly, "int"));
+ return new PhpXmlRpc\Response(new Value($numCurly, Value::$xmlrpcInt));
}
$v1_easyStruct_sig = array(array(Value::$xmlrpcInt, Value::$xmlrpcStruct));
function v1_easyStruct($req)
{
$sno = $req->getParam(0);
- $moe = $sno->structmem("moe");
- $larry = $sno->structmem("larry");
- $curly = $sno->structmem("curly");
+ $moe = $sno["moe"];
+ $larry = $sno["larry"];
+ $curly = $sno["curly"];
$num = $moe->scalarval() + $larry->scalarval() + $curly->scalarval();
- return new PhpXmlRpc\Response(new Value($num, "int"));
+ return new PhpXmlRpc\Response(new Value($num, Value::$xmlrpcInt));
}
$v1_echoStruct_sig = array(array(Value::$xmlrpcStruct, Value::$xmlrpcStruct));
$v1_manyTypes_doc = 'This handler takes six parameters, and returns an array containing all the parameters.';
function v1_manyTypes($req)
{
- return new PhpXmlRpc\Response(new Value(array(
- $req->getParam(0),
- $req->getParam(1),
- $req->getParam(2),
- $req->getParam(3),
- $req->getParam(4),
- $req->getParam(5),),
- "array"
+ return new PhpXmlRpc\Response(new Value(
+ array(
+ $req->getParam(0),
+ $req->getParam(1),
+ $req->getParam(2),
+ $req->getParam(3),
+ $req->getParam(4),
+ $req->getParam(5)
+ ),
+ Value::$xmlrpcArray
));
}
function v1_moderateSizeArrayCheck($req)
{
$ar = $req->getParam(0);
- $sz = $ar->arraysize();
- $first = $ar->arraymem(0);
- $last = $ar->arraymem($sz - 1);
+ $sz = $ar->count();
+ $first = $ar[0];
+ $last = $ar[$sz - 1];
return new PhpXmlRpc\Response(new Value($first->scalarval() .
- $last->scalarval(), "string"));
+ $last->scalarval(), Value::$xmlrpcString));
}
$v1_simpleStructReturn_sig = array(array(Value::$xmlrpcStruct, Value::$xmlrpcInt));
$sno = $req->getParam(0);
$v = $sno->scalarval();
- return new PhpXmlRpc\Response(new Value(array(
- "times10" => new Value($v * 10, "int"),
- "times100" => new Value($v * 100, "int"),
- "times1000" => new Value($v * 1000, "int"),),
- "struct"
+ return new PhpXmlRpc\Response(new Value(
+ array(
+ "times10" => new Value($v * 10, Value::$xmlrpcInt),
+ "times100" => new Value($v * 100, Value::$xmlrpcInt),
+ "times1000" => new Value($v * 1000, Value::$xmlrpcInt)
+ ),
+ Value::$xmlrpcStruct
));
}
{
$sno = $req->getParam(0);
- $twoK = $sno->structmem("2000");
- $april = $twoK->structmem("04");
- $fools = $april->structmem("01");
- $curly = $fools->structmem("curly");
- $larry = $fools->structmem("larry");
- $moe = $fools->structmem("moe");
+ $twoK = $sno["2000"];
+ $april = $twoK["04"];
+ $fools = $april["01"];
+ $curly = $fools["curly"];
+ $larry = $fools["larry"];
+ $moe = $fools["moe"];
- return new PhpXmlRpc\Response(new Value($curly->scalarval() + $larry->scalarval() + $moe->scalarval(), "int"));
+ return new PhpXmlRpc\Response(new Value($curly->scalarval() + $larry->scalarval() + $moe->scalarval(), Value::$xmlrpcInt));
}
$v1_countTheEntities_sig = array(array(Value::$xmlrpcStruct, Value::$xmlrpcString));
}
}
- return new PhpXmlRpc\Response(new Value(array(
- "ctLeftAngleBrackets" => new Value($lt, "int"),
- "ctRightAngleBrackets" => new Value($gt, "int"),
- "ctAmpersands" => new Value($amp, "int"),
- "ctApostrophes" => new Value($ap, "int"),
- "ctQuotes" => new Value($qu, "int"),),
- "struct"
+ return new PhpXmlRpc\Response(new Value(
+ array(
+ "ctLeftAngleBrackets" => new Value($lt, Value::$xmlrpcInt),
+ "ctRightAngleBrackets" => new Value($gt, Value::$xmlrpcInt),
+ "ctAmpersands" => new Value($amp, Value::$xmlrpcInt),
+ "ctApostrophes" => new Value($ap, Value::$xmlrpcInt),
+ "ctQuotes" => new Value($qu, Value::$xmlrpcInt)
+ ),
+ Value::$xmlrpcStruct
));
}
'tests.getStateName.9' => $findstate9_sig,
'tests.getStateName.10' => $findstate10_sig,
'tests.getStateName.11' => $findstate11_sig,
+
+ 'tests.getStateName.12' => array(
+ "function" => "findStateWithNulls",
+ "signature" => $findstate12_sig,
+ "docstring" => $findstate_doc,
+ ),
+
+ 'tests.returnPhpObject' => $returnObj_sig,
);
$signatures = array_merge($signatures, $moreSignatures);
+// Enable support for the NULL extension
+PhpXmlRpc\PhpXmlRpc::$xmlrpc_null_extension = true;
+
$s = new PhpXmlRpc\Server($signatures, false);
$s->setdebug(3);
$s->compress_response = true;
-// out-of-band information: let the client manipulate the server operations.
-// we do this to help the testsuite script: do not reproduce in production!
+// Out-of-band information: let the client manipulate the server operations.
+// We do this to help the testsuite script: do not reproduce in production!
if (isset($_GET['RESPONSE_ENCODING'])) {
$s->response_charset_encoding = $_GET['RESPONSE_ENCODING'];
}
+if (isset($_GET['DETECT_ENCODINGS'])) {
+ PhpXmlRpc\PhpXmlRpc::$xmlrpc_detectencodings = $_GET['DETECT_ENCODINGS'];
+}
if (isset($_GET['EXCEPTION_HANDLING'])) {
$s->exception_handling = $_GET['EXCEPTION_HANDLING'];
}
+if (isset($_GET['FORCE_AUTH'])) {
+ // We implement both Basic and Digest auth in php to avoid having to set it up in a vhost.
+ // Code taken from php.net
+ // NB: we do NOT check for valid credentials!
+ if ($_GET['FORCE_AUTH'] == 'Basic') {
+ if (!isset($_SERVER['PHP_AUTH_USER']) && !isset($_SERVER['REMOTE_USER']) && !isset($_SERVER['REDIRECT_REMOTE_USER'])) {
+ header('HTTP/1.0 401 Unauthorized');
+ header('WWW-Authenticate: Basic realm="Phpxmlrpc Basic Realm"');
+ die('Text visible if user hits Cancel button');
+ }
+ } elseif ($_GET['FORCE_AUTH'] == 'Digest') {
+ if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
+ header('HTTP/1.1 401 Unauthorized');
+ header('WWW-Authenticate: Digest realm="Phpxmlrpc Digest Realm",qop="auth",nonce="'.uniqid().'",opaque="'.md5('Phpxmlrpc Digest Realm').'"');
+ die('Text visible if user hits Cancel button');
+ }
+ }
+}
+
$s->service();
-// that should do all we need!
+// That should do all we need!
-// out-of-band information: let the client manipulate the server operations.
-// we do this to help the testsuite script: do not reproduce in production!
+// Out-of-band information: let the client manipulate the server operations.
+// We do this to help the testsuite script: do not reproduce in production!
if (isset($_COOKIE['PHPUNIT_SELENIUM_TEST_ID']) && extension_loaded('xdebug')) {
include_once __DIR__ . "/../../vendor/phpunit/phpunit-selenium/PHPUnit/Extensions/SeleniumCommon/append.php";
}