Russian Qt Forum
Ноябрь 24, 2024, 01:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: как чистить QNetworkAccessManager  (Прочитано 16824 раз)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #15 : Декабрь 26, 2010, 01:47 »

Да я особо-то и не помог, разве что простой пример по кукизам привёл.
Только сейчас, честно говоря, понял что вопрос состоял в том, чтобы по сути "залогиниться не разлогиниваясь". Мдя(
Если сессия не хранится у них на сервере, тогда, конечно, дело намного упрощается, достаточно кукизы почистить.
« Последнее редактирование: Декабрь 26, 2010, 01:50 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
eldar85
Гость
« Ответ #16 : Декабрь 26, 2010, 11:48 »

чет я вообще запутался в примере, он написан для QWebView же? я его вообще не использую, мне нужно выпарсить из страницы только часть информации и выдать на экран. поэтому я загружаю страницу менеджером в QByteArray и парсю его.
Вы не могли бы попдправить этот пример для работы имено с менеджером без QWebView? я сейчас начал и жесть полная, только начал с сетью работать с кьюти и путаюсь еще сильно очень.

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

к примеру при логине вызвал функцию getCookie() получил куки и потом там где нужно сделал setCookie(...) и подстваил куки там где нужно. Заранее благодарю)
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #17 : Декабрь 26, 2010, 20:32 »

...он написан для QWebView же?...
Нет, он написан для networkAccessManager, по коду же видно, что этот метод (setCookieJar()) используется именно им, а не qwebview. А взят манагер по указателю из qwebview или нет, это уже неважно.

мне нужно так, логиниться аккаунт, получает куки и потом если что то нужно (к примеру еще какую то страничку загрузить с этим аккаунтом то вставляет эти куки и заходит на страничку) то подставлять их по ходу работы проги.
да, и это должно делаться без проблем. Где именно непонятно? У меня похожий проект был, кукизы для удобства сохранял в локальную БД sqlite, оттуда и извлекал при надобности.
« Последнее редактирование: Декабрь 26, 2010, 20:40 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
eldar85
Гость
« Ответ #18 : Декабрь 27, 2010, 14:17 »

я разобрался)) спасибо еще раз))
Записан
eldar85
Гость
« Ответ #19 : Декабрь 28, 2010, 12:33 »

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

Код:
manager.setProxy(QNetworkProxy(QNetworkProxy::HttpProxy, "1111111", "8080"));

а во втором логине к примеру прокси издохлась или хочу другую поставить то мне так же вызвать эти же методы
Код:
manager.setProxy(QNetworkProxy(QNetworkProxy::HttpProxy, "2222222", "80"));
или до их вызова это тоже все как то почистить нужно?
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #20 : Декабрь 28, 2010, 16:48 »

если ты хочешь чтобы сайт думал, что новый ip это типа новый юзер, то лучше кукизы чистить. Только ты не забывай и про остальные заголовки, которые тоже надо менять, если уж делать)). Такие как user-agent, referrer и т.п.
« Последнее редактирование: Декабрь 28, 2010, 16:50 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
eldar85
Гость
« Ответ #21 : Декабрь 29, 2010, 02:12 »

понятно, а вот такая очистка кукисов
Код:
manager->setCookieJar(new QNetworkCookieJar());
не засоряет память? очистку нужно как то делать после new QNetworkCookieJar() Непонимающий
А то у меня где то немного течет память, вот не могу пока найти где.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #22 : Декабрь 29, 2010, 15:22 »

Естесстно надо чистить, ты же создаёшь каждый раз новый объект. И скорей всего при зачистке манагера cookiejar по указателю не чистится, раз лики есть. Делай типа так:
Код
C++ (Qt)
QNetworkCookieJar p_cookiejar = new QNetworkCookieJar();
manager->setCookieJar(p_cookiejar);
 
//после юзания манагера
delete p_cookiejar;
p_cookiejar = new QNetworkCookieJar();
manager->setCookieJar(p_cookiejar);
//и т.п.
 
Это основы уже С++, а не Qt
« Последнее редактирование: Декабрь 29, 2010, 16:06 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
eldar85
Гость
« Ответ #23 : Декабрь 29, 2010, 16:23 »

да я знаю, потому и спрашиваю... спасибо)
Записан
eldar85
Гость
« Ответ #24 : Январь 18, 2011, 23:31 »

сделал функцию у класса работы с сетью resetCookie();

Код:
void as_network::resetCookie()
{
    delete jar;
    jar = new QNetworkCookieJar;
    manager.setCookieJar(jar); //вот на этой строке вылетает, причем не сразу, работает примерно несколько минут и бах

}

получаю вот эту ошибку
ASSERT: "d" in file ..\..\include/QtCore/../../src/corelib/tools/qscopedpointer.h, line 112
Записан
eldar85
Гость
« Ответ #25 : Январь 19, 2011, 16:00 »

а вот исходник QNetworkAccessManager.cpp
Код:
void QNetworkAccessManager::setCookieJar(QNetworkCookieJar *cookieJar)
{
    Q_D(QNetworkAccessManager);
    d->cookieJarCreated = true;
    if (d->cookieJar != cookieJar) {
        if (d->cookieJar && d->cookieJar->parent() == this)
            delete d->cookieJar;
        d->cookieJar = cookieJar;
        if (thread() == cookieJar->thread())
            d->cookieJar->setParent(this);
    }
}

получается в каких то случаях он удаляет сам куки... похоже в этом и проблема, когда я удаляю выделеную память, а он в некоторых случаях ее повторно пытается удалить - от этого наверное и вылетает, хотя вохможно я ошибаюсь, но судя по контексту так. Как же решить такую проблему???
Записан
eldar85
Гость
« Ответ #26 : Январь 20, 2011, 01:19 »

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

Код:
void as_network::deleteMyCookieJar()
{
    this->myJar->deleteLater();
    qApp->processEvents();
}

void as_network::resetCookie()
{
    deleteMyCookieJar();

    this->myJar = new QNetworkCookieJar();

    manager.setCookieJar(this->myJar);
}
Записан
SimpleSunny
Гость
« Ответ #27 : Январь 20, 2011, 03:36 »

А зачем ві сами удаляет, если Qt сама єто делает?

Код
C++ (Qt)
if (d->cookieJar != cookieJar) {
       if (d->cookieJar && d->cookieJar->parent() == this)
           delete d->cookieJar;
       d->cookieJar = cookieJar;
       if (thread() == cookieJar->thread())
           d->cookieJar->setParent(this);
   }
Записан
eldar85
Гость
« Ответ #28 : Январь 20, 2011, 13:01 »

Да что то я ночью тоже об этом подумал что это глупостью было)))просто у меня течь в программе сильная была и я винил в этом как раз эту фунцию, но оказалась что QNetworkReply при редиректе не очищалась.
 Если я правильно понимаю контекст то
тут
Код:
if (d->cookieJar != cookieJar)
проверяется равен ли d->cookieJar тому адресу памяти на который указывает cookieJar и если не равен идет дальше проверка
Код:
if (d->cookieJar && d->cookieJar->parent() == this)
на то - принадлежат ли эти адреса этому классу(то есть было ли это выделение памяти произведено именно этим классом), я правильно понял?
« Последнее редактирование: Январь 21, 2011, 13:57 от eldar85 » Записан
eldar85
Гость
« Ответ #29 : Январь 20, 2011, 14:00 »

такой вариант вполне отлично работает
Код:
void as_network::resetCookie()
{
    manager.setCookieJar(new QNetworkCookieJar());
}

Вы случайно не знаете чем лучше в Qt ослеживать выделенную и удаленную память?
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.131 секунд. Запросов: 22.