//SPDX-FileCopyrightText: 2023 Yury Gubich //SPDX-License-Identifier: GPL-3.0-or-later #include "formdecode.h" #include std::map urlDecodeAndParse(const std::string_view& encoded) { std::map result; std::istringstream iss(std::string(encoded.begin(), encoded.end())); std::string pair; while (std::getline(iss, pair, '&')) { size_t equalsPos = pair.find('='); if (equalsPos != std::string::npos) result.emplace( urlDecode(pair.substr(0, equalsPos)), urlDecode(pair.substr(equalsPos + 1)) ); } return result; } std::string urlDecode(const std::string_view& encoded) { std::ostringstream decoded; for (size_t i = 0; i < encoded.length(); ++i) { if (encoded[i] == '%') { if (i + 2 < encoded.length()) { std::string hexStr(encoded.substr(i + 1, 2)); char hexValue = static_cast(std::stoul(hexStr, nullptr, 16)); decoded.put(hexValue); i += 2; } else { decoded.put(encoded[i]); } } else if (encoded[i] == '+') { decoded.put(' '); } else { decoded.put(encoded[i]); } } return decoded.str(); }