QWebPage не работает после первой загрузки

Я пишу приложение, которое очищает некоторые веб-страницы с помощью QWebPage. У меня возникают проблемы, когда ответ представляет собой перенаправление HTTP (например, 302, 303 и т. Д.). QWebPage просто не выполняет перенаправление.

Чтобы обойти эту проблему, я подключился к сигналу завершения диспетчера сети страницы, чтобы захватить статус ответа и загрузить любое перенаправление, однако, когда я вызываю метод load во второй раз на QWebPage , он устанавливает пустой URL-адрес и не отправляет никаких запросов.

Вот некоторые важные фрагменты кода:

connect(page->networkAccessManager(), SIGNAL(finished(QNetworkReply*)), SLOT(gotReply(QNetworkReply*)));
connect(page, SIGNAL(loadFinished(bool)), SLOT(doneLoading(bool)));
page->mainFrame()->load(url);

Мой слот:

void Snapshot::gotReply(QNetworkReply *reply)
{
    if(reply->header(QNetworkRequest::ContentTypeHeader).toString().contains(QString("text/html")))
    {
        qDebug() << "Got reply " + reply->url().toString() + " - " + reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString() + " - " + reply->header(QNetworkRequest::ContentTypeHeader).toString();
    }

    if(!statusCode && reply->header(QNetworkRequest::ContentTypeHeader).toString().contains(QString("text/html"))) {
        statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
        redirectUrl = QUrl(reply->header(QNetworkRequest::LocationHeader).toUrl());
    }
}

void Snapshot::doneLoading(bool)
{
    // A reasonable waiting time for any script to execute
    timer->start(3000);
}

void Snapshot::doneWaiting()
{
    if( statusCode != 0 &&
        statusCode != 301 &&
        statusCode != 302 &&
        statusCode != 303
       ) {
        qDebug() << page->mainFrame()->url().toString();
        qDebug() << page->mainFrame()->toHtml();

        QImage image(page->viewportSize(), QImage::Format_ARGB32);
        QPainter painter(&image);

        page->mainFrame()->render(&painter);

        painter.end();

        image.save(*outputFilename);

        delete outputFilename;
        QApplication::quit();
    }
    else if(statusCode != 0) {
        statusCode = 0;
        qDebug() << "Redirecting to: " + redirectUrl.toString();
        if(page->mainFrame()->url().toString().isEmpty()) {
            qDebug() << "about:blank";
            page->mainFrame()->load(this->redirectUrl); // No network activity after this
            qDebug() << "Loading";
        }
    }

    // This should ensure that the program never hangs
    if(statusCode == 0) {
        if(tries > 5) {
            qDebug() << "Giving up.";
            QApplication::quit();
        }
        tries++;
    }
}

person Raphael    schedule 03.05.2012    source источник


Ответы (1)


Проблема заключалась в том, что страница, которую я тестировал, перенаправлялась на https и имела самоподписанный сертификат.

Решением было заставить QNetworkReply игнорировать ошибки ssl:

void Snapshot::sslErrors(QNetworkReply *reply, const QList<QSslError> &errors)
{
    reply->ignoreSslErrors();
}
person Raphael    schedule 03.05.2012