Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/owncloud/client.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHannah von Reth <hannah.vonreth@owncloud.com>2022-10-25 19:04:52 +0300
committerHannah von Reth <vonreth@kde.org>2022-10-26 12:44:21 +0300
commitff24fad49770557aa121ded44cb9640ee74fc95f (patch)
tree10fc7949afd9ad3cf7f9bba56d2f65b3a7a4f7e7
parent709f22e78c47632329f78628cb5d46a467375540 (diff)
Implement range request support in the correct test class
-rw-r--r--test/testdownload.cpp2
-rw-r--r--test/testutils/syncenginetestutils.cpp113
-rw-r--r--test/testutils/syncenginetestutils.h27
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