Trim unexpected info from pack.mcmeta (#4522)

This commit is contained in:
Alexandru Ionut Tripon
2025-12-18 23:51:15 +02:00
committed by GitHub
4 changed files with 30 additions and 12 deletions

View File

@@ -101,6 +101,21 @@ QJsonArray requireArray(const QJsonDocument& doc, const QString& what)
return doc.array();
}
QJsonDocument parseUntilGarbage(const QByteArray& json, QJsonParseError* error, QString* garbage)
{
auto doc = QJsonDocument::fromJson(json, error);
if (error->error == QJsonParseError::GarbageAtEnd) {
qsizetype offset = error->offset;
QByteArray validJson = json.left(offset);
doc = QJsonDocument::fromJson(validJson, error);
if (garbage)
*garbage = json.right(json.size() - offset);
}
return doc;
}
void writeString(QJsonObject& to, const QString& key, const QString& value)
{
if (!value.isEmpty()) {

View File

@@ -107,6 +107,9 @@ QJsonArray toJsonArray(const QList<T>& container)
////////////////// READING ////////////////////
// Attempt to parse JSON up until garbage is encountered
QJsonDocument parseUntilGarbage(const QByteArray& json, QJsonParseError* error = nullptr, QString* garbage = nullptr);
/// @throw JsonException
template <typename T>
T requireIsType(const QJsonValue& value, const QString& what = "Value");

View File

@@ -168,10 +168,15 @@ bool processZIP(DataPack* pack, ProcessingLevel level)
// https://minecraft.wiki/w/Tutorials/Creating_a_resource_pack#Formatting_pack.mcmeta
bool processMCMeta(DataPack* pack, QByteArray&& raw_data)
{
try {
auto json_doc = QJsonDocument::fromJson(raw_data);
auto pack_obj = Json::requireObject(json_doc.object(), "pack", {});
QJsonParseError parse_error;
auto json_doc = Json::parseUntilGarbage(raw_data, &parse_error);
if (parse_error.error != QJsonParseError::NoError) {
qWarning() << "Failed to parse JSON:" << parse_error.errorString();
return false;
}
try {
auto pack_obj = Json::requireObject(json_doc.object(), "pack", {});
pack->setPackFormat(pack_obj["pack_format"].toInt());
pack->setDescription(DataPackUtils::processComponent(pack_obj.value("description")));
} catch (Json::JsonException& e) {

View File

@@ -81,16 +81,11 @@ void McClient::parseResponse()
// 'resp' should now be the JSON string
QJsonParseError parseError;
QJsonDocument doc = QJsonDocument::fromJson(m_resp, &parseError);
QJsonDocument doc = Json::parseUntilGarbage(m_resp, &parseError);
if (parseError.error != QJsonParseError::NoError) {
QByteArray validJson = m_resp.left(parseError.offset);
doc = QJsonDocument::fromJson(validJson, &parseError);
if (parseError.error != QJsonParseError::NoError) {
qDebug() << "Failed to parse JSON:" << parseError.errorString();
emitFail(parseError.errorString());
return;
}
qDebug() << "Failed to parse JSON:" << parseError.errorString();
emitFail(parseError.errorString());
return;
}
emitSucceed(doc.object());
}