private function callRPC($method, $parameters = []) { $server = new Server(new TestService()); $input = Packager::pack(['m' => $method, 'p' => $parameters]); $response = $server->handle($input['data']); return Packager::unpack($response['data']); }
public function handle($service, $data, $request) { $this->logger->debug('request: ' . $data, $request); $response = []; try { $unpacked = Packager::unpack($data); $this->logger->debug('unpacked request', $unpacked); } catch (\Exception $e) { $response['s'] = Consts::ERR_PACKAGER; $response['e'] = ['message' => $e->getMessage()]; $this->logger->error("unpack error: {$response['e']}", $request); goto end; } $transaction = $unpacked['header']['transactionId']; $method = $unpacked['body']['m']; $parameters = $unpacked['body']['p']; $this->logger->info("{$request['remote_addr']} {$request['request_method']} {$request['request_uri']} {$method}", $parameters); if (!is_callable([$service, $method])) { $response['s'] = Consts::ERR_REQUEST; $response['e'] = ['message' => sprintf("call to undefined api %s::%s", get_class($service), $method)]; $this->logger->warning('api undefined', $response); goto end; } try { ob_start(); $response['r'] = call_user_func_array([$service, $method], $parameters); $response['s'] = Consts::ERR_OKEY; $this->logger->debug('api call result', $response); $output = ob_get_contents(); ob_end_clean(); if (strlen($output) > 0) { $response['o'] = $output; $this->logger->debug('api call output: ', $output); } } catch (\Exception $e) { $response['s'] = Consts::ERR_EXCEPTION; $response['e'] = ['message' => $e->getMessage(), 'code' => $e->getCode(), 'file' => $e->getFile(), 'line' => $e->getLine(), '_type' => get_class($e)]; $this->logger->warning('api call exception', $response); } end: $this->logger->debug('response', $response); $response = Packager::pack($response, isset($transaction) ? $transaction : null); return $response; }
public function __call($method, $parameters = []) { $data = Packager::pack(['m' => $method, 'p' => $parameters]); $response = $this->_request($this->_uri, $data['data']); if (isset($response['body']['o'])) { echo $response['body']['o']; } switch ($response['body']['s']) { case Consts::ERR_OKEY: return $response['body']['r']; case Consts::ERR_PACKAGER: throw new ClientPackagerException($response['body']['e']['message']); case Consts::ERR_PROTOCOL: throw new ClientPackagerException($response['body']['e']['message']); case Consts::ERR_TRANSPORT: throw new ClientTransportException($response['body']['e']['message']); case Consts::ERR_REQUEST: case Consts::ERR_EXCEPTION: throw new ServerException($response['body']['e']['message']); default: throw new ClientException($response['body']['e']['message']); break; } }