Skip to content

Commit

Permalink
Download: Use the <s:message> from the reply in the error message if any
Browse files Browse the repository at this point in the history
Issue: #6459
  • Loading branch information
ogoffart committed Apr 18, 2018
1 parent 0fdfb2c commit 02b818a
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 4 deletions.
2 changes: 1 addition & 1 deletion src/libsync/propagatedownload.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -589,7 +589,7 @@ void PropagateDownloadFile::slotGetFinished()
&propagator()->_anotherSyncNeeded);
}

done(status, job->errorString());
done(status,_item->_httpErrorCode >= 400 ? job->errorStringParsingBody() : job->errorString());
return;
}

Expand Down
12 changes: 9 additions & 3 deletions test/syncenginetestutils.h
Original file line number Diff line number Diff line change
Expand Up @@ -715,8 +715,8 @@ class FakeErrorReply : public QNetworkReply
Q_OBJECT
public:
FakeErrorReply(QNetworkAccessManager::Operation op, const QNetworkRequest &request,
QObject *parent, int httpErrorCode)
: QNetworkReply{parent}, _httpErrorCode(httpErrorCode) {
QObject *parent, int httpErrorCode, const QByteArray &body = QByteArray())
: QNetworkReply{parent}, _httpErrorCode(httpErrorCode), _body(body) {
setRequest(request);
setUrl(request.url());
setOperation(op);
Expand All @@ -732,9 +732,15 @@ class FakeErrorReply : public QNetworkReply
}

void abort() override { }
qint64 readData(char *, qint64) override { return 0; }
qint64 readData(char *buf, qint64 max) override {
max = qMin<qint64>(max, _body.size());
memcpy(buf, _body.constData(), max);
_body = _body.mid(max);
return max;
}

int _httpErrorCode;
QByteArray _body;
};

// A reply that never responds
Expand Down
28 changes: 28 additions & 0 deletions test/testdownload.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,34 @@ private slots:
QCOMPARE(ranges, QByteArray("bytes=" + QByteArray::number(stopAfter) + "-"));
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
}

void testErrorMessage () {
// This test's main goal is to test that the error string from the server is shown in the UI

FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItemPtr &)));
auto size = 3'500'000;
fakeFolder.remoteModifier().insert("A/broken", size);

QByteArray serverMessage = "The file was not downloaded because the tests wants so!";

// First, download only the first 3 MB of the file
fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *) -> QNetworkReply * {
if (op == QNetworkAccessManager::GetOperation && request.url().path().endsWith("A/broken")) {
return new FakeErrorReply(op, request, this, 400,
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
"<d:error xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\">\n"
"<s:exception>Sabre\\DAV\\Exception\\Forbidden</s:exception>\n"
"<s:message>"+serverMessage+"</s:message>\n"
"</d:error>");
}
return nullptr;
});

QVERIFY(!fakeFolder.syncOnce()); // Fail because A/broken
QCOMPARE(getItem(completeSpy, "A/broken")->_status, SyncFileItem::NormalError);
QVERIFY(getItem(completeSpy, "A/broken")->_errorString.contains(serverMessage));
}
};

QTEST_GUILESS_MAIN(TestDownload)
Expand Down

0 comments on commit 02b818a

Please sign in to comment.