From: Christian Kamm Date: Fri, 21 Jun 2019 13:29:42 +0000 (+0200) Subject: RequestEtagJob: Consistently parse etags #7271 X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~21^2~468^2~225 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=0e9f030b0f9fe4f8c82595e7dd3a0fbb7742ad42;p=nextcloud-desktop.git RequestEtagJob: Consistently parse etags #7271 Previously RequestEtagJob did return the etag verbatim (including extra quotes) while the db had the parsed form. That caused the etag comparison during discovery move detection to always fail. The test didn't catch it because the etags there didn't have quotes. Now: - RequestEtagJob will parse the etag, leading to a consistent format - Tests have etags with quotes, detecting the problem --- 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"));