void handleRequest() override { QString msg = QLatin1String("unimplemented command \"") + req.value(QLatin1String("command")).toString() + QLatin1Char('"'); createErrorResponse(msg); }
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); } }
QJsonDocument JsonRpcServer::createResponse(const QString& request_id, const QVariant& return_value, const QString& method_name) { QJsonObject res_json_obj { { "jsonrpc", "2.0" }, { "id", request_id } }; if (return_value.type() == QVariant::Invalid) { res_json_obj["result"] = QJsonValue(); } else if (return_value.type() == QVariant::List) { auto ret_doc = QJsonDocument::fromVariant(return_value); res_json_obj["result"] = ret_doc.array(); } else if (return_value.type() == QVariant::Map) { auto ret_doc = QJsonDocument::fromVariant(return_value); res_json_obj["result"] = ret_doc.object(); } else if (return_value.type() == QVariant::Int) { res_json_obj["result"] = return_value.toInt(); } else if (return_value.type() == QVariant::LongLong) { res_json_obj["result"] = return_value.toLongLong(); } else if (return_value.type() == QVariant::Double) { res_json_obj["result"] = return_value.toDouble(); } else if (return_value.type() == QVariant::Bool) { res_json_obj["result"] = return_value.toBool(); } else if (return_value.type() == QVariant::String) { res_json_obj["result"] = return_value.toString(); } else { auto msg = QString("method '%1' has unknown return type: %2") .arg(method_name) .arg(return_value.type()); logError(msg); return createErrorResponse(request_id, JsonRpcError::EC_InvalidRequest, msg); } return QJsonDocument(res_json_obj); }