Details
-
Bug
-
Resolution: Done
-
P2: Important
-
5.7.1
-
None
Description
On patform Ubuntu16.04 64 bit and RaspberryPi3
In one of my projects I noticed that; when I lose my internet connection and getting internet back a short time after that; the networkAccessibility keeps being nonAccessible.
After some debugging I noticed that in QNetworkAccessManager in createRequest a QDisabledNetworkReply was returned if networkAccessible == NotAccessible.
And that a new session is started after that. So that will only happen when networkAccessible != NotAccessible.
(loosely related: There could also be some bugs in that networkAccessibleChanged is not always fired when I disconnect my internet during a request but that is another issue I think of which I do not have more details)
I must note that in my build I also incorperated this patch meant for 5.6.3 on 5.7.1:
https://bugreports.qt.io/browse/QTBUG-57110
https://codereview.qt-project.org/#/c/176831/
I got my ability to create successfull requests back after switching those 2 parts of code. As it looks like to me that you need to have tried to open a session to determine if there is a connection possible.
Therefore i have here my patch (which also contains the change mentioned above) (I must say that I dont fully understands the whole networking stuff architecture because I have not studied that):
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp index 587ab27..ac2c19c 100644 --- a/src/network/access/qnetworkaccessmanager.cpp +++ b/src/network/access/qnetworkaccessmanager.cpp @@ -1161,12 +1161,6 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera } #ifndef QT_NO_BEARERMANAGEMENT - // Return a disabled network reply if network access is disabled. - // Except if the scheme is empty or file://. - if (d->networkAccessible == NotAccessible && !isLocalFile) { - return new QDisabledNetworkReply(this, req, op); - } - if (!d->networkSessionStrongRef && (d->initializeSession || !d->networkConfiguration.identifier().isEmpty())) { QNetworkConfigurationManager manager; if (!d->networkConfiguration.identifier().isEmpty()) { @@ -1183,6 +1177,12 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera d->initializeSession = false; } } + + // Return a disabled network reply if network access is disabled. + // Except if the scheme is empty or file://. + if (d->networkAccessible == NotAccessible && !isLocalFile) { + return new QDisabledNetworkReply(this, req, op); + } #endif QNetworkRequest request = req; @@ -1605,7 +1605,7 @@ void QNetworkAccessManagerPrivate::_q_networkSessionClosed() QObject::disconnect(networkSession.data(), SIGNAL(closed()), q, SLOT(_q_networkSessionClosed())); QObject::disconnect(networkSession.data(), SIGNAL(stateChanged(QNetworkSession::State)), q, SLOT(_q_networkSessionStateChanged(QNetworkSession::State))); - QObject::disconnect(networkSessionStrongRef.data(), SIGNAL(error(QNetworkSession::SessionError)), + QObject::disconnect(networkSession.data(), SIGNAL(error(QNetworkSession::SessionError)), q, SLOT(_q_networkSessionFailed(QNetworkSession::SessionError))); networkSessionStrongRef.clear();