diff --git a/src/MeoAssistant/AsstHttp.hpp b/src/MeoAssistant/AsstHttp.hpp index f006eadb53..978506d4aa 100644 --- a/src/MeoAssistant/AsstHttp.hpp +++ b/src/MeoAssistant/AsstHttp.hpp @@ -1,5 +1,6 @@ #pragma once +#include "AsstRanges.hpp" #include "AsstUtils.hpp" #include @@ -13,7 +14,7 @@ namespace asst::http { private: std::string m_last_error; - size_t m_status_code = 0; + unsigned m_status_code = 0; std::string_view m_protocol_version; std::string_view m_status_code_info; std::string_view m_data; @@ -34,22 +35,14 @@ namespace asst::http m_protocol_version = utils::view_cast(word); } else if (_word_count == 2) { - static const std::unordered_map numbers = { - { '0', 0 }, { '1', 1 }, { '2', 2 }, { '3', 3 }, { '4', 4 }, - { '5', 5 }, { '6', 6 }, { '7', 7 }, { '8', 8 }, { '9', 9 }, - }; if (word.length() != 3) { m_last_error = "status code length is not 3"; return false; } - m_status_code = 0; - for (char num : word) { - if (!numbers.contains(num)) { - m_last_error = "status code is not number"; - return false; - } - m_status_code = m_status_code * 10 + numbers.at(num); + if (!ranges::all_of(word, [](char c) -> bool { return std::isdigit(c); })) { + return false; } + m_status_code = std::atoi(word.data()); } else { m_status_code_info = std::string_view(word.begin(), status_line.end()); @@ -113,13 +106,20 @@ namespace asst::http } } - size_t status_code() const { return m_status_code; } + unsigned status_code() const { return m_status_code; } std::string_view protocol_version() const { return m_protocol_version; } std::string_view status_code_info() const { return m_status_code_info; } std::string_view data() const { return m_data; } - std::string_view at_header(const std::string& key) const { return m_headers.at(key); } - bool contains_header(const std::string& key) const { return m_headers.contains(key); } - const std::unordered_map headers() const { return m_headers; } + std::optional find_header(const std::string& key) const + { + if (auto iter = m_headers.find(key); iter != m_headers.cend()) { + return iter->second; + } + else { + return std::nullopt; + } + } + const auto& headers() const { return m_headers; } const std::string& get_last_error() const noexcept { return m_last_error; } bool success() const { return m_status_code == 200; } diff --git a/src/MeoAssistant/ReportDataTask.cpp b/src/MeoAssistant/ReportDataTask.cpp index 1d5b39027d..200a3d7197 100644 --- a/src/MeoAssistant/ReportDataTask.cpp +++ b/src/MeoAssistant/ReportDataTask.cpp @@ -77,11 +77,12 @@ void asst::ReportDataTask::report_to_penguin() http::Response response = report("ReportToPenguinStats", Resrc.cfg().get_options().penguin_report.cmd_format); - if (response.success() && response.contains_header("x-penguin-set-penguinid")) [[unlikely]] { - json::value id_info = basic_info_with_what("PenguinId"); - std::string penguin_id(response.at_header("x-penguin-set-penguinid")); - id_info["details"]["id"] = penguin_id; - callback(AsstMsg::SubTaskExtraInfo, id_info); + if (response.success()) [[unlikely]] { + if (auto penguinid_opt = response.find_header("x-penguin-set-penguinid")) { + json::value id_info = basic_info_with_what("PenguinId"); + id_info["details"]["id"] = std::string(penguinid_opt.value()); + callback(AsstMsg::SubTaskExtraInfo, id_info); + } } }