From 3c47354e0623c5236b00e626f6de3a26d2d1d073 Mon Sep 17 00:00:00 2001 From: Martchus Date: Sun, 29 Jan 2017 23:10:21 +0100 Subject: [PATCH] Follow redirection when downloading db --- lib/alpm/alpmdatabase.cpp | 30 ++++++++++++++++++++++++++---- lib/alpm/alpmdatabase.h | 2 ++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/lib/alpm/alpmdatabase.cpp b/lib/alpm/alpmdatabase.cpp index 564f3c8..c560fb0 100644 --- a/lib/alpm/alpmdatabase.cpp +++ b/lib/alpm/alpmdatabase.cpp @@ -204,12 +204,16 @@ PackageDetailAvailability AlpmDatabase::requestsRequired(PackageDetail packageDe QNetworkRequest AlpmDatabase::regularDatabaseRequest() { - return QNetworkRequest(QUrl(serverUrls().front() % QChar('/') % name() % QStringLiteral(".db"))); + return QNetworkRequest(m_filesRedirs.isEmpty() + ? (QUrl(serverUrls().front() % QChar('/') % name() % QStringLiteral(".db"))) + : m_regularRedirs.back()); } QNetworkRequest AlpmDatabase::filesDatabaseRequest() { - return QNetworkRequest(QUrl(serverUrls().front() % QChar('/') % name() % QStringLiteral(".files"))); + return QNetworkRequest(m_filesRedirs.isEmpty() + ? (QUrl(serverUrls().front() % QChar('/') % name() % QStringLiteral(".files"))) + : m_filesRedirs.back()); } /*! @@ -266,8 +270,25 @@ void AlpmDatabase::databaseDownloadFinished() auto *reply = static_cast(sender()); reply->deleteLater(); bool filesDatabase = reply->property("filesDatabase").toBool(); + const QString redirTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toString(); QReadLocker locker(lock()); - if(reply->error() == QNetworkReply::NoError) { + switch(reply->error()) { + case QNetworkReply::NoError: { + if(!redirTarget.isEmpty()) { + if((!filesDatabase && m_regularRedirs.contains(redirTarget)) || (filesDatabase && m_filesRedirs.contains(redirTarget))) { + cerr << "Redirection-loop for database file [" << name().toLocal8Bit().data() << "]" << endl; + removeBusyFlag(); + return; + } + + (filesDatabase ? m_filesRedirs : m_regularRedirs) << redirTarget; + cerr << "Redirection target for database file [" << name().toLocal8Bit().data() << "] available: " << redirTarget.toLocal8Bit().data() << endl; + + locker.unlock(); + downloadDatabase(m_downloadTargetDir, filesDatabase); + } + m_filesRedirs.clear(); + QString newDatabasePath; cerr << "Downloaded database file for [" << name().toLocal8Bit().data() << "] successfully." << endl; newDatabasePath = m_downloadTargetDir % QChar('/') % name() % (filesDatabase ? QStringLiteral(".files") : QStringLiteral(".db")); @@ -295,7 +316,7 @@ void AlpmDatabase::databaseDownloadFinished() cerr << "An IO error occured when storing database file for [" << name().toLocal8Bit().data() << "]: Unable to create/write output file." << endl; removeBusyFlag(); } - } else { + } default: cerr << "An error occured when dwonloading database file for [" << name().toLocal8Bit().data() << "]: " << reply->errorString().toLocal8Bit().data() << endl; if(filesDatabase && reply->error() == QNetworkReply::ContentNotFoundError) { cerr << "-> Attempting to download regular database file instead of files database file." << endl; @@ -304,6 +325,7 @@ void AlpmDatabase::databaseDownloadFinished() } else { removeBusyFlag(); } + break; } } diff --git a/lib/alpm/alpmdatabase.h b/lib/alpm/alpmdatabase.h index eb6c00d..a01461c 100644 --- a/lib/alpm/alpmdatabase.h +++ b/lib/alpm/alpmdatabase.h @@ -90,6 +90,8 @@ private: QString m_dbPath; QString m_downloadTargetDir; + QStringList m_regularRedirs; + QStringList m_filesRedirs; }; /*!