Russian Qt Forum

Qt => Работа с сетью => Тема начата: serg_hd от Декабрь 08, 2009, 20:57



Название: [решено] QWebKit & headers
Отправлено: serg_hd от Декабрь 08, 2009, 20:57
Загружаю куда-нибудь страницу (в QWebView, QWebPage, неважно). Можно ли перед загрузкой этой самой страницы указать желаемое значение хедера, например referer'а, чтобы страница не знала откуда я действительно пришёл - direct enter это или конкретный любой адрес?
К networkAccessManager() можно получить доступ через page():
webview1.page().networkAccessManager()
Но, насколько я понял, рефер подставить он не даёт(
Их, в принципе, можно задать через QNetworkRequest.setRawHeader(), но как ему "сказать" что эти хедеры нужно применить именно к моей загружаемой QWebView?


Название: Re: QWebKit и headers
Отправлено: sendevent от Декабрь 08, 2009, 22:06
последнее предложение нифига не понял=) но "изменять реквесты" - можно, например, в QNetworkAccessManager::createRequest.
Код:
webview1.page().setNetworkAccessManager( m_pMyNetworkMgr );//-- есть доступ к траффику!


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


Название: Re: QWebKit & headers
Отправлено: sendevent от Декабрь 09, 2009, 01:21
Цитировать
Для справки, рефер это <...>
;D спасибо, кэп!

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


Название: Re: QWebKit & headers
Отправлено: serg_hd от Декабрь 09, 2009, 11:57
Цитировать
Для справки, рефер это <...>
;D спасибо, кэп!
Всегда пожалст.
Ну так какие ещё идеи насчёт прописи своего хедера для QWebView, а не создания отдельного запроса (просьба если отвечать, то по теме)?


Название: Re: QWebKit & headers
Отправлено: sendevent от Декабрь 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 );
}


Название: Re: QWebKit & headers
Отправлено: serg_hd от Декабрь 09, 2009, 13:24
Я сразу не понял, что ты имел ввиду перегрузку метода, а QNetworkAccessManager::createRequest у меня проассоциировалось именно с созданием запроса.
В принципе изначально я расчитывал, что есть такой метод, который можно было бы применить по отношению к моей qwebpage (как отдельный метод networkAccessManager'а например) без перегрузки его метода createRequest(). Странно, конечно, что это можно делать только так. Тем не менее, спасибо, попробую


Название: Re: [решено] QWebKit & headers
Отправлено: serg_hd от Декабрь 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);
 
Всё ок, пасиб ещё раз, будет мне опыт на будущее (в прикладном прогр-нии я новичёк).


Название: Re: [решено] QWebKit & headers
Отправлено: sendevent от Декабрь 09, 2009, 17:01
QWeb(View|Page) - предназначены для отображения контента, логично, что не предоставляют доступа к "низкоуровневым" аттрибутам хттп (хотя User-Agent'a можно переопределить в QWebPage).
кстати, обрати внимание: пришедший req может быть connect'ед с кем нибудь (самому смотреть лень), и при подобном "копировании" эти связи похерятся - возможно, лучше воспользоваться приведением типов.


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


Название: Re: [решено] QWebKit & headers
Отправлено: serg_hd от Декабрь 09, 2009, 17:26
А вообще QT Jambi и QWebKit в частности для меня очень интересны. Для реализации моей проги (веб-сёрфер) я перепробовал 4 фреймворка имитирующих работу браузеров. Но такого богатого инструментария как в QWebKit ни в одном из них не было.