2013-07-23 36 views
3

谷歌瀏覽器,當向服務器發出請求時發生錯誤,谷歌瀏覽器嘗試一個新的請求,請參閱日誌Wireshark的wireshark log請求或AccessManager QT

注意:這第二次嘗試也在Firefox和InternetExplorer中出現。 注意:WebInspector只出現在請求中,換句話說:常規瀏覽器在多次或一段時間內嘗試新請求。

我在QT 開發一個完整的瀏覽器,並意識到如果請求失敗「QWebView」具有相同的行爲谷歌瀏覽器

如何才能重新實現QNetWorkRequest/QNetWorkAccessManager以像常規瀏覽器一樣工作?

請幫助我。

myWebPage *myWP = new myWebPage(); 
myWP->setForwardUnsupportedContent(true); 
myWP->setNetworkAccessManager(m_network); 
ui->myWebView->setPage(myWP); 

if(q!=true) { 
    settings = QWebSettings::globalSettings(); 

    settings->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled,true); 
    settings->setAttribute(QWebSettings::LocalContentCanAccessRemoteUrls,true); 
    settings->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled,true); 
    settings->setAttribute(QWebSettings::LocalContentCanAccessFileUrls,true); 
    settings->setAttribute(QWebSettings::LocalStorageEnabled,true); 
    settings->setAttribute(QWebSettings::JavascriptCanOpenWindows,true); 
    settings->setAttribute(QWebSettings::JavascriptCanCloseWindows,true); 
    settings->setAttribute(QWebSettings::JavascriptEnabled,true); 

    settings->setAttribute(QWebSettings::PluginsEnabled,true); 
    settings->setAttribute(QWebSettings::JavaEnabled,false);//Disable java 
    settings->setAttribute(QWebSettings::DeveloperExtrasEnabled,true); 
    settings->setAttribute(QWebSettings::AutoLoadImages, true); 


    settings->setAttribute(QWebSettings::DnsPrefetchEnabled, true); 
    settings->setAttribute(QWebSettings::LocalStorageDatabaseEnabled, true); 
    settings->setAttribute(QWebSettings::AcceleratedCompositingEnabled, true); 
    settings->setAttribute(QWebSettings::JavascriptCanAccessClipboard, false); 
    settings->setAttribute(QWebSettings::ScrollAnimatorEnabled, true); 

    settings->setAttribute(QWebSettings::PrintElementBackgrounds, false); 

    settings->setOfflineWebApplicationCachePath(QString(localStorage+"/appcache")); 
    settings->enablePersistentStorage(QString(localStorage+"/persistent")); 
    settings->setOfflineStoragePath(QString(localStorage+"/offlinestorage")); 
    settings->setLocalStoragePath(QString(localStorage+"/storage")); 
    settings->setIconDatabasePath(QString(localStorage+"/icons")); 

    settings->setMaximumPagesInCache(99999); 
    settings->setObjectCacheCapacities(0,99999,99999); 

    settings->setOfflineWebApplicationCacheQuota(5*1024*1024); 
    settings->setOfflineStorageDefaultQuota(5*1024*1024); 
} 
connect(ui->myWebView->page(), SIGNAL(downloadRequested(QNetworkRequest)), this, SLOT(Download(QNetworkRequest))); 
connect(ui->myWebView->page(), SIGNAL(unsupportedContent(QNetworkReply*)), this, SLOT(unsupportedToDownload(QNetworkReply*))); 
connect(ui->myWebView->page(), SIGNAL(printRequested(QWebFrame*)), this, SLOT(printFrame(QWebFrame*))); 
+0

的Qt和Chrome都使用[WebKit](http://en.wikipedia.org/wiki/WebKit)作爲底層代碼引擎。這可能解釋了類似的行爲。 – Phlucious

+0

的渲染代碼是一樣的,沒有請求。 –

回答

3

我解決了這個問題:

network.h

#ifndef NETWORK_H 
#define NETWORK_H 

#include <QNetworkAccessManager> 

class netWork : public QNetworkAccessManager 
{ 
    Q_OBJECT 

protected: 
    virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = 0); 

public: 
    explicit netWork(QObject *parent = 0); 
}; 

#endif // NETWORK_H 

network.cpp

#include "network.h" 
#include <QNetworkReply> 
#include <QNetworkRequest> 

netWork::netWork(QObject *parent) : 
    QNetworkAccessManager(parent) 
{ 
} 

QNetworkReply * netWork::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData){ 
    if(request.rawHeader("x-fixed-req")=="1") {//prevent infinite loop 
     return QNetworkAccessManager::createRequest(op, request, outgoingData); 
    } 
    const QList<QByteArray>a = request.rawHeaderList(); 

    int j = a.length(); 
    int i=0; 

    QNetworkRequest req(request.url()); 
    for(;i<j;++i){ 
     req.setRawHeader(a[i], request.rawHeader(a[i])); 
    } 
    req.setRawHeader("x-fixed-req", "1"); 

    QNetworkReply *p; 
    if(op==PostOperation || op==PutOperation) { 
     const QByteArray data = outgoingData->readAll(); 

     if(op==PostOperation) { 
      p = this->post(req, data); 
     } else { 
      p = this->put(req, data); 
     } 
    } else if(op==DeleteOperation) { 
     p = this->deleteResource(req); 
    } else if(op==HeadOperation) { 
     p = this->head(req); 
    } else { 
     p = this->get(req); 
    } 

    return p; 
} 

的MainWin dow.cpp(或東西)

#include "network.h"; 

bool firstExec = false; 
QNetworkCookieJar *cookieJar; 

QNetworkDiskCache *m_cache; 
netWork *m_network = new netWork; //custom networkaccessmanager 

... 

if(firstExec==false){ 
    firstExec = true; 
    cookieJar = new QNetworkCookieJar; 

    m_cache = new QNetworkDiskCache(); 
    m_cache->setCacheDirectory(QString("c:\\data")); 

    m_network->setCache(m_cache); 
    m_network->setCookieJar(cookieJar); 

} 

[QWEBVIEW]->setNetworkAccessManager(m_network); 

注意:要使用cookies和緩存,使用功能QNetworkAccessManager :: setCookieJarQNetworkAccessManager :: setCache

+1

你顯然使用了你自己的QNetworkAccessManager。我假設'outerNetwork'是另一個QNetworkAccessManager。你是如何設法在同一頁面上使用它們的?我問,因爲我有類似的問題。 QtWebkit不會重發以前失敗的請求。 –

+0

原諒我,'outerNetwork'是一個「全局變量」,它接受如下內容:'QNetworkAccessManager * outerNetWork;'。我更新我的答案! –

+0

謝謝你澄清它。 –