diff --git a/src/libsync/networkjobs.cpp b/src/libsync/networkjobs.cpp index fc953c3cb..155139baa 100644 --- a/src/libsync/networkjobs.cpp +++ b/src/libsync/networkjobs.cpp @@ -56,6 +56,25 @@ Q_LOGGING_CATEGORY(lcJsonApiJob, "nextcloud.sync.networkjob.jsonapi", QtInfoMsg) Q_LOGGING_CATEGORY(lcDetermineAuthTypeJob, "nextcloud.sync.networkjob.determineauthtype", QtInfoMsg) const int notModifiedStatusCode = 304; +QByteArray parseEtag(const char *header) +{ + if (!header) + return QByteArray(); + QByteArray arr = header; + + // Weak E-Tags can appear when gzip compression is on, see #3946 + if (arr.startsWith("W/")) + arr = arr.mid(2); + + // https://github.com/owncloud/client/issues/1195 + arr.replace("-gzip", ""); + + if (arr.length() >= 2 && arr.startsWith('"') && arr.endsWith('"')) { + arr = arr.mid(1, arr.length() - 2); + } + return arr; +} + RequestEtagJob::RequestEtagJob(AccountPtr account, const QString &path, QObject *parent) : AbstractNetworkJob(account, path, parent) { @@ -100,7 +119,13 @@ bool RequestEtagJob::finished() if (type == QXmlStreamReader::StartElement && reader.namespaceUri() == QLatin1String("DAV:")) { QString name = reader.name().toString(); if (name == QLatin1String("getetag")) { - etag += reader.readElementText(); + auto etagText = reader.readElementText(); + auto parsedTag = parseEtag(etagText.toUtf8()); + if (!parsedTag.isEmpty()) { + etag += QString::fromUtf8(parsedTag); + } else { + etag += etagText; + } } } } diff --git a/src/libsync/networkjobs.h b/src/libsync/networkjobs.h index a29365c3a..1aeaddcf7 100644 --- a/src/libsync/networkjobs.h +++ b/src/libsync/networkjobs.h @@ -29,6 +29,9 @@ class QJsonObject; namespace OCC { +/** Strips quotes and gzip annotations */ +QByteArray parseEtag(const char *header); + struct HttpError { int code; // HTTP error code diff --git a/src/libsync/owncloudpropagator_p.h b/src/libsync/owncloudpropagator_p.h index 042ec545e..6b4ad3748 100644 --- a/src/libsync/owncloudpropagator_p.h +++ b/src/libsync/owncloudpropagator_p.h @@ -17,30 +17,12 @@ #include "owncloudpropagator.h" #include "syncfileitem.h" +#include "networkjobs.h" #include #include namespace OCC { -inline QByteArray parseEtag(const char *header) -{ - if (!header) - return QByteArray(); - QByteArray arr = header; - - // Weak E-Tags can appear when gzip compression is on, see #3946 - if (arr.startsWith("W/")) - arr = arr.mid(2); - - // https://github.com/owncloud/client/issues/1195 - arr.replace("-gzip", ""); - - if (arr.length() >= 2 && arr.startsWith('"') && arr.endsWith('"')) { - arr = arr.mid(1, arr.length() - 2); - } - return arr; -} - inline QByteArray getEtagFromReply(QNetworkReply *reply) { QByteArray ocEtag = parseEtag(reply->rawHeader("OC-ETag")); diff --git a/test/syncenginetestutils.h b/test/syncenginetestutils.h index f559e1635..8f349adc8 100644 --- a/test/syncenginetestutils.h +++ b/test/syncenginetestutils.h @@ -369,7 +369,7 @@ public: auto stringDate = QLocale::c().toString(gmtDate, "ddd, dd MMM yyyy HH:mm:ss 'GMT'"); xml.writeTextElement(davUri, QStringLiteral("getlastmodified"), stringDate); xml.writeTextElement(davUri, QStringLiteral("getcontentlength"), QString::number(fileInfo.size)); - xml.writeTextElement(davUri, QStringLiteral("getetag"), fileInfo.etag); + xml.writeTextElement(davUri, QStringLiteral("getetag"), QStringLiteral("\"%1\"").arg(fileInfo.etag)); xml.writeTextElement(ocUri, QStringLiteral("permissions"), !fileInfo.permissions.isNull() ? QString(fileInfo.permissions.toString()) : fileInfo.isShared ? QStringLiteral("SRDNVCKW") : QStringLiteral("RDNVCKW"));