/** * @param RpcRequestInterface $request * @return RpcResponseInterface */ public function call(RpcRequestInterface $request) { $this->getDispatcher()->dispatch(Events::RPC_REQUEST, new RpcRequestEvent($request)); $protocol = $this->getProtocol($request->getProtocol()); $httpRequest = $protocol->createHttpRequest($request); $this->getDispatcher()->dispatch(Events::HTTP_REQUEST, new HttpRequestEvent($httpRequest)); $httpResponse = $this->getTransport()->call($httpRequest); $this->getDispatcher()->dispatch(Events::HTTP_RESPONSE, new HttpResponseEvent($httpRequest, $httpResponse)); $response = $protocol->createRpcResponse($httpResponse); $this->getDispatcher()->dispatch(Events::RPC_RESPONSE, new RpcResponseEvent($request, $response)); return $response; }
/** * @param RpcRequestInterface $request * @return HttpRequestInterface */ public function createHttpRequest(RpcRequestInterface $request) { $data = ['jsonrpc' => '2.0', 'method' => $request->getMethod(), 'params' => $request->getParams(), 'id' => uniqid('', true)]; $body = @json_encode($data); if (!$body) { throw new InvalidArgumentException('Invalid request data.'); } $httpRequest = new HttpRequest(); $httpRequest->setHeaders($request->getHeaders()); $httpRequest->setHeader('Content-Type', 'application/json'); $httpRequest->setUrl($request->getUrl()); $httpRequest->setBody($body); return $httpRequest; }