Russian Qt Forum

Qt => Работа с сетью => Тема начата: ivanmara от Декабрь 12, 2014, 20:12



Название: Получение cookies с сервера http. Help!
Отправлено: ivanmara от Декабрь 12, 2014, 20:12
Добрый день. Решил в рамках изучения QT написать простенький http клиент. Получается получать ответ сервера. С этим вопросов нет. но когда начинаю работать с cookies получается полная неопределенность. Открываю firefox в нем firebug. Начинаю смотреть сколько куки пришло и сравнивать с прогой на Qt. Допустим скажем c ya.ru в firebug для домена прилетают 4 куки, а в программе показывает что пришла только одна. Или скажем для www.elite-games.ru вообще ни одной куки не поступает. Сначала подумал что сервер не может определить user-agenta. В программе прямо указал закос под firefox. Но всё равно тоже самое. Не могу разобраться может кто подскажет что я делаю не так? Тестовый исходник с проектом (qt .5.3) прилагается как и сам код.

Код:
#include <QCoreApplication>
#include <QDebug>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QUrlQuery>
#include <QNetworkCookieJar>
#include <QList>
#include <QNetworkCookie>


void sendRequest();

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    sendRequest();
    return a.exec();
}

void sendRequest(){

    // create custom temporary event loop on stack
    QEventLoop eventLoop;

    // "quit()" the event-loop, when the network request "finished()"
    QNetworkAccessManager mgr;
    QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));

    // the HTTP request
    QNetworkRequest req;

    QUrl url = QUrl("http://www.elite-games.ru");

    req.setUrl(url);
    req.setRawHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0");

    QNetworkReply *reply = mgr.get(req);
    eventLoop.exec(); // blocks stack until "finished()" has been called

    QByteArray bytearray;

    if (reply->error() == QNetworkReply::NoError)
    {
        //succes
        QList<QNetworkCookie> cookies = mgr.cookieJar()->cookiesForUrl(url);
        //qDebug() << "COOKIES for" << url.host() << cookies2;

        for( int i = 0; i < cookies.count(); ++i )
            qDebug() << cookies[i] << endl << endl;

        qDebug() << "COOKIES count: " <<  cookies.count();

        bytearray = reply->readAll();

        qDebug() << "Success. Bytes recived: " << bytearray.size();
        delete reply;
    }
    else
    {
        //failure
        qDebug() << "Failure" << reply->errorString();
        delete reply;
    }
}



Название: Re: Получение cookies с сервера http. Help!
Отправлено: ivanmara от Декабрь 14, 2014, 17:47
Народ  протестируйте плиз. Возможно баг в самих qt либах.


Название: Re: Получение cookies с сервера http. Help!
Отправлено: Bepec от Декабрь 15, 2014, 18:02
Лень, двигатель прогресса и данный форум не исключение :D
Если вспомню то вечером посмотрю.


Название: Re: Получение cookies с сервера http. Help!
Отправлено: ivanmara от Декабрь 15, 2014, 20:28
Лень, двигатель прогресса и данный форум не исключение :D
Если вспомню то вечером посмотрю.

Жду ...


Название: Re: Получение cookies с сервера http. Help!
Отправлено: Bepec от Декабрь 15, 2014, 20:52
Напоминать это правильно :D


Название: Re: Получение cookies с сервера http. Help!
Отправлено: Bepec от Декабрь 15, 2014, 21:18
Код у вас правильный и работающий.
Вы не учитываете, на мой взгляд, достаточно вескую деталь - браузер принимая страничку, сразу же выполняет скрипты и прочую фигню на страничке, соответственно при их помощи может получить дополнительные куки.

А QNAM не выполняет ничего, он просто получает текст. Так что не парьтесь. Ну ещё у вас есть возможность при желании считать все скрипты и выполнить их.