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; }
protected function _request($uri, $data) { $headers[] = 'Content-type: application/octet-stream'; $curl = curl_init(); curl_setopt($curl, CURLOPT_USERAGENT, 'Footstones RPC Client 1.0'); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($curl, CURLOPT_TIMEOUT, 10); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_HEADER, 1); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_URL, $uri); $response = curl_exec($curl); $curlinfo = curl_getinfo($curl); $header = substr($response, 0, $curlinfo['header_size']); $body = substr($response, $curlinfo['header_size']); curl_close($curl); $context = array('CURLINFO' => $curlinfo, 'HEADER' => $header, 'BODY' => $body); if (empty($curlinfo['namelookup_time'])) { throw new ClientTransportException("server address look up timeout."); } if (empty($curlinfo['connect_time'])) { throw new ClientTransportException("server connect timeout."); } if (empty($curlinfo['starttransfer_time'])) { throw new ClientTransportException("server request timeout."); } if ($curlinfo['http_code'] != 200) { throw new ClientTransportException("erver responsed non-200 code {$curlinfo['http_code']}"); } try { return Packager::unpack($body); } catch (\Exception $e) { throw new ClientTransportException($e->getMessage()); } }