/** * Makes a synchronous RPC call. * @param string $package Package to call * @param string $call_name Specific RPC call to make * @param string $request Request proto, serialised to string * @param string $response Response proto string to populate * @param double $deadline Optional deadline for the RPC call */ public function makeSyncCall($package, $call_name, $request, $response, $deadline = null) { if ($deadline === null) { $deadline = 5; } $remote_request = new Request(); $remote_request->setServiceName($package); $remote_request->setMethod($call_name); $remote_request->setRequest($request->serializeToString()); $remote_request->setRequestId($this->requestId); $serialized_remote_request = $remote_request->serializeToString(); $opts = array('http' => array('method' => 'POST', 'header' => "Content-type: application/octet-stream\r\n" . 'Content-Length: ' . strlen($serialized_remote_request) . "\r\n", 'content' => $serialized_remote_request)); $context = stream_context_create($opts); $serialized_remote_respone = file_get_contents('http://localhost:' . $this->apiPort, false, $context); $remote_response = new Response(); $remote_response->parseFromString($serialized_remote_respone); if ($remote_response->hasApplicationError()) { throw new ApplicationError($remote_response->getApplicationError()->getCode(), $remote_response->getApplicationError()->getDetail()); } if ($remote_response->hasException() || $remote_response->hasJavaException()) { // This indicates a bug in the remote implementation. throw new RPCFailedError(sprintf('Remote implementation for %s.%s failed', $package, $call_name)); } $response->parseFromString($remote_response->getResponse()); }
/** * Makes a synchronous RPC call. * @param string $package Package to call * @param string $call_name Specific RPC call to make * @param string $request Request proto, serialised to string * @param string $response Response proto string to populate * @param double $deadline Optional deadline for the RPC call in seconds. */ public function makeSyncCall($package, $call_name, $request, $response, $deadline = null) { if ($deadline === null) { $deadline = self::DEFAULT_TIMEOUT_SEC; } $ticket = getenv(self::TICKET_HEADER); if ($ticket === false) { $ticket = getenv(self::DEV_TICKET_HEADER); if ($ticket === false) { $ticket = $this->getDefaultTicket(); } } $remote_request = new Request(); $remote_request->setServiceName($package); $remote_request->setMethod($call_name); $remote_request->setRequest($request->serializeToString()); $remote_request->setRequestId($ticket); $serialized_remote_request = $remote_request->serializeToString(); $headers = [self::SERVICE_DEADLINE_HEADER => $deadline, self::SERVICE_ENDPOINT_HEADER => self::SERVICE_ENDPOINT_NAME, self::SERVICE_METHOD_HEADER => self::APIHOST_METHOD, 'Content-Type' => self::RPC_CONTENT_TYPE]; $dapper_header_value = getenv(self::DAPPER_ENV_KEY); if ($dapper_header_value !== false) { $headers[self::DAPPER_HEADER] = $dapper_header_value; } // Headers are sorted so we can do a string comparison in the unit test. ksort($headers); $header_str = ""; foreach ($headers as $k => $v) { $header_str .= sprintf("%s: %s\r\n", $k, $v); } $opts = ['http' => ['method' => 'POST', 'header' => $header_str, 'content' => $serialized_remote_request, 'timeout' => $deadline + self::DEADLINE_DELTA_SECONDS]]; $context = stream_context_create($opts); $api_host = static::getEnvOrDefault('API_HOST', self::SERVICE_BRIDGE_HOST); $api_port = static::getEnvOrDefault('API_PORT', self::API_PORT); $endpoint_url = sprintf("http://%s:%s%s", $api_host, $api_port, self::PROXY_PATH); // We silence the error here to prevent spamming the users application. // @codingStandardsIgnoreStart $serialized_remote_respone = @file_get_contents($endpoint_url, false, $context); // @codingStandardsIgnoreEnd if ($serialized_remote_respone === false) { throw new RPCFailedError(sprintf('Remote implementation for %s.%s failed', $package, $call_name)); } $remote_response = new Response(); $remote_response->parseFromString($serialized_remote_respone); if ($remote_response->hasApplicationError()) { throw new ApplicationError($remote_response->getApplicationError()->getCode(), $remote_response->getApplicationError()->getDetail()); } if ($remote_response->hasException() || $remote_response->hasJavaException()) { // This indicates a bug in the remote implementation. throw new RPCFailedError(sprintf('Remote implementation for %s.%s failed', $package, $call_name)); } if ($remote_response->hasRpcError()) { $rpc_error = $remote_response->getRpcError(); throw self::getRpcErrorFromException($rpc_error->getCode(), $package, $call_name); } $response->parseFromString($remote_response->getResponse()); }