From 32d4c1eb07bcb57abd2f83c9bc94c35454d34002 Mon Sep 17 00:00:00 2001 From: Alex Fabijanic Date: Thu, 10 Jul 2014 21:00:59 -0500 Subject: [PATCH] GH #482: Poco::JSON::Stringifier::stringify bad behaviour --- JSON/src/Stringifier.cpp | 13 ++++++++++--- JSON/testsuite/src/JSONTest.cpp | 19 ++++++++++++++++++- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/JSON/src/Stringifier.cpp b/JSON/src/Stringifier.cpp index d50323896..f908bee91 100644 --- a/JSON/src/Stringifier.cpp +++ b/JSON/src/Stringifier.cpp @@ -73,11 +73,18 @@ void Stringifier::formatString(const std::string& value, std::ostream& out) for (std::string::const_iterator it = value.begin(), end = value.end(); it != end; ++it) { - if (*it <= 0x1F || *it == '"' || *it == '\\' || *it == '/') + switch (*it) { - out << '\\'; + case '\\': out << "\\\\"; break; + case '"': out << "\\\""; break; + case '/': out << "\\/"; break; + case '\b': out << "\\b"; break; + case '\f': out << "\\f"; break; + case '\n': out << "\\n"; break; + case '\r': out << "\\r"; break; + case '\t': out << "\\t"; break; + default: out << *it; break; } - out << *it; } out << '"'; } diff --git a/JSON/testsuite/src/JSONTest.cpp b/JSON/testsuite/src/JSONTest.cpp index 233f75dff..3bc53678d 100644 --- a/JSON/testsuite/src/JSONTest.cpp +++ b/JSON/testsuite/src/JSONTest.cpp @@ -1223,15 +1223,32 @@ void JSONTest::testPrintHandler() void JSONTest::testStringify() { + std::string str1 = "\r"; + std::string str2 = "\n"; + Poco::JSON::Object obj1, obj2; + obj1.set("payload", str1); + obj2.set("payload", str2); + std::ostringstream oss1, oss2; + Poco::JSON::Stringifier::stringify(obj1, oss1); + Poco::JSON::Stringifier::stringify(obj2, oss2); + assert(oss1.str() == "{\"payload\":\"\\\r\"}"); + std::cout << "\"" << oss1.str() << "\"" << std::endl; + assert(oss2.str() == "{\"payload\":\"\\\n\"}"); + Object jObj(false); jObj.set("foo\\", 0); jObj.set("bar/", 0); jObj.set("baz", 0); jObj.set("q\"uote\"d", 0); + jObj.set("backspace", "bs\b"); + jObj.set("newline", "nl\n"); + jObj.set("tab", "tb\t"); + std::stringstream ss; jObj.stringify(ss); - assert(ss.str() == "{\"bar\\/\":0,\"baz\":0,\"foo\\\\\":0,\"q\\\"uote\\\"d\":0}"); + assert(ss.str() == "{\"backspace\":\"bs\\\b\",\"bar\\/\":0,\"baz\":0,\"foo\\\\\":0," + "\"newline\":\"nl\\\n\",\"q\\\"uote\\\"d\":0,\"tab\":\"tb\\\t\"}"); std::string json = "{ \"Simpsons\" : { \"husband\" : { \"name\" : \"Homer\" , \"age\" : 38 }, \"wife\" : { \"name\" : \"Marge\", \"age\" : 36 }, " "\"children\" : [ \"Bart\", \"Lisa\", \"Maggie\" ], "