Example #1
0
 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']);
 }
Example #2
0
 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;
 }
Example #3
0
 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());
     }
 }