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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [решено] QWebKit & headers  (Прочитано 11000 раз)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« : Декабрь 08, 2009, 20:57 »

Загружаю куда-нибудь страницу (в QWebView, QWebPage, неважно). Можно ли перед загрузкой этой самой страницы указать желаемое значение хедера, например referer'а, чтобы страница не знала откуда я действительно пришёл - direct enter это или конкретный любой адрес?
К networkAccessManager() можно получить доступ через page():
webview1.page().networkAccessManager()
Но, насколько я понял, рефер подставить он не даёт(
Их, в принципе, можно задать через QNetworkRequest.setRawHeader(), но как ему "сказать" что эти хедеры нужно применить именно к моей загружаемой QWebView?
« Последнее редактирование: Декабрь 09, 2009, 16:48 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
sendevent
Гость
« Ответ #1 : Декабрь 08, 2009, 22:06 »

последнее предложение нифига не понял=) но "изменять реквесты" - можно, например, в QNetworkAccessManager::createRequest.
Код:
webview1.page().setNetworkAccessManager( m_pMyNetworkMgr );//-- есть доступ к траффику!
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #2 : Декабрь 08, 2009, 22:58 »

Зачем мне реквесты, мне реферы свои прописать нужно. А ты вообще про создание запроса говоришь.
У меня есть страница php, в которой например:
<?php
if (isset($_SERVER['HTTP_REFERER'])) echo "referer: ".$_SERVER['HTTP_REFERER'];
?>
Если я гружу её в qwebview, то рефера ессно не будет, сообщения тоже, потому что не было никакого перехода. Если поставить свой, то сообщение будет.
Для справки, рефер это урл, с которого пришли на текущий.
« Последнее редактирование: Декабрь 08, 2009, 23:00 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
sendevent
Гость
« Ответ #3 : Декабрь 09, 2009, 01:21 »

Цитировать
Для справки, рефер это <...>
Смеющийся спасибо, кэп!

Цитировать
Зачем мне реквесты, мне реферы свои прописать нужно.
не поверишь...
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #4 : Декабрь 09, 2009, 11:57 »

Цитировать
Для справки, рефер это <...>
Смеющийся спасибо, кэп!
Всегда пожалст.
Ну так какие ещё идеи насчёт прописи своего хедера для QWebView, а не создания отдельного запроса (просьба если отвечать, то по теме)?
« Последнее редактирование: Декабрь 09, 2009, 12:11 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
sendevent
Гость
« Ответ #5 : Декабрь 09, 2009, 12:44 »

абзац.
речи о создании реквостов и не было. речь идет об изменении уже созданных запросов.
ты ж вроде понимаешь, што реферер - это хидер в хттп-пакете. хттп-пакеты создаются вебкитом.
неужто не понятно, что если нету "QWebPage::setReferer( const QUrl& );", то чтобы добавить реферера (изменить юзер-агента и пр) - надо самому отлавливать хттп-пакеты вебкита перед отправкой и кастомизировать их?
Код:
/*virtual*/ QNetworkReply* MyNetworkAccessManager::createRequest( Operation op,
    const QNetworkRequest& req, QIODevice *outgoingData )
{
    QNetworkRequest myReq = cloneRequest( req );//-- copy data from const QNetworkRequest& req
    QString strUA = ...;//-- custom value for User-Agent
    QString strRef = ...;//-- custom value for Referer
    myReq.setRawHeader( "User-Agent", strUA.toUtf8() );
    myReq.setRawHeader( "Referer", strRef.toUtf8() );

    return QNetworkAccessManager::createRequest( op, myReq, outgoingData );
}
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #6 : Декабрь 09, 2009, 13:24 »

Я сразу не понял, что ты имел ввиду перегрузку метода, а QNetworkAccessManager::createRequest у меня проассоциировалось именно с созданием запроса.
В принципе изначально я расчитывал, что есть такой метод, который можно было бы применить по отношению к моей qwebpage (как отдельный метод networkAccessManager'а например) без перегрузки его метода createRequest(). Странно, конечно, что это можно делать только так. Тем не менее, спасибо, попробую
« Последнее редактирование: Декабрь 09, 2009, 15:27 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #7 : Декабрь 09, 2009, 16:54 »

Да, перегрузил его, заблаговременно унаследовав класс:
Код
Java
class CorrectNetworkAccessManager extends QNetworkAccessManager
{
 @Override
 protected QNetworkReply createRequest(Operation op, QNetworkRequest request, QIODevice outgoingData)
 {
   QNetworkRequest myReq = new QNetworkRequest(request);
   String strUA = "myAgent";
   String strRef = "http://www.prog.org.ru/index.php?topic=11629.msg71840#msg71840";
   myReq.setRawHeader( new QByteArray("User-Agent"), new QByteArray(strUA) );
   myReq.setRawHeader( new QByteArray("Referer"), new QByteArray(strRef) );
   return super.createRequest(op, myReq, outgoingData);
 }
}
 
В другом классе:
Код
Java
this.page.page().setNetworkAccessManager(new CorrectNetworkAccessManager());
this.page.load(url);
 
Всё ок, пасиб ещё раз, будет мне опыт на будущее (в прикладном прогр-нии я новичёк).
« Последнее редактирование: Декабрь 09, 2009, 17:18 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
sendevent
Гость
« Ответ #8 : Декабрь 09, 2009, 17:01 »

QWeb(View|Page) - предназначены для отображения контента, логично, что не предоставляют доступа к "низкоуровневым" аттрибутам хттп (хотя User-Agent'a можно переопределить в QWebPage).
кстати, обрати внимание: пришедший req может быть connect'ед с кем нибудь (самому смотреть лень), и при подобном "копировании" эти связи похерятся - возможно, лучше воспользоваться приведением типов.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #9 : Декабрь 09, 2009, 17:09 »

QWeb(View|Page) - предназначены для отображения контента, логично, что не предоставляют доступа к "низкоуровневым" аттрибутам хттп (хотя User-Agent'a можно переопределить в QWebPage).
Так дело в том, что можно установить даже прокси, хотя не прямыми методами QWebView, но qwebview.page().networkAccessManager().setProxy(); - увидел случайно пока искал как указать хедеры. Этот вариант гораздо удобнее чем мой первоначальный: QNetworkProxy.setApplicationProxy(proxy); и, видимо, не относится к приложению в целом (мне так и нужно). Вот я и подумал, может также и хедеры можно указать через определённое дерево связей перед отправкой запроса, мало ли.
« Последнее редактирование: Декабрь 09, 2009, 17:15 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



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

А вообще QT Jambi и QWebKit в частности для меня очень интересны. Для реализации моей проги (веб-сёрфер) я перепробовал 4 фреймворка имитирующих работу браузеров. Но такого богатого инструментария как в QWebKit ни в одном из них не было.
Записан

kubuntu/Win7/x64/NetBeans
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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