/** * Index page */ public function indexAction() { // get user info by api key if (null != ($apiKey = $this->getRequest()->getQuery()->api_key)) { if (null != ($userInfo = UserIdentityService::getUserInfo($apiKey, UserModelBase::USER_INFO_BY_API_KEY))) { // fill the user's info if ($userInfo['status'] == UserModelBase::STATUS_APPROVED) { $userIdentity = []; foreach ($userInfo as $fieldName => $value) { $userIdentity[$fieldName] = $value; } // init user identity UserIdentityService::setCurrentUserIdentity($userIdentity); } } } XmlRpcServerFault::attachFaultException('XmlRpc\\Exception\\XmlRpcActionDenied'); $server = new XmlRpcServer(); // get xmlrpc classes if (null != ($classes = $this->getModel()->getClasses())) { $server->sendArgumentsToAllMethods(false); foreach ($classes as $class) { $server->setClass($class['path'], $class['namespace'], $this->getServiceLocator()); } } $server->handle(); // disable layout and view script return $this->response; }
public function indexAction() { $server = new Server(); $serverObject = new Handler($this->getServiceLocator()); $server->setClass($serverObject); echo $server->handle(); exit; }
/** * @group ZF-2872 */ public function testCanMarshalBase64Requests() { $this->_server->setClass('ZendTest\\XmlRpc\\TestClass', 'test'); $data = base64_encode('this is the payload'); $param = array('type' => 'base64', 'value' => $data); $request = new Request('test.base64', array($param)); $response = $this->_server->handle($request); $this->assertFalse($response instanceof XmlRpc\Fault); $this->assertEquals($data, $response->getReturnValue()); }
/** * Multicall - boxcar feature of XML-RPC for calling multiple methods * in a single request. * * Expects a an array of structs representing method calls, each element * having the keys: * - methodName * - params * * Returns an array of responses, one for each method called, with the value * returned by the method. If an error occurs for a given method, returns a * struct with a fault response. * * @see http://www.xmlrpc.com/discuss/msgReader$1208 * @param array $methods * @return array */ public function multicall($methods) { $responses = array(); foreach ($methods as $method) { $fault = false; if (!is_array($method)) { $fault = $this->_server->fault('system.multicall expects each method to be a struct', 601); } elseif (!isset($method['methodName'])) { $fault = $this->_server->fault('Missing methodName: ' . var_export($methods, 1), 602); } elseif (!isset($method['params'])) { $fault = $this->_server->fault('Missing params', 603); } elseif (!is_array($method['params'])) { $fault = $this->_server->fault('Params must be an array', 604); } else { if ('system.multicall' == $method['methodName']) { // don't allow recursive calls to multicall $fault = $this->_server->fault('Recursive system.multicall forbidden', 605); } } if (!$fault) { try { $request = new \Zend\XmlRpc\Request(); $request->setMethod($method['methodName']); $request->setParams($method['params']); $response = $this->_server->handle($request); if ($response instanceof \Zend\XmlRpc\Fault || $response->isFault() ) { $fault = $response; } else { $responses[] = $response->getReturnValue(); } } catch (\Exception $e) { $fault = $this->_server->fault($e); } } if ($fault) { $responses[] = array( 'faultCode' => $fault->getCode(), 'faultString' => $fault->getMessage() ); } } return $responses; }
/** * {@inheritdoc} */ public function serve() { if (!function_exists('xmlrpc_server_create')) { throw new \Exception('xmlrpc extension is not installed. Please enable this extension.'); exit; } if (!class_exists('Zend\\XmlRpc\\Server')) { throw new \Exception("Zend\\XmlRpc\\Server is required. " . "please install it using 'composer require zendframework/zend-xmlrpc'"); exit; } if (isset($_GET['xmlrpc']) || isset($_GET['XMLRPC'])) { $server = new Server(); $server->sendArgumentsToAllMethods(false); $server->setClass(get_class($this->serviceHandler), 'DBInstance', $this->authentication, $this->connectionStrings, $this->logDir); echo $server->handle(); } }
<?php use Zend\XmlRpc\Server; require_once __DIR__ . '/../../vendor/autoload.php'; class Foo { public function bar() { return 'bar remote!'; } } $server = new Server(); $server->setClass(new Foo(), 'Foo'); $server->setReturnResponse(false); $server->handle();
public function run() { /* $data = array( 'project_id' => 'WRHS', 'service' => 'cargoitem', 'method' => 'import', 'request' => '' ); $logAddResult = \Model\LogXmlrpcServerModel::getInstance()->add($data); print_r($logAddResult->getErrors()); die; */ $logAddResult = null; $method = null; ob_start(); $request = $this->getRequest(); try { $xmlRequest = $request->getRawBody(); if (empty($xmlRequest)) { $xmlRequest = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<methodCall><methodName>cargoitem.import</methodName><params><param><value><struct><member><name>item_fid</name><value><string>EBTD_P654326</string></value></member><member><name>source_id</name><value><string>EBTD</string></value></member><member><name>warehouse_code</name><value><string>usa</string></value></member><member><name>country_code</name><value><string>RU</string></value></member><member><name>delivery_type</name><value><string>SPSR</string></value></member><member><name>weight</name><value><int>11386</int></value></member><member><name>_cargo_item_declaration</name><value><array><data><value><struct><member><name>name</name><value><string>Test t-short</string></value></member><member><name>article</name><value><string>123312a</string></value></member><member><name>color</name><value><string>white</string></value></member><member><name>size</name><value><string>xxx-large</string></value></member><member><name>count</name><value><int>2</int></value></member><member><name>weight</name><value><int>11386</int></value></member><member><name>shop</name><value><string>amazon.com</string></value></member><member><name>url</name><value><string>http://amazon.com/goods/1?id2</string></value></member><member><name>price</name><value><double>123.40000000000001</double></value></member><member><name>commission</name><value><double>12.4</double></value></member><member><name>means_of_payment</name><value><string>visa*342</string></value></member><member><name>category</name><value><string>cloting</string></value></member><member><name>descr</name><value><string>Simple t-short</string></value></member></struct></value><value><struct><member><name>name</name><value><string>Test t-short 2</string></value></member><member><name>article</name><value><string>123313b</string></value></member><member><name>color</name><value><string>white</string></value></member><member><name>size</name><value><string>xxx-large</string></value></member><member><name>count</name><value><int>2</int></value></member><member><name>weight</name><value><int>11386</int></value></member><member><name>shop</name><value><string>amazon.com</string></value></member><member><name>url</name><value><string>http://amazon.com/goods/1?id2</string></value></member><member><name>price</name><value><double>123.40000000000001</double></value></member><member><name>commission</name><value><double>12.4</double></value></member><member><name>means_of_payment</name><value><string>visa*342</string></value></member><member><name>category</name><value><string>cloting</string></value></member><member><name>descr</name><value><string>Simple t-short</string></value></member></struct></value></data></array></value></member></struct></value></param></params></methodCall>'; } $parts = null; if (preg_match("#\\<methodName\\>\\s*([a-z0-9_]+)\\.([a-z0-9_]+)\\s*\\<\\/methodName\\>#is", $xmlRequest, $parts)) { $method = @$parts[1] . '.' . @$parts[2]; } if (strtolower($method) == 'system.fake') { // don't execute fake request throw new \Exception('Fake request'); } $key = $this->getRequest()->getQuery('key'); $project = \Model\ProjectModel::getInstance()->getByKey($key); if ($project->exists()) { BaseService::setProject($project); } $logRequest = !in_array(strtolower($method), self::$_notLoggingMethods); if ($logRequest && $method) { $data = array('project_id' => $project->getId(), 'service' => $parts[1], 'method' => $parts[2], 'request' => !in_array(strtolower($method), self::$_notLoggingRequestMethods) ? $xmlRequest : self::$_emptyXmlRequest); $logAddResult = \Model\LogXmlrpcServerModel::getInstance()->add($data); //$a = $logAddResult instanceof \Model\Result\Result; } $response = $this->server->handle(); } catch (\Exception $ex) { $response = (string) $this->server->fault('Server error', 1500); echo "\n\nEXCEPTION: " . $ex->getMessage() . "\n"; echo $ex->getTraceAsString() . "\n\n"; } $output = ob_get_contents(); ob_end_clean(); ob_start(); try { if ($logAddResult instanceof \Model\Result\Result && $logAddResult->getResult()) { $logId = $logAddResult->getResult(); $methparts = explode('.', $method); $msec = round((microtime(true) - $this->getTimeStart()) * 1000); $updateCond = \Model\LogXmlrpcServerModel::getInstance()->getCond()->where(array('id' => $logId)); $logXmlrpcServerArray = array('response' => $response, 'output' => $output, 'work_msec' => $msec); if ($msec > 1000) { //\Model\LogXmlrpcServerModel::getInstance()->reconnect(); нужен реконект } $logUpdResult = \Model\LogXmlrpcServerModel::getInstance()->update($logXmlrpcServerArray, $updateCond); if ($logUpdResult->isError()) { echo "\n\nLogXmlrpcServer update failed\n"; echo $logUpdResult->getErrors(true)->toString() . "\n\n"; echo "Output:\n" . $output; } } else { echo "\n\nLogXmlrpcServer add failed\n"; print_r($logAddResult, true); //echo $logAddResult->getErrors(true)->toString() . "\n\n"; echo "Output:\n" . $output; } } catch (\Exception $e) { echo "\n\n" . $e->getMessage() . "\n" . $e->getTraceAsString() . "\n\n"; } $output2 = ob_get_contents(); /* if ($output2) { $file = Zend_Registry::get('dir')->tmp . '/front_services_exception.txt'; @file_put_contents($file, $output2); @chmod($file, 0664); //App_Logger_Db::log($output2, Zend_Log::ERR); } */ ob_end_clean(); // Пишем в логи для xml-rpc сервера echo $response; }