Как получить первое событие перенаправления (301 или 302) в QtWebKit

мы используем QtWebKit 4.7 и хотим знать, когда загрузка кадра выполняет перенаправление.

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

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

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

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

person Dag    schedule 01.03.2012    source источник


Ответы (2)


Используйте сигнал 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);
person Chris Browet    schedule 01.03.2012
comment
У этого подхода есть некоторые проблемы (мы уже пробовали это). 1. Мы не получаем код состояния (что не обязательно, но это должно быть событие, которое является одним из 301/302) 2. Когда URL-адрес изменяется в javascript, событие также запускается 3. В в наших журналах этот сигнал пришел после httpResponseFinished, что также сбивает с толку, поскольку сетевой трафик, который мы перехватываем, перенаправляется до некоторых 20-кратных кодов. - person Dag; 01.03.2012

Обработайте 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;
        }
    }
}
person Chris Browet    schedule 01.03.2012
comment
Мы тоже пробовали это, но ни один из зарегистрированных кодов состояния не показал 30x :( .. на данный момент мы идем с вашими первыми решениями плюс некоторые причуды. - person Dag; 05.03.2012
comment
Это, вероятно, означает, что существует несколько перенаправлений. Что вы можете сделать, так это указать свой собственный QNetworkAccessManager на странице с помощью QWebPage::setNetworkAccessManager и подключить его, чтобы вы могли перехватывать все сетевые запросы, даже скрытые. - person Chris Browet; 05.03.2012