Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ установка куков в QNetworkAccessManager вручную

Автор: eldar85 21.9.2010, 21:31

Как можно установить куки вручную, строкой а не с помощью того что не видно типа setCookieJar который распологает куки в каком то невидемом файле. Мне нужно что то типа такого как в курле

curl_easy_setopt(curl, CURLOPT_COOKIE, cookie.c_str());

где cookie.c_str() и есть куки которые мы спарсили.
не могу понять систему формирования хидера в QNetworkAccessManager .
Заранее благодарю за ответы)

вот есть такой код закачивает страницу, но мне нужно скачивать картинку с куками установленными(выпарсенными) из хидера и чтобы его спокойно можно было вставить в куки при загрузки страницы и не бояться что будет использована не та кука) очень нужно имено так сделать.

 QEventLoop loop;
           QNetworkAccessManager manager;
           QNetworkReply *reply = manager.get( QNetworkRequest( QUrl( "http://www.opennet.ru/docs/RUS/qt3_prog/c7638.html" ) ) );

           QObject::connect( reply, SIGNAL( finished() ), &loop, SLOT( quit() ) );
           loop.exec();

           qDebug() << reply->error() << reply->bytesAvailable();
           QByteArray buf = reply->readAll();
           QFile file( "save1.txt" );
           if( file.open( QIODevice::WriteOnly ) )
           {
                   file.write( buf );
           }




я так понимаю что все параметры хидера устанавливаются в
QNetworkRequest request;


Автор: eldar85 22.9.2010, 9:09

Ниужели никто не пользовался QNetworkAccessManager именно чтобы установить в нем полный хидер с реферером, куками...

вот это вот совсем не пойму как можно воткнуть в request

enum     KnownHeaders { ContentTypeHeader, ContentLengthHeader, LocationHeader, LastModifiedHeader, CookieHeader, SetCookieHeader }

Автор: kwisp 22.9.2010, 9:26

Цитата
void QNetworkRequest::setHeader ( KnownHeaders header, const QVariant & value )
Sets the value of the known header header to be value, overriding any previously set headers. This operation also sets the equivalent raw HTTP header.

See also KnownHeaders, setRawHeader(), and header().

не то?

Автор: eldar85 22.9.2010, 9:29

да это я читал, только разобраться все равно не могу, там ни одного примера... в сети такие примеры только с использованием курла, а хочется поработать с сетью с помощью Qt.
еще не могу установить так чтобы ответ сервера приходил не просто тело странички а еще и хидер странички.

вот пробую как то так

request.setRawHeader("ContentTypeHeader", "text/html; charset=utf-8");
    request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.8) Gecko/20100722 MRA 5.6 (build 03402) Firefox/3.6.8 (.NET CLR 3.5.30729) sputnik 2.0.1.41 WebMoney Advisor");


ну и тут же остальное но какой то бред получается....

Автор: kwisp 22.9.2010, 9:35

Цитата(eldar85 @ 22.9.2010, 10:28) *
еще не могу установить так чтобы ответ сервера приходил не просто тело странички а еще и хидер странички.

ну это ты брось!
методы QNetworkReplay:
Цитата
bool hasRawHeader ( const QByteArray & headerName ) const
QVariant header ( QNetworkRequest::KnownHeaders header ) const
QByteArray rawHeader ( const QByteArray & headerName ) const
QList<QByteArray> rawHeaderList () const

чего не понятного? изучай ассистент и вперед.

Цитата(eldar85 @ 22.9.2010, 10:29) *
но какой то бред получается....

какой бред?
почему из тебя всё надо выпытывать?

П.С.
знаешь такой анекдот есть:
Больной:
-Доктор у меня что-то болит где-то вот здесь.
Доктор:
-Очень хорошо, сейчас я вам выпишу какое-то лекарство!

Автор: eldar85 22.9.2010, 9:48

)))))) да пользуюсь я асистентом но не пойму как это написать, примеров там нет а додумать не получается, потому и спрашиваю сдесь

вот есть код

    QEventLoop loop;
    QNetworkAccessManager manager;
    QNetworkRequest request;



    request.setUrl(QUrl("http://www.google.ru"));
    request.setRawHeader("Accept-Charset", "text/html; charset=utf-8");
    request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.8) Gecko/20100722 MRA 5.6 (build 03402) Firefox/3.6.8 (.NET CLR 3.5.30729) sputnik 2.0.1.41 WebMoney Advisor");
//куки как я понимаю можно вставить сдесь как я вставил юзер агента
    
    
    QNetworkReply *reply = manager.get( request );
    QObject::connect( reply, SIGNAL( finished() ), &loop, SLOT( quit() ) );

    loop.exec();

    qDebug() << reply->error() << reply->bytesAvailable();

    QByteArray buf = reply->readAll();
    ui->textBrowser->setText(buf);


мне нужно чтобы он возращал ответ странички с хидером и чтобы я мог установить в него куки. пока ответ приходит лишь голая страничка без хидера.

Автор: Litkevich Yuriy 22.9.2010, 10:02

http://www.qtcentre.org/threads/17564-file-upload-using-QNetworkRequest-amp-QNetworkAccessManager какой-то пример

Автор: kwisp 22.9.2010, 10:11

Цитата(eldar85 @ 22.9.2010, 10:48) *
пока ответ приходит лишь голая страничка без хидера.

Цитата(kwisp @ 22.9.2010, 10:35) *
у это ты брось!
методы QNetworkReplay:
Цитата
bool hasRawHeader ( const QByteArray & headerName ) const
QVariant header ( QNetworkRequest::KnownHeaders header ) const
QByteArray rawHeader ( const QByteArray & headerName ) const
QList<QByteArray> rawHeaderList () const


Автор: eldar85 22.9.2010, 11:44

Вот так вот выставляется хидер, можно сюда еще добавить значений которые известны.

request.setUrl(QUrl("http://....));
    request.setRawHeader("Accept-Charset", "windows-1251,utf-8;q=0.7,*;q=0.7");
    request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.8) Gecko/20100722 MRA 5.6 (build 03402) Firefox/3.6.8 (.NET CLR 3.5.30729) sputnik 2.0.1.41 WebMoney Advisor");
    request.setRawHeader("Cookie", "....");


осталось понять как парсить куки

вот эта строка
QList<QByteArray> rawHeaderList () const

взращает только названия типа
"User-Agent", "Cookie", "Host" ....
но само значение не показывает.
bool hasRawHeader ( const QByteArray & headerName ) const

это просто показывает вернулся ли заголовок или его вообще нет.


а вот эти два не пойму как использовать
QVariant header ( QNetworkRequest::KnownHeaders header ) const
QByteArray rawHeader ( const QByteArray & headerName ) const

Автор: eldar85 22.9.2010, 13:09

что в него то вписывать

reply->rawHeader (а тут что писать то???);


qDebug() << reply->rawHeader("Set-Cookie");

поиск нужного в хидере производиться вот так, то что нужно искать берется из снифера и вставляется в этот код. Эта строка кода вернет нам значение Set-Cookie

Автор: Litkevich Yuriy 22.9.2010, 15:09

Цитата(eldar85 @ 22.9.2010, 15:44) *
взращает только названия типа
"User-Agent", "Cookie", "Host" ....
но само значение не показывает.
Судя по документации:
rawHeaderList() - возвращает список заголовков, а
rawHeader(const QByteArray &headerName) - возвращает необработанные данные указанного заголовка.
(http://doc.crossplatform.ru/qt/4.6.x/qnetworkreply.html#rawHeaderList)

Автор: eldar85 22.9.2010, 16:48

ну да примерно как то так и работает) в принципи я разобрался со всем чем хотел)) спасибо за помощь)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)