2012-05-03 143 views
1

我正在寫一個應用程序,使用QWebPage來刪除一些網頁。當響應是Http重定向時(例如302,303等),我遇到了一些麻煩。 QWebPage根本不遵循重定向。第一次加載後QWebPage不工作

要解決這個問題,我已經連接到網頁的網絡管理人員的最終信號捕捉響應的狀態和加載任何重定向,但是,當我要求第二次負載方法上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++; 
    } 
} 

回答

0

的問題是,我是網頁測試被重定向到https,有一個自簽名的證書。

的解決方案是使QNetworkReply忽略SSL錯誤:

void Snapshot::sslErrors(QNetworkReply *reply, const QList<QSslError> &errors) 
{ 
    reply->ignoreSslErrors(); 
} 
相關問題