2012-03-01 6 views
6

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

На данный момент мы подсчитываем исходящие запросы в подклассе QNetworkAccessManager, где мы перезаписываем createRequest.

Это работает в большинстве случаев штрафом, но когда первый ответ 301 или 302 (перенаправление), он где-то проглатывается.

Мы просто запросить URL-адрес следующим образом:

QNetworkRequest request(QUrl("http://www.twitter.com")); // 301 to twitter.com 
frame->load(request); 

ответ

3

Используйте void QWebFrame::urlChanged (const QUrl & url) сигнал для обнаружения изменений URL-адрес, т.е. перенаправления, т.е.

QNetworkRequest request(QUrl("http://www.twitter.com")); // 301 to twitter.com 
connect(frame, SIGNAL(urlChanged (const QUrl&)), this, SLOT(onRedirected(const QUrl&)); 
frame->load(request); 
+0

Этот подход имеет некоторые проблемы (мы уже пробовали это). 1. Мы не получаем код состояния (который не является необходимым, но он должен быть событием, которое является одним из 301/302) 2. Когда URL-адрес изменен в javascript, событие также запускается 3. В наших журналах этот сигнал появился после httpResponseFinished, что также сбивает с толку, поскольку сетевой трафик мы захватываем переадресацией cames до некоторых 20x-кодов. – Dag

8

Ручка QNetworkReply самостоятельно, получить код состояния от ответ и сделайте QWebFrame :: setcontent.

QNetworkRequest request(QUrl("http://www.twitter.com")); // 301 to twitter.com 
connect (frame->page()->networkAccessManager(), SIGNAL(finished(QNetworkReply*), this, SLOT(onFinished(QNetworkReply*)); 
frame->page()->networkAccessManager()->get(request); 

[...] 

void onFinished(QNetworkReply* reply) 
{ 
    if (reply->error() == QNetworkReply::NoError) { 
     int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); 
     switch (statusCode) { 
      case 301: 
      case 302: 
      case 307: 
       qDebug() << "redirected: " << reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); 
       break; 

      case 200: 
       frame->setContent(reply->readAll()); 
       break; 
     } 
    } 
} 
+0

Мы также пробовали это, но ни один из зарегистрированных кодов состояния не показал 30x :(.. на данный момент мы переходим к вашим [первым решениям] (http://stackoverflow.com/a/9516092/363281) плюс некоторые причуды. – Dag

+0

Это, вероятно, означает, что существует несколько перенаправлений. Что вы можете сделать, это указать свой собственный QNetworkAccessManager для страницу с «QWebPage :: setNetworkAccessManager» и «подключить» эту, чтобы вы могли захватить все сетевые запросы, даже скрытые. – Koying

 Смежные вопросы

  • Нет связанных вопросов^_^