SPDY must handle destoyed QNetworkReply
A QNetworkReply may be deleted before it is closed by the protocol. Since QSpdyProtocolHandler tracks pointers to QNetworkReplies it must keep track of their destruction as well to avoid links to deleted objects. This fixes the last issue with SPDY access of Google Mail in QtWebKit. Change-Id: I2c56dc080fdcb249b6ed9189fef84cbbc1220cbd Reviewed-by: Peter Hartmann <phartmann@blackberry.com>
This commit is contained in:
parent
a83498299a
commit
ce909a138a
@ -309,11 +309,13 @@ bool QSpdyProtocolHandler::sendRequest()
|
|||||||
|
|
||||||
currentReply->setSpdyWasUsed(true);
|
currentReply->setSpdyWasUsed(true);
|
||||||
qint32 streamID = generateNextStreamID();
|
qint32 streamID = generateNextStreamID();
|
||||||
|
currentReply->setProperty("SPDYStreamID", streamID);
|
||||||
|
|
||||||
currentReply->setRequest(currentRequest);
|
currentReply->setRequest(currentRequest);
|
||||||
currentReply->d_func()->connection = m_connection;
|
currentReply->d_func()->connection = m_connection;
|
||||||
currentReply->d_func()->connectionChannel = m_channel;
|
currentReply->d_func()->connectionChannel = m_channel;
|
||||||
m_inFlightStreams.insert(streamID, currentPair);
|
m_inFlightStreams.insert(streamID, currentPair);
|
||||||
|
connect(currentReply, SIGNAL(destroyed(QObject*)), this, SLOT(_q_replyDestroyed(QObject*)));
|
||||||
|
|
||||||
sendSYN_STREAM(currentPair, streamID, /* associatedToStreamID = */ 0);
|
sendSYN_STREAM(currentPair, streamID, /* associatedToStreamID = */ 0);
|
||||||
int requestsRemoved = m_channel->spdyRequestsToSend.remove(
|
int requestsRemoved = m_channel->spdyRequestsToSend.remove(
|
||||||
@ -325,6 +327,13 @@ bool QSpdyProtocolHandler::sendRequest()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QSpdyProtocolHandler::_q_replyDestroyed(QObject* reply)
|
||||||
|
{
|
||||||
|
qint32 streamID = reply->property("SPDYStreamID").toInt();
|
||||||
|
if (m_inFlightStreams.remove(streamID))
|
||||||
|
sendRST_STREAM(streamID, RST_STREAM_CANCEL);
|
||||||
|
}
|
||||||
|
|
||||||
void QSpdyProtocolHandler::_q_receiveReply()
|
void QSpdyProtocolHandler::_q_receiveReply()
|
||||||
{
|
{
|
||||||
Q_ASSERT(m_socket);
|
Q_ASSERT(m_socket);
|
||||||
|
@ -108,6 +108,7 @@ public:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void _q_uploadDataReadyRead();
|
void _q_uploadDataReadyRead();
|
||||||
|
void _q_replyDestroyed(QObject*);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user