QNetworkManager получает сжатые ответы по умолчанию? - PullRequest
2 голосов
/ 26 февраля 2010

Я использую QNetworkManager для извлечения файлов с сервера, однако я не могу понять, сжаты ли файлы во время передачи со стандартным сжатием gzip, и если нет, как заставить их загружать сжатые файлы .

Как мне проверить?

Ответы [ 5 ]

2 голосов
/ 26 февраля 2010

Я только что провел быстрый тест, добавив:

request.setRawHeader("Accept-Encoding", "gzip,deflate");

в QNetworkRequest, и данные возвращают то, что выглядит сжатым (потому что оно на ~ 20% меньше и непригодно для использования).

Похоже, что QNetworkManager и QNetworkReply не являются интеллектуальными в том, что касается декомпрессии. Похоже, мне нужно реализовать gzip и / или deflate в возвращенном массиве QByteArray.

1 голос
/ 06 августа 2016

Когда вы устанавливаете пользовательский необработанный заголовок Accept-Encoding для объекта QNetworkRequest (например, через переопределенный QNetworkAccessManager::createRequest()), QtWebKit никогда больше не будет распаковывать ответ: исходный код qhttpnetworkconnection.cpp: === =================

    // If the request had a accept-encoding set, we better not mess
    // with it. If it was not set, we announce that we understand gzip
    // and remember this fact in request.d->autoDecompress so that
    // we can later decompress the HTTP reply if it has such an
    // encoding.
    value = request.headerField("accept-encoding");
    if (value.isEmpty()) {
#ifndef QT_NO_COMPRESS
        request.setHeaderField("Accept-Encoding", "gzip, deflate");
        request.d->autoDecompress = true;
#else
        // if zlib is not available set this to false always
        request.d->autoDecompress = false;
#endif
0 голосов
/ 04 сентября 2018

Прочтите это в другом месте, так что без тестирования: просто не устанавливайте заголовок с кодировкой принятия самостоятельно, тогда QNam должен обрабатывать его прозрачно (возвращать распакованную полезную нагрузку).

0 голосов
/ 26 февраля 2010

Учитывая следующее предложение, я бы сказал нет, но они могут быть:

Сигнал downloadProgress () также испускается при получении данных, но количество байтов, содержащихся в нем может не представляют фактические байты получил, если любое преобразование сделано к содержанию (например, распаковка и удаление издержки протокола).

Вы можете найти его здесь: http://doc.trolltech.com/4.6/qnetworkreply.html

Я этого не проверял!

Для сжатия, если я хорошо помню, вы можете отправить QByteArray ... А для объектов такого типа вы можете использовать "сжатие" ...

Вы также можете взглянуть на некоторые примеры Qt, например:

http://doc.trolltech.com/4.6/network-broadcastsender.html

Я не смотрел на них все, но, может быть, вы найдете некоторые интересные вещи!

Надеюсь, это немного поможет!

0 голосов
/ 26 февраля 2010

Вы должны использовать анализатор пакетов / сетевой анализатор и проверить себя.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...