Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
No Google Chrome quando ocorre um erro de requisição com o servidor, ele tenta uma nova requisição, veja o log do WireShark:
/applications/core/interface/imageproxy/imageproxy.php?img=http://i.stack.imgur.com/qy0jL.png&key=ea2e806cbd3f93be74cd8338055e431b803422ae2a9e35e7493ae67268174a9d" alt="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*)));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 );Solução atualizada:
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){
Se alguém tiver alguma ideia.