diff options
author | Hannah von Reth <hannah.vonreth@owncloud.com> | 2022-10-25 19:04:52 +0300 |
---|---|---|
committer | Hannah von Reth <vonreth@kde.org> | 2022-10-26 12:44:21 +0300 |
commit | ff24fad49770557aa121ded44cb9640ee74fc95f (patch) | |
tree | 10fc7949afd9ad3cf7f9bba56d2f65b3a7a4f7e7 | |
parent | 709f22e78c47632329f78628cb5d46a467375540 (diff) |
Implement range request support in the correct test class
-rw-r--r-- | test/testdownload.cpp | 2 | ||||
-rw-r--r-- | test/testutils/syncenginetestutils.cpp | 113 | ||||
-rw-r--r-- | test/testutils/syncenginetestutils.h | 27 |
3 files changed, 39 insertions, 103 deletions
diff --git a/test/testdownload.cpp b/test/testdownload.cpp index 2e4dbb38e..4474e49b4 100644 --- a/test/testdownload.cpp +++ b/test/testdownload.cpp @@ -27,7 +27,7 @@ class BrokenFakeGetReply : public FakeGetReply Q_OBJECT public: using FakeGetReply::FakeGetReply; - int fakeSize = stopAfter; + qint64 fakeSize = stopAfter; qint64 bytesAvailable() const override { diff --git a/test/testutils/syncenginetestutils.cpp b/test/testutils/syncenginetestutils.cpp index 6ad015b16..614c20098 100644 --- a/test/testutils/syncenginetestutils.cpp +++ b/test/testutils/syncenginetestutils.cpp @@ -601,6 +601,7 @@ void FakeMoveReply::respond() FakeGetReply::FakeGetReply(FileInfo &remoteRootFileInfo, QNetworkAccessManager::Operation op, const QNetworkRequest &request, QObject *parent) : FakeReply { parent } + , _range(parseRange(request)) { setRequest(request); setUrl(request.url()); @@ -617,6 +618,27 @@ FakeGetReply::FakeGetReply(FileInfo &remoteRootFileInfo, QNetworkAccessManager:: QMetaObject::invokeMethod(this, &FakeGetReply::respond, Qt::QueuedConnection); } +std::pair<qint64, qint64> FakeGetReply::parseRange(const QNetworkRequest &request) +{ + if (request.hasRawHeader("Range")) { + const QString range = QString::fromUtf8(request.rawHeader("Range")); + const QRegularExpression bytesPattern(QStringLiteral(R"(bytes=(?P<start>\d+)-(?P<end>\d*))")); + const QRegularExpressionMatch match = bytesPattern.match(range); + if (match.hasMatch()) { + const int start = match.captured(QStringLiteral("start")).toInt(); + const QString end = match.captured(QStringLiteral("end")); + if (end.isEmpty()) { + // until the end + return { start, -1 }; + } else { + // to the end of the range + return { start, end.toLongLong() }; + } + } + } + return { 0, 0 }; +} + void FakeGetReply::respond() { switch (state) { @@ -630,13 +652,23 @@ void FakeGetReply::respond() break; case State::Ok: payload = fileInfo->contentChar; - size = fileInfo->contentSize; + if (_range.second != 0) { + if (_range.second == -1) { + size = fileInfo->contentSize - _range.first; + } else { + size = _range.second - _range.first; + } + setRawHeader("Content-Range", QByteArrayLiteral("bytes ") + QByteArray::number(_range.first) + '-'); + } else { + size = fileInfo->contentSize; + } setHeader(QNetworkRequest::ContentLengthHeader, size); setAttribute(QNetworkRequest::HttpStatusCodeAttribute, 200); setRawHeader("OC-ETag", fileInfo->etag); setRawHeader("ETag", fileInfo->etag); setRawHeader("OC-FileId", fileInfo->fileId); setRawHeader("X-OC-Mtime", QByteArray::number(fileInfo->lastModifiedInSecondsUTC())); + emit metaDataChanged(); if (bytesAvailable()) { emit readyRead(); @@ -672,85 +704,6 @@ qint64 FakeGetReply::readData(char *data, qint64 maxlen) return len; } -FakeGetWithDataReply::FakeGetWithDataReply(FileInfo &remoteRootFileInfo, const QByteArray &data, QNetworkAccessManager::Operation op, const QNetworkRequest &request, QObject *parent) - : FakeReply { parent } -{ - setRequest(request); - setUrl(request.url()); - setOperation(op); - open(QIODevice::ReadOnly); - - Q_ASSERT(!data.isEmpty()); - payload = data; - QString fileName = getFilePathFromUrl(request.url()); - Q_ASSERT(!fileName.isEmpty()); - fileInfo = remoteRootFileInfo.find(fileName); - QMetaObject::invokeMethod(this, &FakeGetWithDataReply::respond, Qt::QueuedConnection); - - if (request.hasRawHeader("Range")) { - const QString range = QString::fromUtf8(request.rawHeader("Range")); - const QRegularExpression bytesPattern(QStringLiteral(R"(bytes=(?P<start>\d+)-(?P<end>\d*))")); - const QRegularExpressionMatch match = bytesPattern.match(range); - if (match.hasMatch()) { - const int start = match.captured(QStringLiteral("start")).toInt(); - const QString end = match.captured(QStringLiteral("end")); - if (end.isEmpty()) { - // until the end - payload = payload.mid(start); - } else { - // to the end of the range - const int endInt = end.toInt(); - payload = payload.mid(start, endInt - start + 1); - } - contentRange = payload.size(); - } - } -} - -void FakeGetWithDataReply::respond() -{ - if (aborted) { - setError(OperationCanceledError, QStringLiteral("Operation Canceled")); - emit metaDataChanged(); - emit finished(); - return; - } - setHeader(QNetworkRequest::ContentLengthHeader, payload.size()); - setAttribute(QNetworkRequest::HttpStatusCodeAttribute, 200); - setRawHeader("OC-ETag", fileInfo->etag); - setRawHeader("ETag", fileInfo->etag); - setRawHeader("OC-FileId", fileInfo->fileId); - setRawHeader("X-OC-Mtime", QByteArray::number(fileInfo->lastModifiedInSecondsUTC())); - if (contentRange != 0) { - setRawHeader("Content-Range", QByteArrayLiteral("byte ") + QByteArray::number(contentRange)); - } - emit metaDataChanged(); - if (bytesAvailable()) - emit readyRead(); - emit finished(); -} - -void FakeGetWithDataReply::abort() -{ - setError(OperationCanceledError, QStringLiteral("Operation Canceled")); - aborted = true; -} - -qint64 FakeGetWithDataReply::bytesAvailable() const -{ - if (aborted) - return 0; - return payload.size() - offset + QIODevice::bytesAvailable(); -} - -qint64 FakeGetWithDataReply::readData(char *data, qint64 maxlen) -{ - qint64 len = std::min(payload.size() - offset, quint64(maxlen)); - std::memcpy(data, payload.constData() + offset, len); - offset += len; - return len; -} - FakeChunkMoveReply::FakeChunkMoveReply(FileInfo &uploadsFileInfo, FileInfo &remoteRootFileInfo, QNetworkAccessManager::Operation op, const QNetworkRequest &request, QObject *parent) : FakeReply { parent } { diff --git a/test/testutils/syncenginetestutils.h b/test/testutils/syncenginetestutils.h index cd004d1de..0270787bc 100644 --- a/test/testutils/syncenginetestutils.h +++ b/test/testutils/syncenginetestutils.h @@ -417,37 +417,20 @@ public: const FileInfo *fileInfo; char payload; - int size; + qint64 size; State state = State::Ok; + const std::pair<qint64, qint64> _range; FakeGetReply(FileInfo &remoteRootFileInfo, QNetworkAccessManager::Operation op, const QNetworkRequest &request, QObject *parent); Q_INVOKABLE void respond(); void abort() override; - qint64 bytesAvailable() const override; - - qint64 readData(char *data, qint64 maxlen) override; -}; - -class FakeGetWithDataReply : public FakeReply -{ - Q_OBJECT -public: - const FileInfo *fileInfo; - QByteArray payload; - quint64 offset = 0; - quint64 contentRange = 0; - bool aborted = false; - - FakeGetWithDataReply(FileInfo &remoteRootFileInfo, const QByteArray &data, QNetworkAccessManager::Operation op, const QNetworkRequest &request, QObject *parent); - - Q_INVOKABLE void respond(); + virtual qint64 bytesAvailable() const override; - void abort() override; - qint64 bytesAvailable() const override; + virtual qint64 readData(char *data, qint64 maxlen) override; - qint64 readData(char *data, qint64 maxlen) override; + static std::pair<qint64, qint64> parseRange(const QNetworkRequest &request); }; class FakeChunkMoveReply : public FakeReply |