diff --git a/src/network/access/qhttp2connection.cpp b/src/network/access/qhttp2connection.cpp index f0d3c50956c..8e0b6cd6332 100644 --- a/src/network/access/qhttp2connection.cpp +++ b/src/network/access/qhttp2connection.cpp @@ -457,6 +457,8 @@ void QHttp2Stream::maybeResumeUpload() isUploadBlocked()); if (isUploadingDATA() && !isUploadBlocked()) internalSendDATA(); + else + getConnection()->m_blockedStreams.insert(streamID()); } /*! @@ -872,6 +874,10 @@ QHttp2Stream *QHttp2Connection::createStreamInternal_impl(quint32 streamID) stream = new QHttp2Stream(this, streamID); stream->m_recvWindow = streamInitialReceiveWindowSize; stream->m_sendWindow = streamInitialSendWindowSize; + + connect(stream, &QHttp2Stream::uploadBlocked, this, [this, stream] { + m_blockedStreams.insert(stream->streamID()); + }); return stream; } @@ -1721,10 +1727,13 @@ void QHttp2Connection::handleWINDOW_UPDATE() if (!valid || qAddOverflow(sessionSendWindowSize, qint32(delta), &sum)) return connectionError(PROTOCOL_ERROR, "WINDOW_UPDATE invalid delta"); sessionSendWindowSize = sum; - for (const auto &stream : std::as_const(m_streams)) { + + // Stream may have been unblocked, so maybe try to write again: + const auto blockedStreams = std::exchange(m_blockedStreams, {}); + for (quint32 blockedStreamID : blockedStreams) { + const QPointer stream = m_streams.value(blockedStreamID); if (!stream || !stream->isActive()) continue; - // Stream may have been unblocked, so maybe try to write again if (stream->isUploadingDATA() && !stream->isUploadBlocked()) QMetaObject::invokeMethod(stream, &QHttp2Stream::maybeResumeUpload, Qt::QueuedConnection); diff --git a/src/network/access/qhttp2connection_p.h b/src/network/access/qhttp2connection_p.h index d5984c79662..9c8470dda93 100644 --- a/src/network/access/qhttp2connection_p.h +++ b/src/network/access/qhttp2connection_p.h @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -324,6 +325,7 @@ private: QHttp2Configuration m_config; QHash> m_streams; + QSet m_blockedStreams; QHash m_promisedStreams; QList m_resetStreamIDs;