File qt5-more-fixes-regarding-server-closing-connection.patch of Package mingw32-libqt5-qtbase

commit 824865b0df44f9cb1749057e30c8c8034ee477a5
Author: Markus Goetz <markus@woboq.com>
Date:   Fri Jul 24 09:53:20 2015 +0200

    QNAM: More fixes regarding server closing connection
    
    The _q_readyRead can also come in other cases because we implemented
    it so that bandwidth limited reading can be implemented.
    This can lead to a race if the socket is closing at the specific moment
    and deadlock the channel.
    The fix in QHttpProtocolaHandler checks if there is actually bytes available to read.
    
    The fix in the HTTP channel needs to be done to properly finish the reply,
    
    Change-Id: I19ce2ae595f91d56386cc7406ccacc9935672b6b

diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp
index e2f6307..d9cea15 100644
--- a/src/network/access/qhttpnetworkconnectionchannel.cpp
+++ b/src/network/access/qhttpnetworkconnectionchannel.cpp
@@ -826,11 +826,15 @@ void QHttpNetworkConnectionChannel::_q_error(QAbstractSocket::SocketError socket
 
             if (!reply->d_func()->expectContent()) {
                 // No content expected, this is a valid way to have the connection closed by the server
+                // We need to invoke this asynchronously to make sure the state() of the socket is on QAbstractSocket::UnconnectedState
+                QMetaObject::invokeMethod(this, "_q_receiveReply", Qt::QueuedConnection);
                 return;
             }
             if (reply->contentLength() == -1 && !reply->d_func()->isChunked()) {
                 // There was no content-length header and it's not chunked encoding,
                 // so this is a valid way to have the connection closed by the server
+                // We need to invoke this asynchronously to make sure the state() of the socket is on QAbstractSocket::UnconnectedState
+                QMetaObject::invokeMethod(this, "_q_receiveReply", Qt::QueuedConnection);
                 return;
             }
             // ok, we got a disconnect even though we did not expect it
diff --git a/src/network/access/qhttpprotocolhandler.cpp b/src/network/access/qhttpprotocolhandler.cpp
index 380aaac..174c4bb 100644
--- a/src/network/access/qhttpprotocolhandler.cpp
+++ b/src/network/access/qhttpprotocolhandler.cpp
@@ -237,7 +237,12 @@ void QHttpProtocolHandler::_q_readyRead()
     }
 
     if (m_channel->isSocketWaiting() || m_channel->isSocketReading()) {
-        m_channel->state = QHttpNetworkConnectionChannel::ReadingState;
+        if (m_socket->bytesAvailable()) {
+            // We might get a spurious call from readMoreLater()
+            // call of the QHttpNetworkConnection even while the socket is disconnecting.
+            // Therefore check if there is actually bytes available before changing the channel state.
+            m_channel->state = QHttpNetworkConnectionChannel::ReadingState;
+        }
         if (m_reply)
             _q_receiveReply();
     }

openSUSE Build Service is sponsored by