user2651976
user2651976

Reputation: 39

Why is my custom cookiejar not working?

I need to load cookie from local disk via qnetworkcookiejar, but it does not work when I try it. Here is my code:

    QNetworkCookieJar *cookieJar = new QNetworkCookieJar;
    QFile file("d:/cookie.txt");
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    QTextStream in(&file);
    while (!in.atEnd()) {
        QString line = in.readLine();
        QList<QNetworkCookie> cookie = QNetworkCookie::parseCookies(line.toLocal8Bit());
        foreach (QNetworkCookie c, cookie) {
            qDebug() << cookieJar->insertCookie(c);
        }
    }
    QUrl url = QUrl(QString("http://www.renren.com/"));

    QWebView view;
    QWebInspector inspector;
    inspector.setPage(view.page());
    view.settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
    view.settings()->setAttribute(QWebSettings::PrivateBrowsingEnabled, false);

    QNetworkAccessManager *manager = new QNetworkAccessManager;
    manager->setCookieJar(cookieJar);
    view.page()->setNetworkAccessManager(manager);

    inspector.setVisible(true);
    view.show();
    QEventLoop loop;
    QObject::connect(&view, SIGNAL(loadFinished(bool)),
                     &loop, SLOT(quit()));
    view.load(QString("http://www.renren.com"));

the content of d:/cookie.txt:

    anonymid=hqazrdfcujqlcw; expires=Thu, 10-Jan-2019 14:50:55 GMT; domain=.renren.com; path=/
    depovince=ZGQT; expires=Tue, 14-Jan-2014 14:50:55 GMT; domain=.renren.com; path=/
    jebecookies=1e67b394-5310-4ba3-899c-4bfe76a48eaf|||||; domain=.renren.com; path=/
    _r01_=1; expires=Tue, 06-Jan-2015 14:50:55 GMT; domain=.renren.com; path=/
    JSESSIONID=abc-myf8pCJA6hWBmYbou; domain=www.renren.com; path=/
    ick_login=f8c346c3-cfb3-48d6-9420-1762fab34171; domain=.renren.com; path=/
    UID=649f302-216.156.147.49-1389451858; expires=Fri, 01-Jan-2016 14:50:58 GMT; domain=.scorecardresearch.com; path=/
    UIDR=1389451858; expires=Fri, 01-Jan-2016 14:50:58 GMT; domain=.scorecardresearch.com; path=/
    _de=040F82A18DD5747B2955652844C08B9F34DF20B0B3AA6FF7; expires=Tue, 06-Jan-2015 14:51:37 GMT; domain=.renren.com; path=/
    p=1926b0e5257c8146601b4d063586f4c94; expires=Mon, 10-Feb-2014 14:51:37 GMT; domain=.renren.com; path=/
    ap=175034604; expires=Mon, 10-Feb-2014 14:51:37 GMT; domain=.renren.com; path=/
    first_login_flag=1; domain=.renren.com; path=/
    t=61569f309ee6301116241f66ab6d018e4; domain=.renren.com; path=/
    t=b83a0150ef41ddebd7f3937b11886a70; domain=.renren.com; path=/xtalk/
    societyguester=61569f309ee6301116241f66ab6d018e4; domain=.renren.com; path=/
    id=175034604; domain=.renren.com; path=/
    xnsid=7e369346; domain=.renren.com; path=/
    loginfrom=syshome; domain=.renren.com; path=/
    loginfrom=null; domain=.renren.com; path=/
    feedType=175034604_hot; expires=Mon, 10-Feb-2014 14:51:38 GMT; domain=.www.renren.com; path=/
    an_slot=115; domain=ebp.renren.com; path=/ebpn
    today=22.51; expires=Sat, 11-Jan-2014 15:59:59 GMT; domain=wpi.renren.com; path=/wtalk/

it seems no Cookie in webinspector when I load www.renren.com. Can some one help me?

Upvotes: 1

Views: 730

Answers (1)

Tob
Tob

Reputation: 286

following the Qt documentiatiuon you should inherit QNetworkCookieJar if you want to store cookies on the disk. In addition loading and saving is quite simple when you use QSettings. Here is me peristent version of a QNetworkCookieJar implementation:

.h

class CMyNetworkCookieJar : public QNetworkCookieJar
{
    Q_OBJECT

public:
    CMyNetworkCookieJar(QObject *p_pParent = NULL );
    ~CMyNetworkCookieJar( void );

    bool setCookiesFromUrl(const QList<QNetworkCookie> & p_grCookieList, const QUrl & p_grUrl);
    QList<QNetworkCookie> cookiesForUrl( const QUrl & p_grUrl ) const;

    void loadCookies( void );
    void saveCookies( void );

protected:
    QSettings * m_pCookieStorage;
};

.cpp

CMyNetworkCookieJar::CMyNetworkCookieJar( QObject * p_pParent )
    : QNetworkCookieJar( p_pParent )
{
    m_pCookieStorage = new QSettings( QSettings::IniFormat,
                                  QSettings::UserScope,
                                  QApplication::organizationName(),
                                  QApplication::applicationName() );

    loadCookies();
}

CMyNetworkCookieJar::~CMyNetworkCookieJar()
{
    saveCookies();
    m_pCookieStorage->sync();

    delete m_pCookieStorage;
}

bool CMyNetworkCookieJar::setCookiesFromUrl(const QList<QNetworkCookie> & p_grCookieList, const QUrl &p_grUrl)
{
    return QNetworkCookieJar::setCookiesFromUrl( p_grCookieList, p_grUrl );
}

QList<QNetworkCookie> CMyNetworkCookieJar::cookiesForUrl(const QUrl &p_grUrl) const
{
    return QNetworkCookieJar::cookiesForUrl( p_grUrl );
}

void CMyNetworkCookieJar::loadCookies()
{
    QByteArray grCookies = m_pCookieStorage->value( "cookies" ).toByteArray();
    QList< QNetworkCookie > grCookieList = QNetworkCookie::parseCookies( grCookies );
    setAllCookies( grCookieList );
}


void CMyNetworkCookieJar::saveCookies()
{
    QList<QNetworkCookie> grCookieList = allCookies();
    QByteArray grCookies;

    foreach( QNetworkCookie grCookie, grCookieList )
    {
        if ( grCookie.isSessionCookie() == false )
        {
            grCookies.append( grCookie.toRawForm() );
            grCookies.append( "\n" );
        }
    }

    m_pCookieStorage->setValue( "cookies", grCookies );
}

Upvotes: 1

Related Questions