diff --git a/lib/http/HttpResponseDecoder.cpp b/lib/http/HttpResponseDecoder.cpp index 9e3fd786a..11e9d4096 100644 --- a/lib/http/HttpResponseDecoder.cpp +++ b/lib/http/HttpResponseDecoder.cpp @@ -169,72 +169,82 @@ namespace MAT_NS_BEGIN { { #ifdef HAVE_MAT_JSONHPP // TODO: [MG] - parse HTTP response without json.hpp library - nlohmann::json responseBody; - try + auto bodyBegin = response.GetBody().begin(); + auto bodyEnd = response.GetBody().end(); + + // Handle empty body + if (bodyBegin == bodyEnd) + { + LOG_ERROR("HTTP response: body is empty, skipping processing"); + return; + } + + // Parse JSON with exceptions disabled (pass iterators directly to avoid copy) + nlohmann::json responseBody = nlohmann::json::parse(bodyBegin, bodyEnd, nullptr, false); + + // Check if parsing failed (returns discarded value for invalid JSON) + if (responseBody.is_discarded()) + { + LOG_ERROR("HTTP response: body is not valid JSON, skipping processing"); + return; + } + + int accepted = 0; + auto acc = responseBody.find("acc"); + if (responseBody.end() != acc) { - std::string body(response.GetBody().begin(), response.GetBody().end()); - responseBody = nlohmann::json::parse(body.c_str()); - int accepted = 0; - auto acc = responseBody.find("acc"); - if (responseBody.end() != acc) + if (acc.value().is_number()) { - if (acc.value().is_number()) - { - accepted = acc.value().get(); - } + accepted = acc.value().get(); } + } - int rejected = 0; - auto rej = responseBody.find("rej"); - if (responseBody.end() != rej) + int rejected = 0; + auto rej = responseBody.find("rej"); + if (responseBody.end() != rej) + { + if (rej.value().is_number()) { - if (rej.value().is_number()) - { - rejected = rej.value().get(); - } + rejected = rej.value().get(); } + } - auto efi = responseBody.find("efi"); - if (responseBody.end() != efi) + auto efi = responseBody.find("efi"); + if (responseBody.end() != efi) + { + for (auto it = responseBody["efi"].begin(); it != responseBody["efi"].end(); ++it) { - for (auto it = responseBody["efi"].begin(); it != responseBody["efi"].end(); ++it) + std::string efiKey(it.key()); + nlohmann::json val = it.value(); + if (val.is_array()) { - std::string efiKey(it.key()); - nlohmann::json val = it.value(); - if (val.is_array()) - { - //std::vector failureVector = val.get>(); - // eventsRejected(ctx); with only the ids in the vector above - } - if (val.is_string()) + //std::vector failureVector = val.get>(); + // eventsRejected(ctx); with only the ids in the vector above + } + if (val.is_string()) + { + if ("all" == val.get()) { - if ("all" == val.get()) - { - result = Rejected; - } + result = Rejected; } } } + } - auto ticket = responseBody.find("TokenCrackingFailure"); - if (responseBody.end() != ticket) - { - DebugEvent evt; - evt.type = DebugEventType::EVT_TICKET_EXPIRED; - DispatchEvent(evt); - } - - if (result != Rejected) - { - LOG_TRACE("HTTP response: accepted=%d rejected=%d", accepted, rejected); - } else - { - LOG_TRACE("HTTP response: all rejected"); - } + auto ticket = responseBody.find("TokenCrackingFailure"); + if (responseBody.end() != ticket) + { + DebugEvent evt; + evt.type = DebugEventType::EVT_TICKET_EXPIRED; + DispatchEvent(evt); } - catch (...) + + if (result != Rejected) + { + LOG_TRACE("HTTP response: accepted=%d rejected=%d", accepted, rejected); + } else { - LOG_ERROR("HTTP response: JSON parsing failed"); + LOG_TRACE("HTTP response: all rejected"); } #else UNREFERENCED_PARAMETER(response);