diff options
author | Julian Andres Klode <julian.klode@canonical.com> | 2021-04-21 11:31:46 +0200 |
---|---|---|
committer | Julian Andres Klode <julian.klode@canonical.com> | 2021-04-23 12:25:40 +0200 |
commit | 57b727af4e1eea4ea118ca5e5028fa7ce86fb538 (patch) | |
tree | 0fd94bd98726e2af3ea3b1f1a703e8e886b61eb2 /apt-private/private-json-hooks.cc | |
parent | 6cb80d1eb2e8abcd4246fe39af3d1cd0398e1188 (diff) |
json: Escape strings using \u escape sequences, add test
This allows us to correctly encode strings containing quotation
marks, escape characters and control characters.
The test case is a bit nasty because it embeds private-cachefile.cc
for linkage reasons.
Diffstat (limited to 'apt-private/private-json-hooks.cc')
-rw-r--r-- | apt-private/private-json-hooks.cc | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/apt-private/private-json-hooks.cc b/apt-private/private-json-hooks.cc index 0b765a4ed..b61829cbf 100644 --- a/apt-private/private-json-hooks.cc +++ b/apt-private/private-json-hooks.cc @@ -12,6 +12,7 @@ #include <apt-pkg/strutl.h> #include <apt-private/private-json-hooks.h> +#include <iomanip> #include <ostream> #include <sstream> #include <stack> @@ -23,7 +24,7 @@ /** * @brief Simple JSON writer * - * This performs no error checking, or string escaping, be careful. + * This performs no error checking, so be careful. */ class APT_HIDDEN JsonWriter { @@ -109,22 +110,37 @@ class APT_HIDDEN JsonWriter os << '}'; return *this; } + std::ostream &encodeString(std::ostream &out, std::string const &str) + { + out << '"'; + + for (std::string::const_iterator c = str.begin(); c != str.end(); c++) + { + if (*c <= 0x1F || *c == '"' || *c == '\\') + ioprintf(out, "\\u%04X", *c); + else + out << *c; + } + + out << '"'; + return out; + } JsonWriter &name(std::string const &name) { maybeComma(); - os << '"' << name << '"' << ':'; + encodeString(os, name) << ':'; return *this; } JsonWriter &value(std::string const &value) { maybeComma(); - os << '"' << value << '"'; + encodeString(os, value); return *this; } JsonWriter &value(const char *value) { maybeComma(); - os << '"' << value << '"'; + encodeString(os, value); return *this; } JsonWriter &value(int value) |