diff options
-rw-r--r-- | include/tgbot/tools/StringTools.h | 9 | ||||
-rw-r--r-- | src/Api.cpp | 4 | ||||
-rw-r--r-- | src/tools/StringTools.cpp | 18 |
3 files changed, 29 insertions, 2 deletions
diff --git a/include/tgbot/tools/StringTools.h b/include/tgbot/tools/StringTools.h index fa3a2f5..a833fc2 100644 --- a/include/tgbot/tools/StringTools.h +++ b/include/tgbot/tools/StringTools.h @@ -63,6 +63,15 @@ TGBOT_API std::string urlDecode(const std::string& value); /** + * Escapes a string with illegal characters ("\/) for json + * + * @param value input string + * + * @return An encoded string + */ +std::string escapeJsonString(const std::string& value); + +/** * Splits string to smaller substrings which have between them a delimiter. Resulting substrings won't have delimiter. * @param str Source string * @param delimiter Delimiter diff --git a/src/Api.cpp b/src/Api.cpp index ed1f07a..7ceb75e 100644 --- a/src/Api.cpp +++ b/src/Api.cpp @@ -903,7 +903,7 @@ Message::Ptr Api::sendPoll(boost::variant<std::int64_t, const std::string&> chat args.emplace_back("question", question); args.emplace_back("options", _tgTypeParser.parseArray<std::string>( [](const std::string& option)->std::string { - return "\"" + option + "\""; + return "\"" + StringTools::escapeJsonString(option) + "\""; }, options)); if (!isAnonymous) { args.emplace_back("is_anonymous", isAnonymous); @@ -1760,7 +1760,7 @@ std::vector<Sticker::Ptr> Api::getCustomEmojiStickers(const std::vector<std::str args.reserve(1); args.emplace_back("custom_emoji_ids", _tgTypeParser.parseArray<std::string>([] (const std::string& customEmojiId) -> std::string { - return "\"" + customEmojiId + "\""; + return "\"" + StringTools::escapeJsonString(customEmojiId) + "\""; }, customEmojiIds)); return _tgTypeParser.parseJsonAndGetArray<Sticker>(&TgTypeParser::parseJsonAndGetSticker, sendRequest("getCustomEmojiStickers", args)); diff --git a/src/tools/StringTools.cpp b/src/tools/StringTools.cpp index 653047c..3e5e6c4 100644 --- a/src/tools/StringTools.cpp +++ b/src/tools/StringTools.cpp @@ -101,4 +101,22 @@ string urlDecode(const string& value) { return result; } +std::string escapeJsonString(const std::string& value) { + string result; + + for (const char& c : value) { + switch (c) { + case '"': + case '\\': + case '/': + result += '\\'; + break; + } + + result += c; + } + + return result; +} + } |