[QNetworkAccessManager + QNetworkCookieJar] Cookies are not saved
-
Hello!
Objective: To load different pages of one site, with the ability to use previously issued cookieThe simplest application loads the page from localhost.
@#include <QtCore>
#include <QApplication>
#include <QDebug>
#include <QtNetwork>class MyCookieJar : public QNetworkCookieJar
{
public:
QList<QNetworkCookie> getAllCookies() { return allCookies(); }
};class CookiesTest : public QObject
{
Q_OBJECT
public:
CookiesTest(QWidget* parent = 0);private slots: void replyFinished(QNetworkReply*); private: QNetworkAccessManager* manager; MyCookieJar *cookieJar; };
CookiesTest::CookiesTest(QWidget* parent)
{
manager = new QNetworkAccessManager;
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));cookieJar = new MyCookieJar; manager->setCookieJar(cookieJar); manager->get(QNetworkRequest(QUrl("http://test1.ru/test/cookie.php"))); manager->get(QNetworkRequest(QUrl("http://test1.ru/test/cookie.php")));
}
void CookiesTest::replyFinished(QNetworkReply* reply)
{
qDebug() << reply->readAll();
qDebug() << "getAllCookies: " << cookieJar->getAllCookies();
}int main(int argc, char* argv[])
{
QApplication app(argc, argv);
CookiesTest cookiesTest;
return app.exec();
}#include "main.moc"@
in the file .pro: QT += network
File cookie.php shows number of visits that page on the analysis of the cookie
@<?php
if (isset($_COOKIE['Mortal'])) $cnt = $_COOKIE['Mortal'] + 1;
else $cnt = 1;setcookie("Mortal",$cnt,0x6FFFFFFF);
echo "NUM: [".@$_COOKIE['Mortal']."]";
?>@Output:
bq. "NUM: []"
getAllCookies: (QNetworkCookie("Mortal=1; expires=Wed, 18-Jul-2029 05:49:51 GMT; domain=test1.ru; path=/test/") )
"NUM: []"
getAllCookies: (QNetworkCookie("Mortal=1; expires=Wed, 18-Jul-2029 05:49:51 GMT; domain=test1.ru; path=/test/") )Although to be the second time in brackets the number 1 and the second getAllCookies: Mortal = 2
Tell me please, where was the mistake, what's wrong? Why cookies are not stored on the 2nd request
-
QNetworkManager can perform several requests at the same time. You have done nothing to make sure that your two http requests are not performed in parallel. Rather than creating your two requests at the same time, make the second one be created when the first one has completed. At the moment, your code inherently contains a race condition which means the behaviour is likely to be unpredictable. I'm not saying this is definitely what's happening here, just that unless you address this it's not going to be possible to determine what the code should do.