Как остановить QHttp / QtWebKit от кеширования страниц - PullRequest
2 голосов
/ 05 августа 2011

Недавно я обнаружил, что могу изменить txt-файл, который хранится в Интернете, и когда я получаю его, используя QHttp , я все еще получаю предыдущую версию. Мой код также использовал QtWebKit , так что, может быть, это как-то связано с проблемой? Или, может быть, мне просто не хватает настройки, которая предотвращает кеширование?

(я использую Qt 4.7.3 под Windows 7 и компилирую с надстройкой Visual Studio 2010)

Я делаю следующее, чтобы QtWebKit ничего не кэшировал -

QWebSettings::globalSettings( )->setAttribute( QWebSettings::PrivateBrowsingEnabled, true );
QWebSettings::globalSettings( )->setAttribute( QWebSettings::LocalContentCanAccessRemoteUrls, true );
QWebSettings::setMaximumPagesInCache( 0 );
QWebSettings::setObjectCacheCapacities( 0, 0, 0 );
QWebSettings::clearMemoryCaches( );

Код, который я использую для загрузки TXT-файла, выглядит следующим образом -

CacheHTML::CacheHTML( QObject* parent, QString urlId, QByteArray* bytes, QString stringUrl ) : QObject( parent ) {
    this->urlId = urlId;
    QUrl url = QUrl( stringUrl );
    http = new QHttp( this );
    connect( http, SIGNAL( requestFinished( int, bool )), this, SLOT( Loaded( int, bool )));
    pBytes = bytes;
    buffer = new QBuffer( pBytes, this );
    buffer->open( QIODevice::WriteOnly );
    http->setHost( url.host( ));
    fetchId = http->get( url.toString( ), buffer );
}

Слот, который я использую для соответствия этому, -

void CacheHTML::Loaded( int id, bool error ) {
    if( id != fetchId )
        return;
    if( error ) {
        emit CacheComplete( urlId, false );
        return;
    }
    emit CacheComplete( urlId, true );
}

Но как только он получил txt-файл из Интернета, он, кажется, где-то / как-то его кеширует. Независимо от того, какие изменения я внесу в текстовый файл, при запуске моего кода он все равно буферизует исходный файл.

Я попробовал предложение OrcunC (ниже), но это приводит к получению пустой строки в отличие от содержимого текстового файла -

CacheHTML::CacheHTML( QObject* parent, QString urlId, QByteArray* bytes, QString stringUrl ) : QObject( parent ) {
    this->urlId = urlId;
    QUrl url = QUrl( stringUrl );
    http = new QHttp( this );
    connect( http, SIGNAL( requestFinished( int, bool )), this, SLOT( Loaded( int, bool )));
    pBytes = bytes;
    buffer = new QBuffer( pBytes, this );
    buffer->open( QIODevice::WriteOnly );

    QHttpRequestHeader header( "GET", url.path( ));
    header.setValue( "Cache-Control", "no-cache" );
    header.setValue( "Host", url.host( ));

    http->setHost( url.host( ));
    fetchId = http->request( header );
}

Я также пытался реализовать его другим способом, как показано ниже, но получил те же результаты, что и при кэшировании txt-файла. Даже если проверка QNetworkReply в слоте закончен с атрибутом bool fromCache = reply-> (QNetworkRequest :: SourceIsFromCacheAttribute) .toBool () вернул false .

    QNetworkAccessManager* manager = new QNetworkAccessManager( this );
    connect( manager, SIGNAL( finished( QNetworkReply* )), this, SLOT( Loaded( QNetworkReply* )));
    QNetworkRequest req = QNetworkRequest( QUrl( stringUrl ));
    req.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork );
    req.setAttribute( QNetworkRequest::CacheSaveControlAttribute, false );
    manager->get( req );

Я сейчас нахожусь в тупике, поэтому буду очень признателен всем, кто указывает мне правильное направление.

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Возможно, прокси кэширует содержимое файла. Попробуйте что-нибудь, как показано ниже, чтобы очистить кеш:

QHttpRequestHeader header("GET", "/mytext.txt");
header.setValue("Cache-Control", "no-cache");
header.setValue("Host", "myhost.com");

http->setHost("myhost.com");
fetchId = http->request(header);
0 голосов
/ 20 апреля 2012

Это может показаться глупым предложением, но ... вы пытались загрузить TXT в веб-браузере? И проверяет, обновляет ли он изменения? Проблема может быть где-то в пути, а не в вашем приложении вообще ...

...