diff --git a/launcher/Json.cpp b/launcher/Json.cpp index 7c6d82325..688f9dae7 100644 --- a/launcher/Json.cpp +++ b/launcher/Json.cpp @@ -101,12 +101,16 @@ QJsonArray requireArray(const QJsonDocument& doc, const QString& what) return doc.array(); } -QJsonDocument parseUntilMalformed(const QByteArray& json, QJsonParseError* error) +QJsonDocument parseUntilGarbage(const QByteArray& json, QJsonParseError* error, QString* garbage) { auto doc = QJsonDocument::fromJson(json, error); - if (error->error != QJsonParseError::NoError) { - QByteArray validJson = json.left(error->offset); + 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; diff --git a/launcher/Json.h b/launcher/Json.h index 35a5b655b..7a50af167 100644 --- a/launcher/Json.h +++ b/launcher/Json.h @@ -107,8 +107,8 @@ QJsonArray toJsonArray(const QList& container) ////////////////// READING //////////////////// -// Attempt to parse JSON up until unexpected data is encountered -QJsonDocument parseUntilMalformed(const QByteArray& json, QJsonParseError* error = nullptr); +// Attempt to parse JSON up until garbage is encountered +QJsonDocument parseUntilGarbage(const QByteArray& json, QJsonParseError* error = nullptr, QString* garbage = nullptr); /// @throw JsonException template diff --git a/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp b/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp index 345db807b..60f836b4d 100644 --- a/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp @@ -169,7 +169,7 @@ bool processZIP(DataPack* pack, ProcessingLevel level) bool processMCMeta(DataPack* pack, QByteArray&& raw_data) { QJsonParseError parse_error; - auto json_doc = Json::parseUntilMalformed(raw_data, &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; diff --git a/launcher/ui/pages/instance/McClient.cpp b/launcher/ui/pages/instance/McClient.cpp index f91194dfe..25c167122 100644 --- a/launcher/ui/pages/instance/McClient.cpp +++ b/launcher/ui/pages/instance/McClient.cpp @@ -81,7 +81,7 @@ void McClient::parseResponse() // 'resp' should now be the JSON string QJsonParseError parseError; - QJsonDocument doc = Json::parseUntilMalformed(m_resp, &parseError); + QJsonDocument doc = Json::parseUntilGarbage(m_resp, &parseError); if (parseError.error != QJsonParseError::NoError) { qDebug() << "Failed to parse JSON:" << parseError.errorString(); emitFail(parseError.errorString());