Skip to content

Commit 534a3cf

Browse files
committed
JsonVisitor: escape string values
1 parent 9d55a3c commit 534a3cf

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

JsonVisitor.cpp

+24-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,29 @@ namespace graphql {
1616
namespace ast {
1717
namespace visitor {
1818

19+
static std::string escape(const char *s) {
20+
static char hex[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
21+
std::string result;
22+
while (unsigned char ch = *s++) {
23+
if (ch >= '\0' && ch <= '\x1f') {
24+
result.push_back('\\');
25+
result.push_back('u');
26+
result.push_back('0');
27+
result.push_back('0');
28+
result.push_back(ch >= 16 ? '1' : '0');
29+
result.push_back(hex[ch % 16]);
30+
} else if (ch == '"') {
31+
result.push_back('\\');
32+
result.push_back('"');
33+
} else if (ch == '\\') {
34+
result.push_back('\\');
35+
result.push_back('\\');
36+
} else {
37+
result.push_back(ch);
38+
}
39+
}
40+
return result;
41+
}
1942

2043
JsonVisitor::NodeFieldPrinter::NodeFieldPrinter(
2144
JsonVisitor &visitor,
@@ -54,7 +77,7 @@ void JsonVisitor::NodeFieldPrinter::printSingularPrimitiveField(
5477
const char *value) {
5578
printFieldSeparator();
5679
out_ << '"' << fieldName << R"(":)";
57-
out_ << '"' << value << '"';
80+
out_ << '"' << escape(value) << '"';
5881
}
5982

6083
void JsonVisitor::NodeFieldPrinter::printSingularBooleanField(

0 commit comments

Comments
 (0)