* Given an error from the network, map to a SyncFileItem::Status error
*/
inline SyncFileItem::Status classifyError(QNetworkReply::NetworkError nerror,
- int httpCode,
- bool *anotherSyncNeeded = nullptr)
+ int httpCode, bool *anotherSyncNeeded = nullptr, const QByteArray &errorBody = QByteArray())
{
Q_ASSERT(nerror != QNetworkReply::NoError); // we should only be called when there is an error
}
if (httpCode == 503) {
- // "Service unavailable"
- // Happens for maintenance mode and other temporary outages
- return SyncFileItem::FatalError;
+ // When the server is in maintenance mode, we want to exit the sync immediatly
+ // so that we do not flood the server with many requests
+ return errorBody.contains(R"(>Sabre\DAV\Exception\ServiceUnavailable<)") ?
+ SyncFileItem::FatalError : SyncFileItem::NormalError;
}
if (httpCode == 412) {
propagator()->_journal->avoidReadFromDbOnNextSync(_item->_file);
}
+ QByteArray errorBody;
+ QString errorString = _item->_httpErrorCode >= 400 ? job->errorStringParsingBody(&errorBody)
+ : job->errorString();
SyncFileItem::Status status = job->errorStatus();
if (status == SyncFileItem::NoStatus) {
status = classifyError(err, _item->_httpErrorCode,
- &propagator()->_anotherSyncNeeded);
+ &propagator()->_anotherSyncNeeded, errorBody);
}
- done(status,_item->_httpErrorCode >= 400 ? job->errorStringParsingBody() : job->errorString());
+ done(status, errorString);
return;
}
checkResettingErrors();
SyncFileItem::Status status = classifyError(job->reply()->error(), _item->_httpErrorCode,
- &propagator()->_anotherSyncNeeded);
+ &propagator()->_anotherSyncNeeded, replyContent);
// Insufficient remote storage.
if (_item->_httpErrorCode == 507) {
fakeFolder.remoteModifier().insert("Y/Z/d7");
fakeFolder.remoteModifier().insert("Y/Z/d8");
fakeFolder.remoteModifier().insert("Y/Z/d9");
- fakeFolder.serverErrorPaths().append("Y/Z/d2", 503); // 503 is a fatal error
- fakeFolder.serverErrorPaths().append("Y/Z/d3", 503); // 503 is a fatal error
+ fakeFolder.serverErrorPaths().append("Y/Z/d2", 503);
+ fakeFolder.serverErrorPaths().append("Y/Z/d3", 503);
QVERIFY(!fakeFolder.syncOnce());
QCoreApplication::processEvents(); // should not crash
QVERIFY(!seen.contains(item->_file)); // signal only sent once per item
seen.insert(item->_file);
if (item->_file == "Y/Z/d2") {
- QVERIFY(item->_status == SyncFileItem::FatalError);
- } else if(item->_file == "Y/Z/d3") {
+ QVERIFY(item->_status == SyncFileItem::NormalError);
+ } else if (item->_file == "Y/Z/d3") {
QVERIFY(item->_status != SyncFileItem::Success);
+ } else if (!item->isDirectory()) {
+ QVERIFY(item->_status == SyncFileItem::Success);
}
- // We do not know about the other files - maybe the sync was aborted,
- // maybe they finished before the error caused the abort.
}
}