Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Update: Forum Guidelines & Code of Conduct

    [QNetworkAccessManager + QNetworkCookieJar] Cookies are not saved

    General and Desktop
    2
    2
    3540
    Loading More Posts
    • 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
      CodeBus last edited by

      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 Reply Quote 0
      • R
        rich last edited by

        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 Reply Quote 0
        • First post
          Last post