Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. [QNetworkAccessManager + QNetworkCookieJar] Cookies are not saved
Forum Updated to NodeBB v4.3 + New Features

[QNetworkAccessManager + QNetworkCookieJar] Cookies are not saved

Scheduled Pinned Locked Moved General and Desktop
2 Posts 2 Posters 3.7k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • C Offline
    C Offline
    CodeBus
    wrote on last edited by
    #1

    Hello!
    Objective: To load different pages of one site, with the ability to use previously issued cookie

    The 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

    1 Reply Last reply
    0
    • R Offline
      R Offline
      rich
      wrote on last edited by
      #2

      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.

      1 Reply Last reply
      0

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved