QNetworkDiskCache: Fix QNetworkDiskCache don't handle to set CookieHeader.

QNetworkDiskCache don't handle to set CookieHeader. so All Set-Cookie's value is invalid.
The root of cause is that metaDataChanged() don't work because of no slot for it.
Add the slot for it and renamed to _q_metaDataChanged.

Task-number: QTBUG-41514
Change-Id: I5cec017e59a1de69c6e89c0bc7209a73dcdc11da
Reviewed-by: Jeongmin Kim <jm86.kim@lge.com>
Reviewed-by: Jung Dong-Heon <clamp03@gmail.com>
Reviewed-by: Peter Hartmann <phartmann@blackberry.com>
This commit is contained in:
Jeongmin Kim 2014-09-24 18:51:21 +09:00
parent b5bbfad0a4
commit 1ff6c575ce
3 changed files with 43 additions and 5 deletions

View File

@ -1166,7 +1166,7 @@ void QNetworkReplyHttpImplPrivate::replyDownloadMetaData
setCachingEnabled(true);
}
metaDataChanged();
_q_metaDataChanged();
}
void QNetworkReplyHttpImplPrivate::replyDownloadProgressSlot(qint64 bytesReceived, qint64 bytesTotal)
@ -1359,7 +1359,7 @@ bool QNetworkReplyHttpImplPrivate::sendCacheContents(const QNetworkCacheMetaData
// This needs to be emitted in the event loop because it can be reached at
// the direct code path of qnam.get(...) before the user has a chance
// to connect any signals.
QMetaObject::invokeMethod(q, "metaDataChanged", Qt::QueuedConnection);
QMetaObject::invokeMethod(q, "_q_metaDataChanged", Qt::QueuedConnection);
QMetaObject::invokeMethod(q, "_q_cacheLoadReadyRead", Qt::QueuedConnection);
@ -1986,7 +1986,7 @@ void QNetworkReplyHttpImplPrivate::error(QNetworkReplyImpl::NetworkError code, c
emit q->error(code);
}
void QNetworkReplyHttpImplPrivate::metaDataChanged()
void QNetworkReplyHttpImplPrivate::_q_metaDataChanged()
{
// FIXME merge this with replyDownloadMetaData(); ?

View File

@ -124,6 +124,7 @@ public:
Q_PRIVATE_SLOT(d_func(), void uploadByteDeviceReadyReadSlot())
Q_PRIVATE_SLOT(d_func(), void emitReplyUploadProgress(qint64, qint64))
Q_PRIVATE_SLOT(d_func(), void _q_cacheSaveDeviceAboutToClose())
Q_PRIVATE_SLOT(d_func(), void _q_metaDataChanged())
#ifndef QT_NO_SSL
@ -175,7 +176,7 @@ public:
void finished();
void error(QNetworkReply::NetworkError code, const QString &errorString);
void _q_error(QNetworkReply::NetworkError code, const QString &errorString);
void metaDataChanged();
void _q_metaDataChanged();
void checkForRedirect(const int statusCode);

View File

@ -55,6 +55,7 @@ public slots:
void init();
void cleanup();
void accessAfterRemoveReadyReadSlot();
void setCookieHeaderMetaDataChangedSlot();
private slots:
void qnetworkdiskcache_data();
@ -68,6 +69,7 @@ private slots:
void metaData();
void remove();
void accessAfterRemove(); // QTBUG-17400
void setCookieHeader(); // QTBUG-41514
void setCacheDirectory_data();
void setCacheDirectory();
void updateMetaData();
@ -86,8 +88,9 @@ private slots:
private:
QTemporaryDir tempDir;
QUrl url; // used by accessAfterRemove()
QUrl url; // used by accessAfterRemove(), setCookieHeader()
QNetworkDiskCache *diskCache; // used by accessAfterRemove()
QNetworkAccessManager *manager; // used by setCookieHeader()
};
// FIXME same as in tst_qnetworkreply.cpp .. could be unified
@ -403,6 +406,40 @@ void tst_QNetworkDiskCache::accessAfterRemoveReadyReadSlot()
diskCache->remove(url); // this used to cause a crash later on
}
void tst_QNetworkDiskCache::setCookieHeader() // QTBUG-41514
{
SubQNetworkDiskCache *cache = new SubQNetworkDiskCache();
url = QUrl("http://www.foo.com/cookieTest.html");
QNetworkCacheMetaData metaData;
metaData.setUrl(url);
QNetworkCacheMetaData::RawHeaderList headers;
headers.append(QNetworkCacheMetaData::RawHeader("Set-Cookie", "aaa=bbb"));
metaData.setRawHeaders(headers);
metaData.setSaveToDisk(true);
cache->setupWithOne(tempDir.path(), url, metaData);
manager = new QNetworkAccessManager();
manager->setCache(cache);
QNetworkRequest request(url);
QNetworkReply *reply = manager->get(request);
connect(reply, SIGNAL(metaDataChanged()), this, SLOT(setCookieHeaderMetaDataChangedSlot()));
connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()));
QTestEventLoop::instance().enterLoop(5);
QVERIFY(!QTestEventLoop::instance().timeout());
reply->deleteLater();
manager->deleteLater();
}
void tst_QNetworkDiskCache::setCookieHeaderMetaDataChangedSlot()
{
QList<QNetworkCookie> actualCookieJar = manager->cookieJar()->cookiesForUrl(url);
QVERIFY(!actualCookieJar.empty());
}
void tst_QNetworkDiskCache::setCacheDirectory_data()
{
QTest::addColumn<QString>("cacheDir");