diff --git a/logic/OneSixVersion.cpp b/logic/OneSixVersion.cpp index f7efedf9..51958389 100644 --- a/logic/OneSixVersion.cpp +++ b/logic/OneSixVersion.cpp @@ -136,7 +136,7 @@ std::shared_ptr OneSixVersion::fromJson(QJsonObject root) root.value("minimumLauncherVersion").toDouble(); // ADD MORE HERE :D - if (launcher_ver > 0 && launcher_ver <= 7) + if (launcher_ver > 0 && launcher_ver <= 9) return fromJsonV4(root, readVersion); else { @@ -167,7 +167,8 @@ std::shared_ptr OneSixVersion::fromFile(QString filepath) } QJsonObject root = jsonDoc.object(); auto version = fromJson(root); - version->original_file = filepath; + if(version) + version->original_file = filepath; return version; } diff --git a/logic/lists/ForgeVersionList.cpp b/logic/lists/ForgeVersionList.cpp index 9b698135..491a43d7 100644 --- a/logic/lists/ForgeVersionList.cpp +++ b/logic/lists/ForgeVersionList.cpp @@ -162,6 +162,10 @@ void ForgeListLoadTask::executeTask() auto job = new DownloadJob("Version index"); // we do not care if the version is stale or not. auto forgeListEntry = MMC->metacache()->resolveEntry("minecraftforge", "list.json"); + + // verify by poking the server. + forgeListEntry->stale = true; + job->addCacheDownload(QUrl(JSON_URL), forgeListEntry); listJob.reset(job); connect(listJob.get(), SIGNAL(succeeded()), SLOT(list_downloaded())); diff --git a/logic/net/CacheDownload.cpp b/logic/net/CacheDownload.cpp index 6a76a4ae..309eb345 100644 --- a/logic/net/CacheDownload.cpp +++ b/logic/net/CacheDownload.cpp @@ -33,7 +33,11 @@ void CacheDownload::start() } QLOG_INFO() << "Downloading " << m_url.toString(); QNetworkRequest request(m_url); - request.setRawHeader(QString("If-None-Match").toLatin1(), m_entry->etag.toLatin1()); + if(m_entry->remote_changed_timestamp.size()) + request.setRawHeader(QString("If-Modified-Since").toLatin1(), m_entry->remote_changed_timestamp.toLatin1()); + if(m_entry->etag.size()) + request.setRawHeader(QString("If-None-Match").toLatin1(), m_entry->etag.toLatin1()); + request.setHeader(QNetworkRequest::UserAgentHeader,"MultiMC/5.0 (Cached)"); auto worker = MMC->qnam(); @@ -87,7 +91,11 @@ void CacheDownload::downloadFinished() QFileInfo output_file_info(m_target_path); m_entry->etag = m_reply->rawHeader("ETag").constData(); - m_entry->last_changed_timestamp = + if(m_reply->hasRawHeader("Last-Modified")) + { + m_entry->remote_changed_timestamp = m_reply->rawHeader("Last-Modified").constData(); + } + m_entry->local_changed_timestamp = output_file_info.lastModified().toUTC().toMSecsSinceEpoch(); m_entry->stale = false; MMC->metacache()->updateEntry(m_entry); diff --git a/logic/net/ForgeXzDownload.cpp b/logic/net/ForgeXzDownload.cpp index 3ec2155b..0e5287d8 100644 --- a/logic/net/ForgeXzDownload.cpp +++ b/logic/net/ForgeXzDownload.cpp @@ -269,7 +269,7 @@ void ForgeXzDownload::decompressAndInstall() QFileInfo output_file_info(m_target_path); m_entry->etag = m_reply->rawHeader("ETag").constData(); - m_entry->last_changed_timestamp = + m_entry->local_changed_timestamp = output_file_info.lastModified().toUTC().toMSecsSinceEpoch(); m_entry->stale = false; MMC->metacache()->updateEntry(m_entry); diff --git a/logic/net/HttpMetaCache.cpp b/logic/net/HttpMetaCache.cpp index 9c642a0f..5ba5b98d 100644 --- a/logic/net/HttpMetaCache.cpp +++ b/logic/net/HttpMetaCache.cpp @@ -82,7 +82,7 @@ MetaEntryPtr HttpMetaCache::resolveEntry ( QString base, QString resource_path, // if the file changed, check md5sum qint64 file_last_changed = finfo.lastModified().toUTC().toMSecsSinceEpoch(); - if(file_last_changed != entry->last_changed_timestamp) + if(file_last_changed != entry->local_changed_timestamp) { QFile input(real_path); input.open(QIODevice::ReadOnly); @@ -93,7 +93,7 @@ MetaEntryPtr HttpMetaCache::resolveEntry ( QString base, QString resource_path, return staleEntry(base, resource_path); } // md5sums matched... keep entry and save the new state to file - entry->last_changed_timestamp = file_last_changed; + entry->local_changed_timestamp = file_last_changed; SaveEventually(); } @@ -184,7 +184,8 @@ void HttpMetaCache::Load() QString path = foo->path = element_obj.value("path").toString(); foo->md5sum = element_obj.value("md5sum").toString(); foo->etag = element_obj.value("etag").toString(); - foo->last_changed_timestamp = element_obj.value("last_changed_timestamp").toDouble(); + foo->local_changed_timestamp = element_obj.value("last_changed_timestamp").toDouble(); + foo->remote_changed_timestamp = element_obj.value("remote_changed_timestamp").toString(); // presumed innocent until closer examination foo->stale = false; entrymap.entry_list[path] = MetaEntryPtr( foo ); @@ -215,7 +216,9 @@ void HttpMetaCache::SaveNow() entryObj.insert("path", QJsonValue(entry->path)); entryObj.insert("md5sum", QJsonValue(entry->md5sum)); entryObj.insert("etag", QJsonValue(entry->etag)); - entryObj.insert("last_changed_timestamp", QJsonValue(double(entry->last_changed_timestamp))); + entryObj.insert("last_changed_timestamp", QJsonValue(double(entry->local_changed_timestamp))); + if(!entry->remote_changed_timestamp.isEmpty()) + entryObj.insert("remote_changed_timestamp", QJsonValue(entry->remote_changed_timestamp)); entriesArr.append(entryObj); } } diff --git a/logic/net/HttpMetaCache.h b/logic/net/HttpMetaCache.h index 8107839e..557d9298 100644 --- a/logic/net/HttpMetaCache.h +++ b/logic/net/HttpMetaCache.h @@ -10,7 +10,8 @@ struct MetaEntry QString path; QString md5sum; QString etag; - qint64 last_changed_timestamp = 0; + qint64 local_changed_timestamp = 0; + QString remote_changed_timestamp; // QString for now, RFC 2822 encoded time bool stale = true; QString getFullPath(); };