From 3a291f5c8e7a23ec2eb7a088a98da47e665bb491 Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Thu, 2 Apr 2015 10:34:40 +0200 Subject: [PATCH] fix escaping of double quote in JSON response, fixes #1410 and also adds a unit test for that case. --- unit_tests/algorithms/string_util.cpp | 19 ++++++++++++------- util/string_util.hpp | 9 ++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/unit_tests/algorithms/string_util.cpp b/unit_tests/algorithms/string_util.cpp index 285b18a44..865ddd5a2 100644 --- a/unit_tests/algorithms/string_util.cpp +++ b/unit_tests/algorithms/string_util.cpp @@ -36,9 +36,9 @@ BOOST_AUTO_TEST_SUITE(string_util) BOOST_AUTO_TEST_CASE(replace_all_test) { - std::string input {"ababababababa"}; - const std::string sub {"a"}; - const std::string other {"c"}; + std::string input{"ababababababa"}; + const std::string sub{"a"}; + const std::string other{"c"}; replaceAll(input, sub, other); BOOST_CHECK_EQUAL(input, "cbcbcbcbcbcbc"); @@ -46,15 +46,19 @@ BOOST_AUTO_TEST_CASE(replace_all_test) BOOST_AUTO_TEST_CASE(json_escaping) { - const std::string input {"\b\\"}; - const std::string output { escape_JSON(input) }; + std::string input{"\b\\"}; + std::string output{escape_JSON(input)}; BOOST_CHECK_EQUAL(output, "\\b\\\\"); + + input = "Aleja \"Solidarnosci\""; + output = escape_JSON(input); + BOOST_CHECK_EQUAL(output, "Aleja \\\"Solidarnosci\\\""); } BOOST_AUTO_TEST_CASE(print_int) { - const std::string input {"\b\\"}; + const std::string input{"\b\\"}; char buffer[12]; buffer[11] = 0; // zero termination std::string output = printInt<11, 8>(buffer, 314158976); @@ -65,6 +69,7 @@ BOOST_AUTO_TEST_CASE(print_int) BOOST_CHECK_EQUAL(output, "0.00000000"); output = printInt<11, 8>(buffer, -314158976); - BOOST_CHECK_EQUAL(output, "-3.14158976");} + BOOST_CHECK_EQUAL(output, "-3.14158976"); +} BOOST_AUTO_TEST_SUITE_END() diff --git a/util/string_util.hpp b/util/string_util.hpp index cb67fa9db..3bfce0032 100644 --- a/util/string_util.hpp +++ b/util/string_util.hpp @@ -44,7 +44,8 @@ template static inline char *printInt(char *buffer, static_assert(length > 0, "length must be positive"); static_assert(precision > 0, "precision must be positive"); - const bool minus = [&value]{ + const bool minus = [&value] + { if (value >= 0) { value = -value; @@ -89,12 +90,6 @@ inline void replaceAll(std::string &s, const std::string &sub, const std::string inline std::string escape_JSON(const std::string &input) { - // return the input if no backslash can be found -> no allocations - if (input.find_first_of('\\') == std::string::npos) - { - return input; - } - // escape and skip reallocations if possible std::string output; output.reserve(input.size() + 4); // +4 assumes two backslashes on avg