disable utf-8 escaping in json.stringify by default & add utfEscape argument to json.stringify & update network.post behaviour for pre-serialized data
This commit is contained in:
parent
fb4fa2f042
commit
a0b0c0a9f0
@ -41,7 +41,8 @@ void stringifyObj(
|
|||||||
std::stringstream& ss,
|
std::stringstream& ss,
|
||||||
int indent,
|
int indent,
|
||||||
const std::string& indentstr,
|
const std::string& indentstr,
|
||||||
bool nice
|
bool nice,
|
||||||
|
bool escapeUtf8
|
||||||
);
|
);
|
||||||
|
|
||||||
void stringifyList(
|
void stringifyList(
|
||||||
@ -49,7 +50,8 @@ void stringifyList(
|
|||||||
std::stringstream& ss,
|
std::stringstream& ss,
|
||||||
int indent,
|
int indent,
|
||||||
const std::string& indentstr,
|
const std::string& indentstr,
|
||||||
bool nice
|
bool nice,
|
||||||
|
bool escapeUtf8
|
||||||
);
|
);
|
||||||
|
|
||||||
void stringifyValue(
|
void stringifyValue(
|
||||||
@ -57,16 +59,17 @@ void stringifyValue(
|
|||||||
std::stringstream& ss,
|
std::stringstream& ss,
|
||||||
int indent,
|
int indent,
|
||||||
const std::string& indentstr,
|
const std::string& indentstr,
|
||||||
bool nice
|
bool nice,
|
||||||
|
bool escapeUtf8
|
||||||
) {
|
) {
|
||||||
using dv::value_type;
|
using dv::value_type;
|
||||||
|
|
||||||
switch (value.getType()) {
|
switch (value.getType()) {
|
||||||
case value_type::object:
|
case value_type::object:
|
||||||
stringifyObj(value, ss, indent, indentstr, nice);
|
stringifyObj(value, ss, indent, indentstr, nice, escapeUtf8);
|
||||||
break;
|
break;
|
||||||
case value_type::list:
|
case value_type::list:
|
||||||
stringifyList(value, ss, indent, indentstr, nice);
|
stringifyList(value, ss, indent, indentstr, nice, escapeUtf8);
|
||||||
break;
|
break;
|
||||||
case value_type::bytes: {
|
case value_type::bytes: {
|
||||||
const auto& bytes = value.asBytes();
|
const auto& bytes = value.asBytes();
|
||||||
@ -75,7 +78,7 @@ void stringifyValue(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case value_type::string:
|
case value_type::string:
|
||||||
ss << util::escape(value.asString(), !nice);
|
ss << util::escape(value.asString(), escapeUtf8);
|
||||||
break;
|
break;
|
||||||
case value_type::number:
|
case value_type::number:
|
||||||
ss << std::setprecision(15) << value.asNumber();
|
ss << std::setprecision(15) << value.asNumber();
|
||||||
@ -97,7 +100,8 @@ void stringifyList(
|
|||||||
std::stringstream& ss,
|
std::stringstream& ss,
|
||||||
int indent,
|
int indent,
|
||||||
const std::string& indentstr,
|
const std::string& indentstr,
|
||||||
bool nice
|
bool nice,
|
||||||
|
bool escapeUtf8
|
||||||
) {
|
) {
|
||||||
if (list.empty()) {
|
if (list.empty()) {
|
||||||
ss << "[]";
|
ss << "[]";
|
||||||
@ -109,7 +113,7 @@ void stringifyList(
|
|||||||
newline(ss, nice, indent, indentstr);
|
newline(ss, nice, indent, indentstr);
|
||||||
}
|
}
|
||||||
const auto& value = list[i];
|
const auto& value = list[i];
|
||||||
stringifyValue(value, ss, indent + 1, indentstr, nice);
|
stringifyValue(value, ss, indent + 1, indentstr, nice, escapeUtf8);
|
||||||
if (i + 1 < list.size()) {
|
if (i + 1 < list.size()) {
|
||||||
ss << ',';
|
ss << ',';
|
||||||
}
|
}
|
||||||
@ -125,7 +129,8 @@ void stringifyObj(
|
|||||||
std::stringstream& ss,
|
std::stringstream& ss,
|
||||||
int indent,
|
int indent,
|
||||||
const std::string& indentstr,
|
const std::string& indentstr,
|
||||||
bool nice
|
bool nice,
|
||||||
|
bool escapeUtf8
|
||||||
) {
|
) {
|
||||||
if (obj.empty()) {
|
if (obj.empty()) {
|
||||||
ss << "{}";
|
ss << "{}";
|
||||||
@ -138,7 +143,7 @@ void stringifyObj(
|
|||||||
newline(ss, nice, indent, indentstr);
|
newline(ss, nice, indent, indentstr);
|
||||||
}
|
}
|
||||||
ss << util::escape(key) << ": ";
|
ss << util::escape(key) << ": ";
|
||||||
stringifyValue(value, ss, indent + 1, indentstr, nice);
|
stringifyValue(value, ss, indent + 1, indentstr, nice, escapeUtf8);
|
||||||
index++;
|
index++;
|
||||||
if (index < obj.size()) {
|
if (index < obj.size()) {
|
||||||
ss << ',';
|
ss << ',';
|
||||||
@ -151,10 +156,13 @@ void stringifyObj(
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string json::stringify(
|
std::string json::stringify(
|
||||||
const dv::value& value, bool nice, const std::string& indent
|
const dv::value& value,
|
||||||
|
bool nice,
|
||||||
|
const std::string& indent,
|
||||||
|
bool escapeUtf8
|
||||||
) {
|
) {
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
stringifyValue(value, ss, 1, indent, nice);
|
stringifyValue(value, ss, 1, indent, nice, escapeUtf8);
|
||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,9 @@ namespace json {
|
|||||||
dv::value parse(std::string_view source);
|
dv::value parse(std::string_view source);
|
||||||
|
|
||||||
std::string stringify(
|
std::string stringify(
|
||||||
const dv::value& value, bool nice, const std::string& indent=" "
|
const dv::value& value,
|
||||||
|
bool nice,
|
||||||
|
const std::string& indent = " ",
|
||||||
|
bool escapeUtf8 = false
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -178,7 +178,7 @@ void EngineController::onMissingContent(const std::shared_ptr<ContentReport>& re
|
|||||||
if (engine.isHeadless()) {
|
if (engine.isHeadless()) {
|
||||||
throw std::runtime_error(
|
throw std::runtime_error(
|
||||||
"missing content: " +
|
"missing content: " +
|
||||||
json::stringify(create_missing_content_report(report), true)
|
json::stringify(create_missing_content_report(report), true, " ")
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
engine.setScreen(std::make_shared<MenuScreen>(engine));
|
engine.setScreen(std::make_shared<MenuScreen>(engine));
|
||||||
|
|||||||
@ -5,7 +5,8 @@ static int l_json_stringify(lua::State* L) {
|
|||||||
auto value = lua::tovalue(L, 1);
|
auto value = lua::tovalue(L, 1);
|
||||||
|
|
||||||
bool nice = lua::toboolean(L, 2);
|
bool nice = lua::toboolean(L, 2);
|
||||||
auto string = json::stringify(value, nice, " ");
|
bool escapeUTF = lua::toboolean(L, 3);
|
||||||
|
auto string = json::stringify(value, nice, " ", escapeUTF);
|
||||||
return lua::pushstring(L, string);
|
return lua::pushstring(L, string);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -44,7 +44,12 @@ static int l_post(lua::State* L) {
|
|||||||
lua::pushvalue(L, 3);
|
lua::pushvalue(L, 3);
|
||||||
auto onResponse = lua::create_lambda_nothrow(L);
|
auto onResponse = lua::create_lambda_nothrow(L);
|
||||||
|
|
||||||
auto string = json::stringify(data, false);
|
std::string string;
|
||||||
|
if (data.isString()) {
|
||||||
|
string = data.asString();
|
||||||
|
} else {
|
||||||
|
string = json::stringify(data, false);
|
||||||
|
}
|
||||||
engine->getNetwork().post(url, string, [onResponse](std::vector<char> bytes) {
|
engine->getNetwork().post(url, string, [onResponse](std::vector<char> bytes) {
|
||||||
auto buffer = std::make_shared<util::Buffer<ubyte>>(
|
auto buffer = std::make_shared<util::Buffer<ubyte>>(
|
||||||
reinterpret_cast<const ubyte*>(bytes.data()), bytes.size()
|
reinterpret_cast<const ubyte*>(bytes.data()), bytes.size()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user