HTTP2: fix crash from assertion

In general the protocolHandler isn't deleted unless
the channel is being destructed. So instead of reset()ing
the pointer we keep it around.

Also update the http2protocolhandler to mimic the http1
handler a little closer: shutting down the channel in
receiveReply if there's no reply/activeStreams, and not
calling receiveReply at all if there's no activeStreams.

Pick-to: 5.15
Change-Id: I702547f594deb6b0c1384068f7e93e560527e8e2
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
bb10
Mårten Nordheim 2020-11-18 11:44:59 +01:00
parent 2fab1971fe
commit 0b21c15b11
2 changed files with 7 additions and 2 deletions

View File

@ -264,7 +264,8 @@ void QHttp2ProtocolHandler::_q_uploadDataDestroyed(QObject *uploadData)
void QHttp2ProtocolHandler::_q_readyRead()
{
_q_receiveReply();
if (!goingAway || activeStreams.size())
_q_receiveReply();
}
void QHttp2ProtocolHandler::_q_receiveReply()
@ -272,6 +273,11 @@ void QHttp2ProtocolHandler::_q_receiveReply()
Q_ASSERT(m_socket);
Q_ASSERT(m_channel);
if (goingAway && activeStreams.isEmpty()) {
m_channel->close();
return;
}
while (!goingAway || activeStreams.size()) {
const auto result = frameReader.read(*m_socket);
switch (result) {

View File

@ -995,7 +995,6 @@ void QHttpNetworkConnectionChannel::_q_error(QAbstractSocket::SocketError socket
&& switchedToHttp2)) {
auto h2Handler = static_cast<QHttp2ProtocolHandler *>(protocolHandler.data());
h2Handler->handleConnectionClosure();
protocolHandler.reset();
}
}
return;