Improve http error messages; cleanup
authorChristian Kamm <mail@ckamm.de>
Thu, 23 Mar 2017 14:53:22 +0000 (15:53 +0100)
committerckamm <mail@ckamm.de>
Tue, 4 Apr 2017 07:27:37 +0000 (09:27 +0200)
By default QNetworkReply::errorString() often produces messages like
   "Error downloading <url> - server replied: <reason>"
but the "downloading" part invariably confuses people since the
error might very well have been produced by a PUT request.

This commit produces clearer error messages for HTTP errors.

Additionally:
* Remove some unnecessary null checks from slots connected to
  network job signals and document that these signals never send
  null replies.
* There was a bug where AbstractNetworkJob::_timedout wasn't
  set when derived classes overrode slotTimeout. We now ensure
  it's always set by disallowing overrides of slotTimeout.
  Instead it now calls onTimedOut, which allows custom handling.
* Several subclasses declared errorString, isTimedOut. Move
  these to AbstractNetworkJob.
* Unify handling of OC-ErrorString (via the new, general
  Job::errorString)
* Add documentation in various places.

19 files changed:
src/gui/activitywidget.cpp
src/gui/folderwizard.cpp
src/gui/owncloudsetupwizard.cpp
src/libsync/abstractnetworkjob.cpp
src/libsync/abstractnetworkjob.h
src/libsync/connectionvalidator.cpp
src/libsync/networkjobs.cpp
src/libsync/networkjobs.h
src/libsync/propagatedownload.cpp
src/libsync/propagatedownload.h
src/libsync/propagateremotedelete.cpp
src/libsync/propagateremotedelete.h
src/libsync/propagateremotemkdir.cpp
src/libsync/propagateremotemove.cpp
src/libsync/propagateremotemove.h
src/libsync/propagateupload.cpp
src/libsync/propagateupload.h
src/libsync/propagateuploadng.cpp
src/libsync/propagateuploadv1.cpp

index 8d0efef2780d11f7c6d3ad143112ef644784694f..bcaaa3f70c02b34e20b6cc388e29e5fd588227df 100644 (file)
@@ -420,10 +420,7 @@ void ActivityWidget::slotNotifyNetworkError( QNetworkReply *reply)
         return;
     }
 
-    int resultCode =0;
-    if( reply ) {
-        resultCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
-    }
+    int resultCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
 
     endNotificationRequest(job->widget(), resultCode);
     qDebug() << Q_FUNC_INFO << "Server notify job failed with code " << resultCode;
index 2db147556a87520e50b8eabc1a9cacf93faa859c..18eafa33bc0a3027000c6e24dd5941d55124dafb 100644 (file)
@@ -220,7 +220,7 @@ void FolderWizardRemotePath::slotCreateRemoteFolderFinished(QNetworkReply::Netwo
 void FolderWizardRemotePath::slotHandleMkdirNetworkError(QNetworkReply *reply)
 {
     qDebug() << "** webdav mkdir request failed:" << reply->error();
-    if( reply && !_account->credentials()->stillValid(reply) ) {
+    if( !_account->credentials()->stillValid(reply) ) {
         showWarn(tr("Authentication failed accessing %1").arg(Theme::instance()->appNameGUI()));
     } else {
         showWarn(tr("Failed to create the folder on %1. Please check manually.")
@@ -228,10 +228,11 @@ void FolderWizardRemotePath::slotHandleMkdirNetworkError(QNetworkReply *reply)
     }
 }
 
-void FolderWizardRemotePath::slotHandleLsColNetworkError(QNetworkReply *reply)
+void FolderWizardRemotePath::slotHandleLsColNetworkError(QNetworkReply */*reply*/)
 {
+    auto job = qobject_cast<MkColJob *>(sender());
     showWarn(tr("Failed to list a folder. Error: %1")
-             .arg(errorMessage(reply->errorString(), reply->readAll())));
+             .arg(job->errorStringParsingBody()));
 }
 
 static QTreeWidgetItem* findFirstChild(QTreeWidgetItem *parent, const QString& text)
index 0371553b96ff327ff6eeac53cf6fa105b54572d6..0af0fbc2b69a41d836f39cda331d6aff89b54adb 100644 (file)
@@ -202,6 +202,7 @@ void OwncloudSetupWizard::slotOwnCloudFoundAuth(const QUrl& url, const QVariantM
 
 void OwncloudSetupWizard::slotNoOwnCloudFoundAuth(QNetworkReply *reply)
 {
+    auto job = qobject_cast<CheckServerJob *>(sender());
     int resultCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
     QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
 
@@ -213,7 +214,7 @@ void OwncloudSetupWizard::slotNoOwnCloudFoundAuth(QNetworkReply *reply)
         msg = tr("Failed to connect to %1 at %2:<br/>%3")
                   .arg(Utility::escape(Theme::instance()->appNameGUI()),
                        Utility::escape(reply->url().toString()),
-                       Utility::escape(reply->errorString()));
+                       Utility::escape(job->errorString()));
     }
     bool isDowngradeAdvised = checkDowngradeAdvised(reply);
 
@@ -322,7 +323,7 @@ void OwncloudSetupWizard::slotAuthError()
                           "<a href=\"%1\">click here</a> to access the service with your browser.")
                            .arg(Utility::escape(_ocWizard->account()->url().toString()));
         } else {
-            errorMsg = errorMessage(reply->errorString(), reply->readAll());
+            errorMsg = job->errorStringParsingBody();
         }
 
     // Something else went wrong, maybe the response was 200 but with invalid data.
@@ -398,6 +399,7 @@ void OwncloudSetupWizard::slotCreateLocalAndRemoteFolders(const QString& localFo
 // ### TODO move into EntityExistsJob once we decide if/how to return gui strings from jobs
 void OwncloudSetupWizard::slotRemoteFolderExists(QNetworkReply *reply)
 {
+    auto job = qobject_cast<EntityExistsJob *>(sender());
     bool ok = true;
     QString error;
     QNetworkReply::NetworkError errId = reply->error();
@@ -412,7 +414,7 @@ void OwncloudSetupWizard::slotRemoteFolderExists(QNetworkReply *reply)
             createRemoteFolder();
         }
     } else {
-        error = tr("Error: %1").arg(reply->errorString());
+        error = tr("Error: %1").arg(job->errorString());
         ok = false;
     }
 
index fcd2928372c8ffe0156e8834da0be0abe8c04d9f..317d3439c69fa611b1ee5facaa8f8bb4cfc14421 100644 (file)
@@ -146,37 +146,16 @@ QUrl AbstractNetworkJob::makeDavUrl(const QString& relativePath) const
     return Utility::concatUrlPath(_account->davUrl(), relativePath);
 }
 
-QByteArray AbstractNetworkJob::requestVerb(QNetworkReply* reply)
-{
-    switch (reply->operation()) {
-    case QNetworkAccessManager::HeadOperation:
-        return "HEAD";
-    case QNetworkAccessManager::GetOperation:
-        return "GET";
-    case QNetworkAccessManager::PutOperation:
-        return "PUT";
-    case QNetworkAccessManager::PostOperation:
-        return "POST";
-    case QNetworkAccessManager::DeleteOperation:
-        return "DELETE";
-    case QNetworkAccessManager::CustomOperation:
-        return reply->request().attribute(QNetworkRequest::CustomVerbAttribute).toByteArray();
-    case QNetworkAccessManager::UnknownOperation:
-        break;
-    }
-    return QByteArray();
-}
-
 void AbstractNetworkJob::slotFinished()
 {
     _timer.stop();
 
     if( _reply->error() == QNetworkReply::SslHandshakeFailedError ) {
-        qDebug() << "SslHandshakeFailedError: " << reply()->errorString() << " : can be caused by a webserver wanting SSL client certificates";
+        qDebug() << "SslHandshakeFailedError: " << errorString() << " : can be caused by a webserver wanting SSL client certificates";
     }
 
     if( _reply->error() != QNetworkReply::NoError ) {
-        qDebug() << Q_FUNC_INFO << _reply->error() << _reply->errorString()
+        qDebug() << Q_FUNC_INFO << _reply->error() << errorString()
                  << _reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
         if (_reply->error() == QNetworkReply::ProxyAuthenticationRequiredError) {
             qDebug() << Q_FUNC_INFO << _reply->rawHeader("Proxy-Authenticate");
@@ -194,7 +173,7 @@ void AbstractNetworkJob::slotFinished()
 
         // ### some of the qWarnings here should be exported via displayErrors() so they
         // ### can be presented to the user if the job executor has a GUI
-        QByteArray verb = requestVerb(reply());
+        QByteArray verb = requestVerb(*reply());
         if (requestedUrl.scheme() == QLatin1String("https") &&
                 redirectUrl.scheme() == QLatin1String("http")) {
             qWarning() << this << "HTTPS->HTTP downgrade detected!";
@@ -236,6 +215,40 @@ QByteArray AbstractNetworkJob::responseTimestamp()
     return _responseTimestamp;
 }
 
+QString AbstractNetworkJob::errorString() const
+{
+    if (_timedout) {
+        return tr("Connection timed out");
+    } else if (!reply()) {
+        return tr("Unknown error: network reply was deleted");
+    } else if (reply()->hasRawHeader("OC-ErrorString")) {
+        return reply()->rawHeader("OC-ErrorString");
+    } else {
+        return networkReplyErrorString(*reply());
+    }
+}
+
+QString AbstractNetworkJob::errorStringParsingBody(QByteArray* body)
+{
+    QString base = errorString();
+    if (base.isEmpty() || !reply()) {
+        return QString();
+    }
+
+    QByteArray replyBody = reply()->readAll();
+    if (body) {
+        *body = replyBody;
+    }
+
+    QString extra = extractErrorMessage(replyBody);
+    // Don't append the XML error message to a OC-ErrorString message.
+    if (!extra.isEmpty() && !reply()->hasRawHeader("OC-ErrorString")) {
+        return QString::fromLatin1("%1 (%2)").arg(base, extra);
+    }
+
+    return base;
+}
+
 AbstractNetworkJob::~AbstractNetworkJob()
 {
     setReply(0);
@@ -255,11 +268,15 @@ void AbstractNetworkJob::start()
 void AbstractNetworkJob::slotTimeout()
 {
     _timedout = true;
+    qDebug() << this << "Timeout" << (reply() ? reply()->request().url() : path());
+    onTimedOut();
+}
+
+void AbstractNetworkJob::onTimedOut()
+{
     if (reply()) {
-        qDebug() << Q_FUNC_INFO << this << "Timeout" << reply()->request().url();
         reply()->abort();
     } else {
-        qDebug() << Q_FUNC_INFO << this << "Timeout reply was NULL";
         deleteLater();
     }
 }
@@ -315,4 +332,48 @@ QString errorMessage(const QString& baseError, const QByteArray& body)
     return msg;
 }
 
+QByteArray requestVerb(const QNetworkReply& reply)
+{
+    switch (reply.operation()) {
+    case QNetworkAccessManager::HeadOperation:
+        return "HEAD";
+    case QNetworkAccessManager::GetOperation:
+        return "GET";
+    case QNetworkAccessManager::PutOperation:
+        return "PUT";
+    case QNetworkAccessManager::PostOperation:
+        return "POST";
+    case QNetworkAccessManager::DeleteOperation:
+        return "DELETE";
+    case QNetworkAccessManager::CustomOperation:
+        return reply.request().attribute(QNetworkRequest::CustomVerbAttribute).toByteArray();
+    case QNetworkAccessManager::UnknownOperation:
+        break;
+    }
+    return QByteArray();
+}
+
+QString networkReplyErrorString(const QNetworkReply& reply)
+{
+    QString base = reply.errorString();
+    int httpStatus = reply.attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
+    QString httpReason = reply.attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();
+
+    // Only adjust HTTP error messages of the expected format.
+    if (httpReason.isEmpty() || httpStatus == 0 || !base.contains(httpReason)) {
+        return base;
+    }
+
+    return AbstractNetworkJob::tr("Server replied \"%1 %2\" to \"%3 %4\"").arg(
+            QString::number(httpStatus),
+            httpReason,
+            requestVerb(reply),
+#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
+            reply.request().url().toString()
+#else
+            reply.request().url().toDisplayString()
+#endif
+            );
+}
+
 } // namespace OCC
index a2ec226bbd4b565cd2cb39e2bd0b9159e9411937..73e77fec15279ecef463c98a63dc4a3aab4ded8b 100644 (file)
@@ -68,12 +68,32 @@ public:
 
     QByteArray responseTimestamp();
 
-    qint64 timeoutMsec() { return _timer.interval(); }
+    qint64 timeoutMsec() const { return _timer.interval(); }
+    bool timedOut() const { return _timedout; }
+
+    /** Returns an error message, if any. */
+    QString errorString() const;
+
+    /** Like errorString, but also checking the reply body for information.
+     *
+     * Specifically, sometimes xml bodies have extra error information.
+     * This function reads the body of the reply and parses out the
+     * error information, if possible.
+     *
+     * \a body is optinally filled with the reply body.
+     *
+     * Warning: Needs to call reply()->readAll().
+     */
+    QString errorStringParsingBody(QByteArray* body = 0);
 
 public slots:
     void setTimeout(qint64 msec);
     void resetTimeout();
 signals:
+    /** Emitted on network error.
+     *
+     * \a reply is never null
+     */
     void networkError(QNetworkReply *reply);
     void networkActivity();
 protected:
@@ -103,7 +123,19 @@ protected:
     QUrl makeDavUrl(const QString& relativePath) const;
 
     int maxRedirects() const { return 10; }
+
+    /** Called at the end of QNetworkReply::finished processing.
+     *
+     * Returning true triggers a deleteLater() of this job.
+     */
     virtual bool finished() = 0;
+
+    /** Called on timeout.
+     *
+     * The default implementation aborts the reply.
+     */
+    virtual void onTimedOut();
+
     QByteArray    _responseTimestamp;
     bool          _timedout;  // set to true when the timeout slot is received
 
@@ -111,15 +143,9 @@ protected:
     // GET requests that don't set up any HTTP body or other flags.
     bool          _followRedirects;
 
-    /** Helper to construct the HTTP verb used in the request
-     *
-     * Returns an empty QByteArray for UnknownOperation.
-     */
-    static QByteArray requestVerb(QNetworkReply* reply);
-
 private slots:
     void slotFinished();
-    virtual void slotTimeout();
+    void slotTimeout();
 
 protected:
     AccountPtr _account;
@@ -163,6 +189,23 @@ QString OWNCLOUDSYNC_EXPORT extractErrorMessage(const QByteArray& errorResponse)
 /** Builds a error message based on the error and the reply body. */
 QString OWNCLOUDSYNC_EXPORT errorMessage(const QString& baseError, const QByteArray& body);
 
+/** Helper to construct the HTTP verb used in the request
+ *
+ * Returns an empty QByteArray for UnknownOperation.
+ */
+QByteArray OWNCLOUDSYNC_EXPORT requestVerb(const QNetworkReply& reply);
+
+/** Nicer errorString() for QNetworkReply
+ *
+ * By default QNetworkReply::errorString() often produces messages like
+ *   "Error downloading <url> - server replied: <reason>"
+ * but the "downloading" part invariably confuses people since the
+ * error might very well have been produced by a PUT request.
+ *
+ * This function produces clearer error messages for HTTP errors.
+ */
+QString OWNCLOUDSYNC_EXPORT networkReplyErrorString(const QNetworkReply& reply);
+
 } // namespace OCC
 
 
index ec63685aa4cf38560e8e7a4537d04ba22f11328e..9376d404821b2155fdaf60ed9eb8ef8240cac943 100644 (file)
@@ -144,17 +144,17 @@ void ConnectionValidator::slotStatusFound(const QUrl&url, const QVariantMap &inf
 // status.php could not be loaded (network or server issue!).
 void ConnectionValidator::slotNoStatusFound(QNetworkReply *reply)
 {
-    qDebug() << Q_FUNC_INFO << reply->error() << reply->errorString() << reply->peek(1024);
-    if (reply && !_account->credentials()->ready()) {
+    auto job = qobject_cast<CheckServerJob *>(sender());
+    qDebug() << Q_FUNC_INFO << reply->error() << job->errorString() << reply->peek(1024);
+    if (!_account->credentials()->ready()) {
         // This could be needed for SSL client certificates
         // We need to load them from keychain and try
         reportResult( CredentialsMissingOrWrong );
-    } else
-    if( reply && ! _account->credentials()->stillValid(reply)) {
+    } else if (! _account->credentials()->stillValid(reply)) {
         _errors.append(tr("Authentication error: Either username or password are wrong."));
-    }  else {
+    } else {
         //_errors.append(tr("Unable to connect to %1").arg(_account->url().toString()));
-        _errors.append( reply->errorString() );
+        _errors.append( job->errorString() );
     }
     reportResult( StatusNotFound );
 }
@@ -189,17 +189,18 @@ void ConnectionValidator::checkAuthentication()
 
 void ConnectionValidator::slotAuthFailed(QNetworkReply *reply)
 {
+    auto job = qobject_cast<PropfindJob *>(sender());
     Status stat = Timeout;
 
     if( reply->error() == QNetworkReply::AuthenticationRequiredError ||
              !_account->credentials()->stillValid(reply)) {
-        qDebug() <<  reply->error() << reply->errorString();
+        qDebug() <<  reply->error() << job->errorString();
         qDebug() << "******** Password is wrong!";
         _errors << tr("The provided credentials are not correct");
         stat = CredentialsMissingOrWrong;
 
     } else if( reply->error() != QNetworkReply::NoError ) {
-        _errors << errorMessage(reply->errorString(), reply->readAll());
+        _errors << job->errorStringParsingBody();
 
         const int httpStatus =
                 reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
index b12c65a8e161e3ebc539be8a17b76d3069e6b304..3ff312662fcd700b296e59cfb4402d142a8e2f4e 100644 (file)
@@ -385,7 +385,7 @@ void CheckServerJob::start()
     AbstractNetworkJob::start();
 }
 
-void CheckServerJob::slotTimeout()
+void CheckServerJob::onTimedOut()
 {
     qDebug() << "TIMEOUT" << Q_FUNC_INFO;
     if (reply() && reply()->isRunning()) {
@@ -702,7 +702,7 @@ bool JsonApiJob::finished()
     int statusCode = 0;
 
     if (reply()->error() != QNetworkReply::NoError) {
-        qWarning() << "Network error: " << path() << reply()->errorString() << reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute);
+        qWarning() << "Network error: " << path() << errorString() << reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute);
         emit jsonReceived(QVariantMap(), statusCode);
         return true;
     }
index f7a37d95004babbe114c136adbb784daece11d50..d381f1b04079f943da12c551dc41406e7448cc79 100644 (file)
@@ -203,12 +203,18 @@ public:
 
 signals:
     void instanceFound(const QUrl&url, const QVariantMap &info);
+
+    /** Emitted on invalid status.php reply.
+     *
+     * \a reply is never null
+     */
     void instanceNotFound(QNetworkReply *reply);
     void timeout(const QUrl&url);
 
+private:
+    bool finished() Q_DECL_OVERRIDE;
+    void onTimedOut() Q_DECL_OVERRIDE;
 private slots:
-    virtual bool finished() Q_DECL_OVERRIDE;
-    virtual void slotTimeout() Q_DECL_OVERRIDE;
     virtual void metaDataChangedSlot();
     virtual void encryptedSlot();
 
index b772313baca6a568b87f844b1aa190ff8e85fa4b..fb2299f41b9c8d71ba59152dc3089e5efdbdd285 100644 (file)
@@ -113,7 +113,7 @@ void GETFileJob::start() {
     }
 
     if( reply()->error() != QNetworkReply::NoError ) {
-        qWarning() << Q_FUNC_INFO << " Network error: " << reply()->errorString();
+        qWarning() << Q_FUNC_INFO << " Network error: " << errorString();
     }
 
     connect(reply(), SIGNAL(metaDataChanged()), this, SLOT(slotMetaDataChanged()));
@@ -254,7 +254,7 @@ void GETFileJob::slotReadyRead()
 
         qint64 r = reply()->read(buffer.data(), toRead);
         if (r < 0) {
-            _errorString = reply()->errorString();
+            _errorString = networkReplyErrorString(*reply());
             _errorStatus = SyncFileItem::NormalError;
             qDebug() << "Error while reading from device: " << _errorString;
             reply()->abort();
@@ -287,7 +287,7 @@ void GETFileJob::slotReadyRead()
     }
 }
 
-void GETFileJob::slotTimeout()
+void GETFileJob::onTimedOut()
 {
     qDebug() << "Timeout" << (reply() ? reply()->request().url() : path());
     if (!reply())
@@ -301,11 +301,8 @@ QString GETFileJob::errorString() const
 {
     if (!_errorString.isEmpty()) {
         return _errorString;
-    } else if (reply()->hasRawHeader("OC-ErrorString")) {
-        return reply()->rawHeader("OC-ErrorString");
-    } else {
-        return reply()->errorString();
     }
+    return AbstractNetworkJob::errorString();
 }
 
 void PropagateDownloadFile::start()
@@ -445,7 +442,7 @@ void PropagateDownloadFile::slotGetFinished()
 
     qDebug() << Q_FUNC_INFO << job->reply()->request().url() << "FINISHED WITH STATUS"
              << job->reply()->error()
-             << (job->reply()->error() == QNetworkReply::NoError ? QLatin1String("") : job->reply()->errorString())
+             << (job->reply()->error() == QNetworkReply::NoError ? QLatin1String("") : job->errorString())
              << _item->_httpErrorCode
              << _tmpFile.size() << _item->_size << job->resumeStart()
              << job->reply()->rawHeader("Content-Range") << job->reply()->rawHeader("Content-Length");
index 1317dda869c739dd9ae6ca2d0590deb502b3a7af..6553760cbd3d66e5c0212c8e418a7252f96a3322 100644 (file)
@@ -87,7 +87,7 @@ public:
     SyncFileItem::Status errorStatus() { return _errorStatus; }
     void setErrorStatus(const SyncFileItem::Status & s) { _errorStatus = s; }
 
-    virtual void slotTimeout() Q_DECL_OVERRIDE;
+    void onTimedOut() Q_DECL_OVERRIDE;
 
     QByteArray &etag() { return _etag; }
     quint64 resumeStart() { return _resumeStart; }
index a85d73c281384786a54b41f2cc6f1822cdf6a8e3..634f31ac6b6c102ad809640222433aac36764679 100644 (file)
@@ -42,18 +42,6 @@ void DeleteJob::start()
     AbstractNetworkJob::start();
 }
 
-
-QString DeleteJob::errorString()
-{
-    if (_timedout) {
-        return tr("Connection timed out");
-    } else if (reply()->hasRawHeader("OC-ErrorString")) {
-        return reply()->rawHeader("OC-ErrorString");
-    } else {
-        return reply()->errorString();
-    }
-}
-
 bool DeleteJob::finished()
 {
     emit finishedSignal();
@@ -89,7 +77,7 @@ void PropagateRemoteDelete::slotDeleteJobFinished()
 
     qDebug() << Q_FUNC_INFO << _job->reply()->request().url() << "FINISHED WITH STATUS"
         << _job->reply()->error()
-        << (_job->reply()->error() == QNetworkReply::NoError ? QLatin1String("") : _job->reply()->errorString());
+        << (_job->reply()->error() == QNetworkReply::NoError ? QLatin1String("") : _job->errorString());
 
     QNetworkReply::NetworkError err = _job->reply()->error();
     const int httpStatus = _job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
index 44f4ebd3b917af097f3487c12f89ffd84af90825..54cd8a0eae152645180cddf77ba9b56a202b2f14 100644 (file)
@@ -32,9 +32,6 @@ public:
     void start() Q_DECL_OVERRIDE;
     bool finished() Q_DECL_OVERRIDE;
 
-    QString errorString();
-    bool timedOut() { return _timedout; }
-
 signals:
     void finishedSignal();
 };
index 3e4f40b56c0cae15da96b9407a0bcb5c3ab1fec6..cb467388815c80fa601f591c6f48dadda13ffb4c 100644 (file)
@@ -75,7 +75,7 @@ void PropagateRemoteMkdir::slotMkcolJobFinished()
 
     qDebug() << Q_FUNC_INFO << _job->reply()->request().url() << "FINISHED WITH STATUS"
         << _job->reply()->error()
-        << (_job->reply()->error() == QNetworkReply::NoError ? QLatin1String("") : _job->reply()->errorString());
+        << (_job->reply()->error() == QNetworkReply::NoError ? QLatin1String("") : _job->errorString());
 
     QNetworkReply::NetworkError err = _job->reply()->error();
     _item->_httpErrorCode = _job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
@@ -85,11 +85,7 @@ void PropagateRemoteMkdir::slotMkcolJobFinished()
     } else if (err != QNetworkReply::NoError) {
         SyncFileItem::Status status = classifyError(err, _item->_httpErrorCode,
                                                     &propagator()->_anotherSyncNeeded);
-        auto errorString = _job->reply()->errorString();
-        if (_job->reply()->hasRawHeader("OC-ErrorString")) {
-            errorString = _job->reply()->rawHeader("OC-ErrorString");
-        }
-        done(status, errorString);
+        done(status, _job->errorString());
         return;
     } else if (_item->_httpErrorCode != 201) {
         // Normally we expect "201 Created"
index 5a59f91244c60b05ec4b10310e82cd6fc9095a04..f2410fb7625b9befbbf33bbfedaed22774f4dd5e 100644 (file)
@@ -56,17 +56,6 @@ void MoveJob::start()
 }
 
 
-QString MoveJob::errorString()
-{
-    if (_timedout) {
-        return tr("Connection timed out");
-    } else if (reply()->hasRawHeader("OC-ErrorString")) {
-        return reply()->rawHeader("OC-ErrorString");
-    } else {
-        return reply()->errorString();
-    }
-}
-
 bool MoveJob::finished()
 {
     emit finishedSignal();
@@ -131,7 +120,7 @@ void PropagateRemoteMove::slotMoveJobFinished()
 
     qDebug() << Q_FUNC_INFO << _job->reply()->request().url() << "FINISHED WITH STATUS"
         << _job->reply()->error()
-        << (_job->reply()->error() == QNetworkReply::NoError ? QLatin1String("") : _job->reply()->errorString());
+        << (_job->reply()->error() == QNetworkReply::NoError ? QLatin1String("") : _job->errorString());
 
     QNetworkReply::NetworkError err = _job->reply()->error();
     _item->_httpErrorCode = _job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
index afda27b2f5014ff416ab4cf7405871a621d33ee3..6d9150d79f110c4790dfe92d24b9623b1048d9cd 100644 (file)
@@ -35,9 +35,6 @@ public:
     void start() Q_DECL_OVERRIDE;
     bool finished() Q_DECL_OVERRIDE;
 
-    QString errorString();
-    bool timedOut() { return _timedout; }
-
 signals:
     void finishedSignal();
 };
index 62dd386fd1e4e6141f89d1da8bf737ead7596723..66f8bf0ef464b1290b34535e8866c9b235f5e2cc 100644 (file)
@@ -101,14 +101,6 @@ void PUTFileJob::start() {
     AbstractNetworkJob::start();
 }
 
-void PUTFileJob::slotTimeout() {
-    qDebug() << "Timeout" << (reply() ? reply()->request().url() : path());
-    if (!reply())
-        return;
-    _errorString =  tr("Connection Timeout");
-    reply()->abort();
-}
-
 #if QT_VERSION < QT_VERSION_CHECK(5, 4, 2)
 void PUTFileJob::slotSoftAbort() {
     reply()->setProperty(owncloudShouldSoftCancelPropertyName, true);
@@ -133,11 +125,7 @@ bool PollJob::finished()
     if (err != QNetworkReply::NoError) {
         _item->_httpErrorCode = reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
         _item->_status = classifyError(err, _item->_httpErrorCode);
-        _item->_errorString = reply()->errorString();
-
-        if (reply()->hasRawHeader("OC-ErrorString")) {
-            _item->_errorString = reply()->rawHeader("OC-ErrorString");
-        }
+        _item->_errorString = errorString();
 
         if (_item->_status == SyncFileItem::FatalError || _item->_httpErrorCode >= 400) {
             if (_item->_status != SyncFileItem::FatalError
index c031602bc9010f6bdfeb3ea3c8fa6ce3b265293a..969b6709a5c74a908df74e073096b830a680866d 100644 (file)
@@ -120,16 +120,13 @@ public:
     }
 
     QString errorString() {
-        return _errorString.isEmpty() ? reply()->errorString() : _errorString;
+        return _errorString.isEmpty() ? AbstractNetworkJob::errorString() : _errorString;
     }
 
-    virtual void slotTimeout() Q_DECL_OVERRIDE;
-
     quint64 msSinceStart() const {
         return _requestTimer.elapsed();
     }
 
-
 signals:
     void finishedSignal();
     void uploadProgress(qint64,qint64);
@@ -160,12 +157,6 @@ public:
 
     void start() Q_DECL_OVERRIDE;
     bool finished() Q_DECL_OVERRIDE;
-    void slotTimeout() Q_DECL_OVERRIDE {
-//      emit finishedSignal(false);
-//      deleteLater();
-        qDebug() << Q_FUNC_INFO;
-        reply()->abort();
-    }
 
 signals:
     void finishedSignal();
index 300c0eec1876d8cf993c1260d8ed5332b86f86c1..163014234128c23613ab1584a67c45736a4867bf 100644 (file)
@@ -178,8 +178,7 @@ void PropagateUploadFileNG::slotPropfindFinishedWithError()
     auto status = classifyError(err, httpErrorCode, &propagator()->_anotherSyncNeeded);
     if (status == SyncFileItem::FatalError) {
         propagator()->_activeJobList.removeOne(this);
-        QString errorString = errorMessage(job->reply()->errorString(), job->reply()->readAll());
-        abortWithError(status, errorString);
+        abortWithError(status, job->errorStringParsingBody());
         return;
     }
     startNewUpload();
@@ -254,11 +253,7 @@ void PropagateUploadFileNG::slotMkColFinished(QNetworkReply::NetworkError)
     if (err != QNetworkReply::NoError || _item->_httpErrorCode != 201) {
         SyncFileItem::Status status = classifyError(err, _item->_httpErrorCode,
                                                     &propagator()->_anotherSyncNeeded);
-        QString errorString = errorMessage(job->reply()->errorString(), job->reply()->readAll());
-        if (job->reply()->hasRawHeader("OC-ErrorString")) {
-            errorString = job->reply()->rawHeader("OC-ErrorString");
-        }
-        abortWithError(status, errorString);
+        abortWithError(status, job->errorStringParsingBody());
         return;
     }
     startNextChunk();
@@ -351,7 +346,7 @@ void PropagateUploadFileNG::slotPutFinished()
 
     qDebug() << job->reply()->request().url() << "FINISHED WITH STATUS"
              << job->reply()->error()
-             << (job->reply()->error() == QNetworkReply::NoError ? QLatin1String("") : job->reply()->errorString())
+             << (job->reply()->error() == QNetworkReply::NoError ? QLatin1String("") : job->errorString())
              << job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute)
              << job->reply()->attribute(QNetworkRequest::HttpReasonPhraseAttribute);
 
@@ -377,13 +372,9 @@ void PropagateUploadFileNG::slotPutFinished()
 
     if (err != QNetworkReply::NoError) {
         _item->_httpErrorCode = job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
-        QByteArray replyContent = job->reply()->readAll();
+        QByteArray replyContent;
+        QString errorString = job->errorStringParsingBody(&replyContent);
         qDebug() << replyContent; // display the XML error in the debug
-        QString errorString = errorMessage(job->errorString(), replyContent);
-
-        if (job->reply()->hasRawHeader("OC-ErrorString")) {
-            errorString = job->reply()->rawHeader("OC-ErrorString");
-        }
 
         // Ensure errors that should eventually reset the chunked upload are tracked.
         checkResettingErrors();
@@ -487,8 +478,7 @@ void PropagateUploadFileNG::slotMoveJobFinished()
 
         SyncFileItem::Status status = classifyError(err, _item->_httpErrorCode,
                                                     &propagator()->_anotherSyncNeeded);
-        QString errorString = errorMessage(job->errorString(), job->reply()->readAll());
-        abortWithError(status, errorString);
+        abortWithError(status, job->errorStringParsingBody());
         return;
     }
     if (_item->_httpErrorCode != 201 && _item->_httpErrorCode != 204) {
index 38325c6acf0114094c7e1f213b8c3814999e5c52..308294e420248c13b80fe5a48cb84f154a0b3a13 100644 (file)
@@ -178,7 +178,7 @@ void PropagateUploadFileV1::slotPutFinished()
 
     qDebug() << Q_FUNC_INFO << job->reply()->request().url() << "FINISHED WITH STATUS"
              << job->reply()->error()
-             << (job->reply()->error() == QNetworkReply::NoError ? QLatin1String("") : job->reply()->errorString())
+             << (job->reply()->error() == QNetworkReply::NoError ? QLatin1String("") : job->errorString())
              << job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute)
              << job->reply()->attribute(QNetworkRequest::HttpReasonPhraseAttribute);
 
@@ -208,13 +208,9 @@ void PropagateUploadFileV1::slotPutFinished()
                "It is restored and your edit is in the conflict file."))) {
             return;
         }
-        QByteArray replyContent = job->reply()->readAll();
+        QByteArray replyContent;
+        QString errorString = job->errorStringParsingBody(&replyContent);
         qDebug() << replyContent; // display the XML error in the debug
-        QString errorString = errorMessage(job->errorString(), replyContent);
-
-        if (job->reply()->hasRawHeader("OC-ErrorString")) {
-            errorString = job->reply()->rawHeader("OC-ErrorString");
-        }
 
         if (_item->_httpErrorCode == 412) {
             // Precondition Failed: Either an etag or a checksum mismatch.