void JsonRpcServer::jsonRequestReceived(const QJsonObject& request, QObject* socket) { JCON_ASSERT(request.value("jsonrpc").toString() == "2.0"); if (request.value("jsonrpc").toString() != "2.0") { logError("invalid protocol tag"); return; } QString method_name = request.value("method").toString(); if (method_name.isEmpty()) { logError("no method present in request"); } QVariant params = request.value("params").toVariant(); QString request_id = request.value("id").toString(InvalidRequestId); QVariant return_value; if (!dispatch(method_name, params, request_id, return_value)) { auto msg = QString("method '%1' not found, check name and " "parameter types ").arg(method_name); logError(msg); // send error response if request had valid ID if (request_id != InvalidRequestId) { QJsonDocument error = createErrorResponse(request_id, JsonRpcError::EC_MethodNotFound, msg); JsonRpcEndpoint* endpoint = findClient(socket); if (!endpoint) { logError("invalid client socket, cannot send response"); return; } endpoint->send(error); return; } } // send response if request had valid ID if (request_id != InvalidRequestId) { QJsonDocument response = createResponse(request_id, return_value, method_name); JsonRpcEndpoint* endpoint = findClient(socket); if (!endpoint) { logError("invalid client socket, cannot send response"); return; } endpoint->send(response); } }
void JsonRpcTcpSocket::dataReady() { JCON_ASSERT(m_socket->bytesAvailable() > 0); QByteArray bytes = m_socket->read(m_socket->bytesAvailable()); emit dataReceived(bytes, m_socket); }