diff --git a/src/cpp/JSONInterface/JsonTransaction.cpp b/src/cpp/JSONInterface/JsonTransaction.cpp index bc747db05..ede524b03 100644 --- a/src/cpp/JSONInterface/JsonTransaction.cpp +++ b/src/cpp/JSONInterface/JsonTransaction.cpp @@ -1,5 +1,6 @@ #include "JsonTransaction.h" #include "Poco/URI.h" +#include "Poco/Dynamic/Struct.h" #include "../SingletonManager/SessionManager.h" @@ -29,25 +30,50 @@ Poco::JSON::Object* JsonTransaction::handle(Poco::Dynamic::Var params) } int balance = 0; - paramJsonObject->get("balance").convert(balance); - if (balance) { - auto u = session->getUser(); - if (u) { - u->setBalance(balance); + if (!paramJsonObject->isNull("balance")) { + paramJsonObject->get("balance").convert(balance); + if (balance) { + auto u = session->getUser(); + if (u) { + u->setBalance(balance); + } } } std::string transactionBase64String; - paramJsonObject->get("transaction_base64").convert(transactionBase64String); + Poco::Dynamic::Var transaction_base64 = paramJsonObject->get("transaction_base64"); + int alreadyEnlisted = 0; + if (transaction_base64.isString()) { + paramJsonObject->get("transaction_base64").convert(transactionBase64String); - if (!session->startProcessingTransaction(transactionBase64String)) { - auto lastError = session->getLastError(); - if (lastError) delete lastError; - result->set("state", "error"); - result->set("msg", "already enlisted"); - return result; + if (!session->startProcessingTransaction(transactionBase64String)) { + auto lastError = session->getLastError(); + if (lastError) delete lastError; + result->set("state", "error"); + result->set("msg", "already enlisted"); + return result; + } + + } else { + Poco::DynamicStruct ds = *paramJsonObject; + for (int i = 0; i < ds["transaction_base64"].size(); i++) { + ds["transaction_base64"][i].convert(transactionBase64String); + if (!session->startProcessingTransaction(transactionBase64String)) { + auto lastError = session->getLastError(); + if (lastError) delete lastError; + alreadyEnlisted++; + } + } + + if (alreadyEnlisted > 0) { + result->set("state", "warning"); + result->set("msg", std::to_string(alreadyEnlisted) + " already enlisted"); + return result; + } } + + result->set("state", "success"); return result; } @@ -55,6 +81,10 @@ Poco::JSON::Object* JsonTransaction::handle(Poco::Dynamic::Var params) } catch (Poco::Exception& ex) { printf("[JsonTransaction::handle] try to use params as jsonObject: %s\n", ex.displayText().data()); + result->set("state", "error"); + result->set("msg", "json exception"); + result->set("details", ex.displayText()); + return result; } } else if (params.isVector()) { diff --git a/src/cpp/model/Session.cpp b/src/cpp/model/Session.cpp index 249e275e1..a8bda5c16 100644 --- a/src/cpp/model/Session.cpp +++ b/src/cpp/model/Session.cpp @@ -367,6 +367,30 @@ void Session::finalizeTransaction(bool sign, bool reject) unlock(); } +size_t Session::getProcessingTransactionCount() +{ + size_t count = 0; + lock(); + + for (auto it = mProcessingTransactions.begin(); it != mProcessingTransactions.end(); it++) { + + (*it)->lock(); + if ((*it)->errorCount() > 0) { + (*it)->sendErrorsAsEmail(); + (*it)->unlock(); + it = mProcessingTransactions.erase(it); + if (it == mProcessingTransactions.end()) break; + } + else { + (*it)->unlock(); + } + + } + count = mProcessingTransactions.size(); + unlock(); + return count; +} + bool Session::isPwdValid(const std::string& pwd) { if (mSessionUser) { diff --git a/src/cpp/model/Session.h b/src/cpp/model/Session.h index c317c3a30..945592245 100644 --- a/src/cpp/model/Session.h +++ b/src/cpp/model/Session.h @@ -105,7 +105,7 @@ public: //! \param working if set will filled with transaction running Poco::AutoPtr getNextReadyTransaction(size_t* working = nullptr); void finalizeTransaction(bool sign, bool reject); - inline size_t getProcessingTransactionCount() { lock(); auto ret = mProcessingTransactions.size(); unlock(); return ret; } + size_t getProcessingTransactionCount(); inline LanguageCatalog* getLanguageCatalog() { return mLanguageCatalog.isNull() ? nullptr : mLanguageCatalog; } void setLanguage(Languages lang); diff --git a/src/cpp/tasks/SigningTransaction.cpp b/src/cpp/tasks/SigningTransaction.cpp index bbed2ba51..eed2585be 100644 --- a/src/cpp/tasks/SigningTransaction.cpp +++ b/src/cpp/tasks/SigningTransaction.cpp @@ -3,6 +3,8 @@ #include "../SingletonManager/ErrorManager.h" #include "../SingletonManager/MemoryManager.h" +#include "../lib/Profiler.h" + #include "../proto/gradido/Transaction.pb.h" #include "sodium.h" @@ -124,6 +126,7 @@ int SigningTransaction::run() { // 443 = HTTPS Default // TODO: adding port into ServerConfig try { + Profiler phpRequestTime; Poco::Net::HTTPSClientSession httpsClientSession(ServerConfig::g_php_serverHost, 443); Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_POST, "/TransactionJsonRequestHandler"); @@ -140,6 +143,8 @@ int SigningTransaction::run() { for (std::string line; std::getline(request_stream, line); ) { responseStringStream << line << std::endl; } + Poco::Logger& speedLog= Poco::Logger::get("SpeedLog"); + speedLog.information("[putTransaction] php server time: %s", phpRequestTime.string()); // extract parameter from request Poco::JSON::Parser jsonParser;