diff options
author | Hannah von Reth <hannah.vonreth@owncloud.com> | 2022-02-11 14:39:55 +0300 |
---|---|---|
committer | Hannah von Reth <vonreth@kde.org> | 2022-02-11 18:01:29 +0300 |
commit | ec4e2069ff65e66e1f2246b3216e768351a0d2b6 (patch) | |
tree | 9d3ec666890451eed402c0eb97fef4b586c98adc /src/libsync | |
parent | 908d53c47dccc54dbdf6874e3e00f76575f03dcc (diff) |
Fix connects on replies
Diffstat (limited to 'src/libsync')
-rw-r--r-- | src/libsync/networkjobs.cpp | 32 | ||||
-rw-r--r-- | src/libsync/networkjobs.h | 9 | ||||
-rw-r--r-- | src/libsync/propagateupload.cpp | 27 | ||||
-rw-r--r-- | src/libsync/propagateupload.h | 22 | ||||
-rw-r--r-- | src/libsync/propagateuploadtus.cpp | 10 |
5 files changed, 65 insertions, 35 deletions
diff --git a/src/libsync/networkjobs.cpp b/src/libsync/networkjobs.cpp index 45328e0d7..2a16be727 100644 --- a/src/libsync/networkjobs.cpp +++ b/src/libsync/networkjobs.cpp @@ -431,14 +431,6 @@ void CheckServerJob::start() req.setRawHeader(QByteArrayLiteral("OC-Connection-Validator"), QByteArrayLiteral("desktop")); req.setMaximumRedirectsAllowed(_maxRedirectsAllowed); sendRequest("GET", Utility::concatUrlPath(_serverUrl, path()), req); - connect(reply(), &QNetworkReply::metaDataChanged, this, &CheckServerJob::metaDataChangedSlot); - connect(reply(), &QNetworkReply::encrypted, this, &CheckServerJob::encryptedSlot); - connect(reply(), &QNetworkReply::redirected, this, [this] { - const auto code = reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - if (code == 302 || code == 307) { - _redirectDistinct = false; - } - }); AbstractNetworkJob::start(); } @@ -486,6 +478,18 @@ void CheckServerJob::encryptedSlot() mergeSslConfigurationForSslButton(reply()->sslConfiguration(), account()); } +void CheckServerJob::newReplyHook(QNetworkReply *reply) +{ + connect(reply, &QNetworkReply::metaDataChanged, this, &CheckServerJob::metaDataChangedSlot); + connect(reply, &QNetworkReply::encrypted, this, &CheckServerJob::encryptedSlot); + connect(reply, &QNetworkReply::redirected, this, [reply, this] { + const auto code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + if (code == 302 || code == 307) { + _redirectDistinct = false; + } + }); +} + int CheckServerJob::maxRedirectsAllowed() const { return _maxRedirectsAllowed; @@ -843,6 +847,11 @@ void SimpleNetworkJob::start() AbstractNetworkJob::start(); } +void SimpleNetworkJob::addNewReplyHook(std::function<void(QNetworkReply *)> &&hook) +{ + _replyHooks.push_back(hook); +} + void SimpleNetworkJob::prepareRequest(const QByteArray &verb, const QUrl &url, const QNetworkRequest &req, QIODevice *requestBody) { @@ -878,6 +887,13 @@ bool SimpleNetworkJob::finished() return true; } +void SimpleNetworkJob::newReplyHook(QNetworkReply *reply) +{ + for (const auto &hook : _replyHooks) { + hook(reply); + } +} + void fetchPrivateLinkUrl(AccountPtr account, const QString &remotePath, QObject *target, std::function<void(const QString &url)> targetFun) { diff --git a/src/libsync/networkjobs.h b/src/libsync/networkjobs.h index b9346fd40..7dab57309 100644 --- a/src/libsync/networkjobs.h +++ b/src/libsync/networkjobs.h @@ -283,6 +283,9 @@ private slots: virtual void metaDataChangedSlot(); virtual void encryptedSlot(); +protected: + void newReplyHook(QNetworkReply *) override; + private: bool _subdirFallback; @@ -427,16 +430,22 @@ public: void start() override; + void addNewReplyHook(std::function<void(QNetworkReply *)> &&hook); + signals: void finishedSignal(QNetworkReply *reply); private slots: bool finished() override; +protected: + void newReplyHook(QNetworkReply *) override; + private: QByteArray _simpleVerb; QUrl _simpleUrl; QIODevice *_simpleBody; QNetworkRequest _simpleRequest; + std::vector<std::function<void(QNetworkReply *)>> _replyHooks; }; /** diff --git a/src/libsync/propagateupload.cpp b/src/libsync/propagateupload.cpp index eb147a13c..1793d632a 100644 --- a/src/libsync/propagateupload.cpp +++ b/src/libsync/propagateupload.cpp @@ -61,6 +61,21 @@ static bool fileIsStillChanging(const SyncFileItem &item) && msSinceMod > -10000; } +PUTFileJob::PUTFileJob(AccountPtr account, const QString &path, std::unique_ptr<QIODevice> device, const QMap<QByteArray, QByteArray> &headers, int chunk, QObject *parent) + : PUTFileJob(account, Utility::concatUrlPath(account->davUrl(), path), std::move(device), headers, chunk, parent) +{ +} + +PUTFileJob::PUTFileJob(AccountPtr account, const QUrl &url, std::unique_ptr<QIODevice> device, const QMap<QByteArray, QByteArray> &headers, int chunk, QObject *parent) + : AbstractNetworkJob(account, QString(), parent) + , _device(device.release()) + , _headers(headers) + , _url(url) + , _chunk(chunk) +{ + _device->setParent(this); +} + PUTFileJob::~PUTFileJob() { // Make sure that we destroy the QNetworkReply before our _device of which it keeps an internal pointer. @@ -76,13 +91,8 @@ void PUTFileJob::start() req.setPriority(QNetworkRequest::LowPriority); // Long uploads must not block non-propagation jobs. - if (_url.isValid()) { - sendRequest("PUT", _url, req, _device); - } else { - sendRequest("PUT", makeDavUrl(path()), req, _device); - } + sendRequest("PUT", _url, req, _device); - connect(reply(), &QNetworkReply::uploadProgress, this, &PUTFileJob::uploadProgress); connect(this, &AbstractNetworkJob::networkActivity, account().data(), &Account::propagatorNetworkActivity); _requestTimer.start(); AbstractNetworkJob::start(); @@ -101,6 +111,11 @@ bool PUTFileJob::finished() return true; } +void PUTFileJob::newReplyHook(QNetworkReply *reply) +{ + connect(reply, &QNetworkReply::uploadProgress, this, &PUTFileJob::uploadProgress); +} + void PropagateUploadFileCommon::setDeleteExisting(bool enabled) { _deleteExisting = enabled; diff --git a/src/libsync/propagateupload.h b/src/libsync/propagateupload.h index 720c0d8a5..c1a24f0ce 100644 --- a/src/libsync/propagateupload.h +++ b/src/libsync/propagateupload.h @@ -98,24 +98,9 @@ private: public: explicit PUTFileJob(AccountPtr account, const QString &path, std::unique_ptr<QIODevice> device, - const QMap<QByteArray, QByteArray> &headers, int chunk, QObject *parent = nullptr) - : AbstractNetworkJob(account, path, parent) - , _device(device.release()) - , _headers(headers) - , _chunk(chunk) - { - _device->setParent(this); - } + const QMap<QByteArray, QByteArray> &headers, int chunk, QObject *parent = nullptr); explicit PUTFileJob(AccountPtr account, const QUrl &url, std::unique_ptr<QIODevice> device, - const QMap<QByteArray, QByteArray> &headers, int chunk, QObject *parent = nullptr) - : AbstractNetworkJob(account, QString(), parent) - , _device(device.release()) - , _headers(headers) - , _url(url) - , _chunk(chunk) - { - _device->setParent(this); - } + const QMap<QByteArray, QByteArray> &headers, int chunk, QObject *parent = nullptr); ~PUTFileJob() override; int _chunk; @@ -139,6 +124,9 @@ public: return std::chrono::milliseconds(_requestTimer.elapsed()); } +protected: + void newReplyHook(QNetworkReply *reply) override; + signals: void finishedSignal(); void uploadProgress(qint64, qint64); diff --git a/src/libsync/propagateuploadtus.cpp b/src/libsync/propagateuploadtus.cpp index dd27d5d69..93b9f6775 100644 --- a/src/libsync/propagateuploadtus.cpp +++ b/src/libsync/propagateuploadtus.cpp @@ -151,13 +151,15 @@ void PropagateUploadFileTUS::startNextChunk() << "Chunk:" << chunkSize << chunkSize / (_item->_size + 1) * 100; _jobs.append(job); - job->start(); connect(job, &SimpleNetworkJob::finishedSignal, this, &PropagateUploadFileTUS::slotChunkFinished); connect(job, &SimpleNetworkJob::destroyed, this, &PropagateUploadFileCommon::slotJobDestroyed); - connect(job->reply(), &QNetworkReply::uploadProgress, device, &UploadDevice::slotJobUploadProgress); - connect(job->reply(), &QNetworkReply::uploadProgress, this, [this](qint64 bytesSent, qint64) { - propagator()->reportProgress(*_item, _currentOffset + bytesSent); + job->addNewReplyHook([device, this](QNetworkReply *reply) { + connect(reply, &QNetworkReply::uploadProgress, device, &UploadDevice::slotJobUploadProgress); + connect(reply, &QNetworkReply::uploadProgress, this, [this](qint64 bytesSent, qint64) { + propagator()->reportProgress(*_item, _currentOffset + bytesSent); + }); }); + job->start(); } void PropagateUploadFileTUS::slotChunkFinished() |