#include "WebJsonRpc.h" #include "QtHttpReply.h" #include "QtHttpRequest.h" #include "QtHttpServer.h" #include "QtHttpClientWrapper.h" #include WebJsonRpc::WebJsonRpc(QtHttpRequest* request, QtHttpServer* server, const bool& localConnection, QtHttpClientWrapper* parent) : QObject(parent) , _server(server) , _wrapper(parent) , _log(Logger::getInstance("HTTPJSONRPC")) { const QString client = request->getClientInfo().clientAddress.toString(); _jsonAPI = new JsonAPI(client, _log, localConnection, this, true); connect(_jsonAPI, &JsonAPI::callbackMessage, this, &WebJsonRpc::handleCallback); connect(_jsonAPI, &JsonAPI::forceClose, [&]() { _wrapper->closeConnection(); _stopHandle = true; }); _jsonAPI->initialize(); } void WebJsonRpc::handleMessage(QtHttpRequest* request) { // TODO better solution. If jsonAPI emits forceClose the request is deleted and the following call to this method results in segfault if(!_stopHandle) { QByteArray header = request->getHeader("Authorization"); QByteArray data = request->getRawData(); _unlocked = true; _jsonAPI->handleMessage(data,header); } } void WebJsonRpc::handleCallback(QJsonObject obj) { // guard against wrong callbacks; TODO: Remove when JSONAPI is more solid if(!_unlocked) return; _unlocked = false; // construct reply with headers timestamp and server name QtHttpReply reply(_server); QJsonDocument doc(obj); reply.addHeader ("Content-Type", "application/json"); reply.appendRawData (doc.toJson()); _wrapper->sendToClientWithReply(&reply); }