diff --git a/src/network/networkexchange.cpp b/src/network/networkexchange.cpp index 8286fc8..752232d 100644 --- a/src/network/networkexchange.cpp +++ b/src/network/networkexchange.cpp @@ -36,6 +36,7 @@ class NetworkExchangePrivate QList urlsVisited; qint32 maxRedirects; + QNetworkReply::NetworkError error; QString errorString; }; @@ -139,11 +140,21 @@ void NetworkExchange::setNetworkAccessManager(QNetworkAccessManager *manager) d_ptr->netAccessManager = manager; } +QNetworkReply::NetworkError NetworkExchange::error() const +{ + return d_ptr->error; +} + QString NetworkExchange::errorString() const { return d_ptr->errorString; } +void NetworkExchange::setError(QNetworkReply::NetworkError code) +{ + d_ptr->error = code; +} + void NetworkExchange::setErrorString(const QString & str) { d_ptr->errorString = str; @@ -174,11 +185,13 @@ void NetworkExchange::onMetaDataChanged() redirectReply->abort(); if (d_ptr->urlsVisited.size() > d_ptr->maxRedirects) { + setError(QNetworkReply::ProtocolUnknownError); setErrorString("Too many redirections"); emit error(QNetworkReply::ProtocolUnknownError); emit finished(); return; } else if (d_ptr->urlsVisited.contains(url)) { + setError(QNetworkReply::ProtocolUnknownError); setErrorString("Infinite redirection loop detected"); emit error(QNetworkReply::ProtocolUnknownError); emit finished(); @@ -236,11 +249,13 @@ void NetworkExchange::onFinished() QNetworkReply *redirectReply = d_ptr->reply; if (d_ptr->urlsVisited.size() > d_ptr->maxRedirects) { + setError(QNetworkReply::ProtocolUnknownError); setErrorString("Too many redirections"); emit error(QNetworkReply::ProtocolUnknownError); emit finished(); return; } else if (d_ptr->urlsVisited.contains(url)) { + setError(QNetworkReply::ProtocolUnknownError); setErrorString("Infinite redirection loop detected"); emit error(QNetworkReply::ProtocolUnknownError); emit finished(); @@ -263,6 +278,7 @@ void NetworkExchange::onError(QNetworkReply::NetworkError code) // case, so finalizing the connection is deferred until then. // See: http://doc.trolltech.com/4.7/qnetworkreply.html#error-2 + setError(code); setErrorString(d_ptr->reply->errorString()); emit error(code); } @@ -284,7 +300,8 @@ NetworkExchangePrivate::NetworkExchangePrivate(NetworkExchange *q) method(GetMethod), reply(0), replyReceived(false), - maxRedirects(5) + maxRedirects(5), + error(QNetworkReply::NoError) { } diff --git a/src/network/networkexchange.h b/src/network/networkexchange.h index 2927e33..ecef608 100644 --- a/src/network/networkexchange.h +++ b/src/network/networkexchange.h @@ -36,6 +36,7 @@ class NetworkExchange : public QObject void setMaxRedirects(qint32 max); void setNetworkAccessManager(QNetworkAccessManager *manager); + QNetworkReply::NetworkError error() const; QString errorString() const; signals: @@ -48,6 +49,7 @@ class NetworkExchange : public QObject void error(QNetworkReply::NetworkError code); protected: + void setError(QNetworkReply::NetworkError code); void setErrorString(const QString & str); private slots: diff --git a/tests/auto/networkexchange/tst_networkexchange.cpp b/tests/auto/networkexchange/tst_networkexchange.cpp index a09d401..7696c6a 100644 --- a/tests/auto/networkexchange/tst_networkexchange.cpp +++ b/tests/auto/networkexchange/tst_networkexchange.cpp @@ -64,6 +64,7 @@ void tst_NetworkExchange::testGet() QCOMPARE(mExchange->replyAttribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(), QString("OK")); QCOMPARE(QString::fromUtf8(mExchange->replyRawHeader("Content-Type")), QString("text/plain")); QCOMPARE(QString::fromUtf8(mExchange->readAll()), QString("Hello World!")); + QCOMPARE(mExchange->error(), QNetworkReply::NoError); } void tst_NetworkExchange::testPost() @@ -96,6 +97,7 @@ void tst_NetworkExchange::testPost() QCOMPARE(mExchange->replyAttribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(), QString("OK")); QCOMPARE(QString::fromUtf8(mExchange->replyRawHeader("Content-Type")), QString("text/plain")); QCOMPARE(QString::fromUtf8(mExchange->readAll()), QString("Hello World!")); + QCOMPARE(mExchange->error(), QNetworkReply::NoError); } void tst_NetworkExchange::testRedirect() @@ -128,6 +130,7 @@ void tst_NetworkExchange::testRedirect() QCOMPARE(mExchange->replyAttribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(), QString("OK")); QCOMPARE(QString::fromUtf8(mExchange->replyRawHeader("Content-Type")), QString("text/plain")); QCOMPARE(QString::fromUtf8(mExchange->readAll()), QString("Hello World!")); + QCOMPARE(mExchange->error(), QNetworkReply::NoError); } void tst_NetworkExchange::testMultipleRedirects() @@ -160,6 +163,7 @@ void tst_NetworkExchange::testMultipleRedirects() QCOMPARE(mExchange->replyAttribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(), QString("OK")); QCOMPARE(QString::fromUtf8(mExchange->replyRawHeader("Content-Type")), QString("text/plain")); QCOMPARE(QString::fromUtf8(mExchange->readAll()), QString("Hello World!")); + QCOMPARE(mExchange->error(), QNetworkReply::NoError); } void tst_NetworkExchange::testMaxRedirects() @@ -193,6 +197,7 @@ void tst_NetworkExchange::testMaxRedirects() QCOMPARE(mExchange->replyAttribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(), QString("Found")); QCOMPARE(QString::fromUtf8(mExchange->replyRawHeader("Content-Type")), QString("application/json")); QCOMPARE(QString::fromUtf8(mExchange->readAll()), QString("{ \"redirect\": true }")); + QCOMPARE(mExchange->error(), QNetworkReply::ProtocolUnknownError); } void tst_NetworkExchange::testRedirectLoop() @@ -223,6 +228,7 @@ void tst_NetworkExchange::testRedirectLoop() QCOMPARE(mExchange->replyAttribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(), QString("Found")); QCOMPARE(QString::fromUtf8(mExchange->replyRawHeader("Content-Type")), QString("application/json")); QCOMPARE(QString::fromUtf8(mExchange->readAll()), QString("{ \"redirect\": true }")); + QCOMPARE(mExchange->error(), QNetworkReply::ProtocolUnknownError); } void tst_NetworkExchange::testErrorResponse() @@ -253,6 +259,7 @@ void tst_NetworkExchange::testErrorResponse() QCOMPARE(mExchange->replyAttribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(), QString("Internal Server Error")); QCOMPARE(QString::fromUtf8(mExchange->replyRawHeader("Content-Type")), QString("application/json")); QCOMPARE(QString::fromUtf8(mExchange->readAll()), QString("{ \"error\": \"something went wrong\" }")); + QCOMPARE(mExchange->error(), QNetworkReply::UnknownContentError); } QIODevice *tst_NetworkExchange::createIncomingData(const QNetworkRequest & req, QIODevice * outgoingData /* = 0 */)