X-Git-Url: https://git.teslayout.com/public/public/public/?p=anna.git;a=blobdiff_plain;f=example%2Fdiameter%2Flauncher%2FMyHandler.cpp;h=7d312ef098e8be69d6526a2742112380c80dc811;hp=49205eda15126009a4e5535550de28aa451a9bee;hb=e688b5354af3a5fe0add859710cae41ffe123f65;hpb=c56124ff93e8bceec159748dfe5ba8d56c62e3de diff --git a/example/diameter/launcher/MyHandler.cpp b/example/diameter/launcher/MyHandler.cpp index 49205ed..7d312ef 100644 --- a/example/diameter/launcher/MyHandler.cpp +++ b/example/diameter/launcher/MyHandler.cpp @@ -158,7 +158,7 @@ bool MyHandler::doPOST(const std::string &uri, const nlohmann::json &j, std::str // Node management if (opType == "/node") { auto it = j.find("name"); - if (it != j.end()) + if (it != j.end() && it->is_string()) result = eop.node(response, *it); else response += "missing 'name' string field"; @@ -170,21 +170,21 @@ bool MyHandler::doPOST(const std::string &uri, const nlohmann::json &j, std::str // Parsing operations else if (opType == "/code") { auto it = j.find("diameterJson"); - if (it != j.end()) + if (it != j.end() && it->is_object()) result = eop.code(response, it->dump(4)); // get the object as string (always indentation = 4) else response += "missing 'diameterJson' object field"; } else if (opType == "/decode") { auto it = j.find("diameterHex"); - if (it != j.end()) + if (it != j.end() && it->is_string()) result = eop.decode(response, *it); else response += "missing 'diameterHex' string field"; } else if (opType == "/loadmsg") { auto it = j.find("diameterJson"); - if (it != j.end()) + if (it != j.end() && it->is_object()) result = eop.loadmsg(response, it->dump(4)); // get the object as string (always indentation = 4) else response += "missing 'diameterJson' object field"; @@ -193,7 +193,7 @@ bool MyHandler::doPOST(const std::string &uri, const nlohmann::json &j, std::str // Hot changes else if (opType == "/services") { auto it = j.find("servicesJson"); - if (it != j.end()) { + if (it != j.end() && it->is_object()) { result = eop.services(response, it->dump(4)); // get the object as string (always indentation = 4) } else @@ -201,28 +201,28 @@ bool MyHandler::doPOST(const std::string &uri, const nlohmann::json &j, std::str } else if (opType == "/diameterServerSessions") { auto it = j.find("sessions"); - if (it != j.end()) + if (it != j.end() && it->is_number_integer()) result = eop.diameterServerSessions(response, it->get()); else response += "missing 'session' integer field"; } else if (opType == "/change-dir") { auto it = j.find("directory"); - std::string directory = (it != j.end()) ? *it : ""; // default is: restore initial directory + std::string directory = (it != j.end() && it->is_string()) ? *it : ""; // default is: restore initial directory result = eop.change_dir(response, directory); } // Client sessions visibility else if (opType == "/visibility") { auto it = j.find("action"); - if (it != j.end()) { + if (it != j.end() && it->is_string()) { std::string action = *it; it = j.find("addressPort"); - std::string addressPort = (it != j.end()) ? *it : ""; + std::string addressPort = (it != j.end() && it->is_string()) ? *it : ""; it = j.find("socket"); - int socket = (it != j.end()) ? it->get() : -1; + int socket = (it != j.end() && it->is_number_integer()) ? it->get() : -1; result = eop.visibility(response, action, addressPort, socket); } @@ -236,7 +236,7 @@ bool MyHandler::doPOST(const std::string &uri, const nlohmann::json &j, std::str } else if (opType == "/context") { auto it = j.find("targetFile"); - std::string targetFile = (it != j.end()) ? *it : ""; + std::string targetFile = (it != j.end() && it->is_string()) ? *it : ""; result = eop.context(response, targetFile); } else if (opType == "/forceCountersRecord") { @@ -244,16 +244,14 @@ bool MyHandler::doPOST(const std::string &uri, const nlohmann::json &j, std::str } else if (opType == "/log-statistics-samples") { auto it = j.find("list"); - if (it != j.end()) - result = eop.log_statistics_samples(response, *it); - else - response += "missing 'list' string field"; + std::string list = (it != j.end() && it->is_string()) ? *it : "list"; + result = eop.log_statistics_samples(response, list); } // Flow operations else if ((opType == "/sendmsg2e")||(opType == "/sendmsg2c")) { auto itJ = j.find("diameterJson"); - if (itJ != j.end()) { + if (itJ != j.end() && itJ->is_object()) { if (opType == "/sendmsg2e") result = eop.sendmsg_hex_2e(response, itJ->dump(4), true); // get the object as string (always indentation = 4) else @@ -264,7 +262,7 @@ bool MyHandler::doPOST(const std::string &uri, const nlohmann::json &j, std::str } else if ((opType == "/sendhex2e")||(opType == "/sendhex2c")) { auto itH = j.find("diameterHex"); - if (itH != j.end()) + if (itH != j.end() && itH->is_string()) if (opType == "/sendhex2e") result = eop.sendmsg_hex_2e(response, *itH, false); else @@ -275,8 +273,8 @@ bool MyHandler::doPOST(const std::string &uri, const nlohmann::json &j, std::str else if ((opType == "/answermsg2e")||(opType == "/answermsg2c")) { auto itJ = j.find("diameterJson"); auto itA = j.find("action"); - bool hasJ = (itJ != j.end()); - bool hasA = (itA != j.end()); + bool hasJ = (itJ != j.end() && itJ->is_object()); + bool hasA = (itA != j.end() && itA->is_string()); if (hasJ != hasA) { // XOR std::string action; @@ -298,85 +296,103 @@ bool MyHandler::doPOST(const std::string &uri, const nlohmann::json &j, std::str // test_id__ else if (opType == "/testid-description") { auto it = j.find("description"); - if (it != j.end()) + if (it != j.end() && it->is_string()) result = eop.test_id__description(response, atoi(param1.c_str()), *it); else response += "missing 'description' string field"; } else if (opType == "/testid-ip-limit") { auto it = j.find("amount"); - int amount = (it != j.end()) ? it->get() : 1; + int amount = (it != j.end() && it->is_number_integer()) ? it->get() : 1; result = eop.test_id__ip_limit(response, atoi(param1.c_str()), amount); } else if (opType == "/testid-timeout") { auto it = j.find("msecs"); - if (it != j.end()) + if (it != j.end() && it->is_number_integer()) result = eop.test_id__timeout(response, atoi(param1.c_str()), it->get()); else response += "missing 'msecs' integer field"; } else if ((opType == "/testid-sendmsg2e")||(opType == "/testid-sendmsg2c")) { auto it = j.find("diameterJson"); - if (it != j.end()) { + if (it != j.end() && it->is_object()) { auto itS = j.find("stepNumber"); - int stepNumber = (itS != j.end()) ? itS->get() : -1; + int stepNumber = (itS != j.end() && itS->is_number_integer()) ? itS->get() : -1; - if (opType == "/testid-sendmsg2e") - result = eop.test_id__sendmsg2e(response, atoi(param1.c_str()), it->dump(4), stepNumber); // get the object as string (always indentation = 4) - else - result = eop.test_id__sendmsg2c(response, atoi(param1.c_str()), it->dump(4), stepNumber); // get the object as string (always indentation = 4) + result = eop.test_id__sendmsg2e_2c(response, atoi(param1.c_str()), + (opType == "/testid-sendmsg2e"), it->dump(4), stepNumber); // get the object as string (always indentation = 4) } else response += "missing 'diameterJson' object field"; } else if (opType == "/testid-delay") { auto it = j.find("msecs"); - if (it != j.end()) + if (it != j.end() && it->is_number_integer()) result = eop.test_id__delay(response, atoi(param1.c_str()), it->get()); else response += "missing 'msecs' integer field"; } else if (opType == "/testid-sh-command") { auto it = j.find("script"); - if (it != j.end()) + if (it != j.end() && it->is_string()) result = eop.test_id__sh_command(response, atoi(param1.c_str()), *it); else response += "missing 'script' string field"; } else if ((opType == "/testid-waitfe-hex")||(opType == "/testid-waitfc-hex")) { auto it = j.find("hex"); - if (it != j.end()) { + if (it != j.end() && it->is_string()) { auto itS = j.find("strict"); - bool strict = (itS != j.end()) ? (*itS == "true") : false; + bool strict = (itS != j.end() && itS->is_string()) ? (*itS == "true") : false; - if (opType == "/testid-waitfe-hex") - result = eop.test_id__waitfe_hex(response, atoi(param1.c_str()), *it, strict); - else - result = eop.test_id__waitfc_hex(response, atoi(param1.c_str()), *it, strict); + result = eop.test_id__waitfefc_hex(response, atoi(param1.c_str()), (opType == "/testid-waitfe-hex"), *it, strict); } else response += "missing 'hex' string field"; } else if ((opType == "/testid-waitfe-msg")||(opType == "/testid-waitfc-msg")) { auto it = j.find("diameterJson"); - if (it != j.end()) { + if (it != j.end() && it->is_object()) { auto itS = j.find("strict"); - bool strict = (itS != j.end()) ? (*itS == "true") : false; + bool strict = (itS != j.end() && itS->is_string()) ? (*itS == "true") : false; - if (opType == "/testid-waitfe-msg") - result = eop.test_id__waitfe_msg(response, atoi(param1.c_str()), it->dump(4), strict); // get the object as string (always indentation = 4) - else - result = eop.test_id__waitfc_msg(response, atoi(param1.c_str()), it->dump(4), strict); // get the object as string (always indentation = 4) + result = eop.test_id__waitfefc_msg(response, atoi(param1.c_str()), (opType == "/testid-waitfe-msg"), it->dump(4), strict); // get the object as string (always indentation = 4) } else response += "missing 'diameterJson' object field"; } else if ((opType == "/testid-waitfe")||(opType == "/testid-waitfc")) { auto it = j.find("condition"); - if (it != j.end()) { + if (it != j.end() && it->is_object()) { + +/* + auto j2 = it->get(); + + // [code]|[bitR]|[hopByHop]|[applicationId]|[sessionId]|[resultCode]|[msisdn]|[imsi]|[serviceContextId] + auto it_code = j2.find("code"); + auto it_bitR = j2.find("bitR"); + auto it_hopByHop = j2.find("hopByHop"); + auto it_applicationId = j2.find("applicationId"); + auto it_sessionId = j2.find("sessionId"); + auto it_resultCode = j2.find("resultCode"); + auto it_msisdn = j2.find("msisdn"); + auto it_imsi = j2.find("imsi"); + auto it_serviceContextId = j2.find("serviceContextId"); + + std::string p1 = (it_code != j2.end() && it_code->is_string()) ? *it_code : ""; + std::string p2 = (it_bitR != j2.end() && it_bitR->is_string()) ? *it_bitR : ""; + std::string p3 = (it_hopByHop != it->end() && it_hopByHop->is_string()) ? *it_hopByHop : ""; + std::string p4 = (it_applicationId != it->end() && it_applicationId->is_string()) ? *it_applicationId : ""; + std::string p5 = (it_sessionId != it->end() && it_sessionId->is_string()) ? *it_sessionId : ""; + std::string p6 = (it_resultCode != it->end() && it_resultCode->is_string()) ? *it_resultCode : ""; + std::string p7 = (it_msisdn != it->end() && it_msisdn->is_string()) ? *it_msisdn : ""; + std::string p8 = (it_imsi != it->end() && it_imsi->is_string()) ? *it_imsi : ""; + std::string p9 = (it_serviceContextId != it->end() && it_serviceContextId->is_string()) ? *it_serviceContextId : ""; +*/ + // [code]|[bitR]|[hopByHop]|[applicationId]|[sessionId]|[resultCode]|[msisdn]|[imsi]|[serviceContextId] auto it_code = it->find("code"); auto it_bitR = it->find("bitR"); @@ -388,21 +404,17 @@ bool MyHandler::doPOST(const std::string &uri, const nlohmann::json &j, std::str auto it_imsi = it->find("imsi"); auto it_serviceContextId = it->find("serviceContextId"); - std::string condition; - condition += (it_code != it->end()) ? *it_code : ""; condition += "|"; - condition += (it_bitR != it->end()) ? *it_bitR : ""; condition += "|"; - condition += (it_hopByHop != it->end()) ? *it_hopByHop : ""; condition += "|"; - condition += (it_applicationId != it->end()) ? *it_applicationId : ""; condition += "|"; - condition += (it_sessionId != it->end()) ? *it_sessionId : ""; condition += "|"; - condition += (it_resultCode != it->end()) ? *it_resultCode : ""; condition += "|"; - condition += (it_msisdn != it->end()) ? *it_msisdn : ""; condition += "|"; - condition += (it_imsi != it->end()) ? *it_imsi : ""; condition += "|"; - condition += (it_serviceContextId != it->end()) ? *it_serviceContextId : ""; - - if (opType == "/testid-waitfe") - result = eop.test_id__waitfe(response, atoi(param1.c_str()), condition); - else - result = eop.test_id__waitfc(response, atoi(param1.c_str()), condition); + std::string p1 = (it_code != it->end() && it_code->is_string()) ? *it_code : ""; + std::string p2 = (it_bitR != it->end() && it_bitR->is_string()) ? *it_bitR : ""; + std::string p3 = (it_hopByHop != it->end() && it_hopByHop->is_string()) ? *it_hopByHop : ""; + std::string p4 = (it_applicationId != it->end() && it_applicationId->is_string()) ? *it_applicationId : ""; + std::string p5 = (it_sessionId != it->end() && it_sessionId->is_string()) ? *it_sessionId : ""; + std::string p6 = (it_resultCode != it->end() && it_resultCode->is_string()) ? *it_resultCode : ""; + std::string p7 = (it_msisdn != it->end() && it_msisdn->is_string()) ? *it_msisdn : ""; + std::string p8 = (it_imsi != it->end() && it_imsi->is_string()) ? *it_imsi : ""; + std::string p9 = (it_serviceContextId != it->end() && it_serviceContextId->is_string()) ? *it_serviceContextId : ""; + + result = eop.test_id__waitfefc(response, atoi(param1.c_str()), (opType == "/testid-waitfe"), p1, p2, p3, p4, p5, p6, p7, p8, p9); } else response += "missing 'condition' object field"; @@ -412,51 +424,51 @@ bool MyHandler::doPOST(const std::string &uri, const nlohmann::json &j, std::str // test__ else if (opType == "/test-ttps") { auto it = j.find("amount"); - if (it != j.end()) + if (it != j.end() && it->is_number_integer()) result = eop.test__ttps(response, it->get()); else response += "missing 'amount' integer field"; } else if (opType == "/test-next") { auto it = j.find("syncAmount"); - int syncAmount = (it != j.end()) ? it->get() : 1; + int syncAmount = (it != j.end() && it->is_number_integer()) ? it->get() : 1; result = eop.test__next(response, syncAmount); } else if (opType == "/test-ip-limit") { auto it = j.find("amount"); - int amount = (it != j.end()) ? it->get() : -2; // default is: show current ip-limit and in-progress test cases amount + int amount = (it != j.end() && it->is_number_integer()) ? it->get() : -2; // default is: show current ip-limit and in-progress test cases amount result = eop.test__ip_limit(response, amount); } else if (opType == "/test-goto") { auto it = j.find("id"); - if (it != j.end()) + if (it != j.end() && it->is_number_integer()) result = eop.test__goto(response, it->get()); else response += "missing 'id' integer field"; } else if (opType == "/test-run") { auto it = j.find("id"); - if (it != j.end()) + if (it != j.end() && it->is_number_integer()) result = eop.test__run(response, it->get()); else response += "missing 'id' integer field"; } else if (opType == "/test-look") { auto it = j.find("id"); - int id = (it != j.end()) ? it->get() : -1; // default is: current + int id = (it != j.end() && it->is_number_integer()) ? it->get() : -1; // default is: current result = eop.test__look(response, id); } else if (opType == "/test-state") { auto it = j.find("id"); - int id = (it != j.end()) ? it->get() : -1; // default is: current + int id = (it != j.end() && it->is_number_integer()) ? it->get() : -1; // default is: current result = eop.test__state(response, id); } else if (opType == "/test-interact") { auto it = j.find("amount"); - if (it != j.end()) { + if (it != j.end() && it->is_number_integer()) { auto itI = j.find("id"); - int id = (itI != j.end()) ? itI->get() : -1; // default is: current + int id = (itI != j.end() && itI->is_number_integer()) ? itI->get() : -1; // default is: current result = eop.test__interact(response, it->get(), id); } @@ -465,10 +477,10 @@ bool MyHandler::doPOST(const std::string &uri, const nlohmann::json &j, std::str } else if (opType == "/test-reset") { auto it = j.find("type"); - if (it != j.end()) { + if (it != j.end() && it->is_string()) { auto itI = j.find("id"); - int id = (itI != j.end()) ? itI->get() : -2; // default is: apply to all the tests + int id = (itI != j.end() && itI->is_number_integer()) ? itI->get() : -2; // default is: apply to all the tests if ((*it == "soft") || (*it == "hard")) { result = eop.test__reset(response, (*it == "soft"), id); @@ -481,14 +493,14 @@ bool MyHandler::doPOST(const std::string &uri, const nlohmann::json &j, std::str } else if (opType == "/test-repeats") { auto it = j.find("amount"); - if (it != j.end()) + if (it != j.end() && it->is_number_integer()) result = eop.test__repeats(response, it->get()); else response += "missing 'amount' integer field"; } else if (opType == "/test-auto-reset") { auto it = j.find("type"); - if (it != j.end()) { + if (it != j.end() && it->is_string()) { if ((*it == "soft") || (*it == "hard")) { result = eop.test__auto_reset(response, (*it == "soft")); @@ -510,8 +522,10 @@ bool MyHandler::doPOST(const std::string &uri, const nlohmann::json &j, std::str } else if (opType == "/test-junit") { auto it = j.find("targetFile"); - std::string targetFile = (it != j.end()) ? *it : ""; // default is: get junit on response instead dumping on file - result = eop.test__junit(response, targetFile); + if (it != j.end() && it->is_string()) + result = eop.test__junit(response, *it); + else + response += "missing 'targetFile' string field"; } else if (opType == "/test-summary-counts") { result = eop.test__summary_counts(response); @@ -524,10 +538,10 @@ bool MyHandler::doPOST(const std::string &uri, const nlohmann::json &j, std::str } else if (opType == "/test-report") { auto it = j.find("state"); - std::string state = (it != j.end()) ? *it : "all"; // initialized|in-progress|failed|success|[all]|none + std::string state = (it != j.end() && it->is_string()) ? *it : "all"; // initialized|in-progress|failed|success|[all]|none auto itA = j.find("action"); - std::string action = (itA != j.end()) ? *itA : "enable"; // default is: enable + std::string action = (itA != j.end() && itA->is_string()) ? *itA : "enable"; // default is: enable if ((action == "enable") || (action == "disable")) { result = eop.test__report(response, state, (action == "enable")); @@ -538,7 +552,7 @@ bool MyHandler::doPOST(const std::string &uri, const nlohmann::json &j, std::str else if ((opType == "/test-report-hex")||(opType == "/test-dump_stdout")) { auto itA = j.find("action"); - std::string action = (itA != j.end()) ? *itA : "enable"; // default is: enable + std::string action = (itA != j.end() && itA->is_string()) ? *itA : "enable"; // default is: enable if ((action == "enable") || (action == "disable")) { bool enable = (action == "enable");