Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

brcontainer

Reimplementar NetWork

Recommended Posts

No Google Chrome quando ocorre um erro de requisição com o servidor, ele tenta uma nova requisição, veja o log do WireShark:
qy0jL.png
Estou desenvolvendo um navegador completo em QT e percebi que quando uma requisição falha o QWebView não tenta uma nova requisição igual ao Google Chrome (Firefox e Internet Explorer também tentam uma nova requisição)
Como posso reimplementar "QNetWorkRequest/QNetWorkAccessManager", para que eu possa fazer o QWebView ter o mesmo efeito dos navegadores convencionais?
Parte do meu código (o QWebView foi inserido pelo QtCreator, para acessa-lo uso ui->myWebView):
    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);//Desabilita 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*)));

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Conseguir fazer parcialmente o que eu precisava, mas não estou conseguindo enviar os dados POST, veja como ficou meu código:

QNetworkReply * myNAM::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData){
    if(op==PostOperation) {
        qDebug() << "isPost";
        QNetworkAccessManager *n = new QNetworkAccessManager();
        QNetworkReply *p = n->post(request,outgoingData);
        //qDebug() << p->url();
        //qDebug() << "newRequest";
        p->waitForReadyRead(8000);
        qDebug() << "readyRequest";
        if(p->isReadable()){
            qDebug() << "readyRequest is ready";
            return QNetworkAccessManager::createRequest(op, p->request(), outgoingData);
        }
        p->abort();
    }
    return QNetworkAccessManager::createRequest(op, request, outgoingData);
}

 

Se alguém tiver alguma ideia.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui "reimplementar", segue o código:

Váriaveis "globais" e classe extendida/reimplementada:

    QNetworkAccessManager *outerNetWork;
    bool firstExec = false;
    QNetworkCookieJar *cookieJar;
    QNetworkAccessManager *outerNetWork;
    QNetworkAccessManager *m_network = new QNetworkAccessManager;
    
    QNetworkDiskCache *m_cache;
    
    QNetworkReply * m_network::createRequest(
        Operation op,
        const QNetworkRequest &request,
        QIODevice *outgoingData
    ){
        if(op==PostOperation || op==PutOperation) {
            //like POST
            QNetworkRequest req(request.url());
    
            const QList<QByteArray>a = request.rawHeaderList();
            int j = a.length();
            int i=0;
    
            for(;i<j;++i){
                req.setRawHeader(a[i],request.rawHeader(a[i]));
            }
    
            const QByteArray data = outgoingData->readAll();
    
            QNetworkReply *p;
            if(op==PostOperation) {
                p = outerNetWork->post(req, data);
            } else {
                p = outerNetWork->put(req, data);
            }
    
            return p;
        } else if(op==DeleteOperation || op==HeadOperation || op==GetOperation) {
            //like GET
            QNetworkRequest req(request.url());
    
            const QList<QByteArray>a = request.rawHeaderList();
            int j = a.length();
            int i=0;
    
            for(;i<j;++i){
                req.setRawHeader(a[i],request.rawHeader(a[i]));
            }
    
            if(op==GetOperation) {
                return outerNetWork->get(req);
            } else if(op==HeadOperation) {
                return outerNetWork->head(req);
            }
            return outerNetWork->deleteResource(req);
        }
        return QNetworkAccessManager::createRequest(op, request, outgoingData);
    }

 




Na "main Class", configure algo como isto:

 

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

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

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

        outerNetWork->setCache( m_cache );
        outerNetWork->setCookieJar( cookieJar );
    }
    
    [QWEBVIEW]->setNetworkAccessManager( m_network );

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.