Russian Qt Forum
Ноябрь 23, 2024, 21:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: qnetworkaccessmanager и gzip  (Прочитано 13896 раз)
eldar85
Гость
« : Декабрь 12, 2010, 21:22 »

Добрый день. Столкнулся с такой проблемой - работаю с сетью через qnetworkaccessmanager. программка должна загружать страничку сжатую в gzip, а вот распаковать ее не получается.
Причем страничка обязательно должна быть сжата ( в заголовке запроса должен быть request.setRawHeader("Accept-Encoding", "gzip");  ) потому что иначе ответ пустой. Есть ли специальный функции у Qt для расспаковки таких страниц?
Записан
BRE
Гость
« Ответ #1 : Декабрь 12, 2010, 21:25 »

Есть ли специальный функции у Qt для расспаковки таких страниц?
Попробуй использовать:
QByteArray qUncompress ( const QByteArray & data )
Записан
eldar85
Гость
« Ответ #2 : Декабрь 12, 2010, 21:27 »

пробовал, выдает ошибку  qUncompress: Z_DATA_ERROR: Input data is corrupted
Записан
BRE
Гость
« Ответ #3 : Декабрь 12, 2010, 21:30 »

пробовал, выдает ошибку  qUncompress: Z_DATA_ERROR: Input data is corrupted
Ну тогда попробуй саму библиотеку gzip.
Записан
eldar85
Гость
« Ответ #4 : Декабрь 12, 2010, 21:31 »

Вот присылаемый сервером заголовок:

Date:  Sun, 12 Dec 2010 18:28:10 GMT
Server:  Apache/2
X-Powered-By:  PHP/5.2.14
Expires:  Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control:  no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma:  no-cache
Vary:  Accept-Encoding,User-Agent
Content-Encoding:  gzip
Content-Length:  20
Keep-Alive:  timeout=1, max=100
Connection:  Keep-Alive
Content-Type:  text/html
Записан
eldar85
Гость
« Ответ #5 : Декабрь 12, 2010, 21:33 »

такого ни разу не пробовал, можно подробнее???
Но ведь webkit как то же распаковывает такие страницы, ниужли сторонними библиотеками...
Записан
BRE
Гость
« Ответ #6 : Декабрь 12, 2010, 21:36 »

Это про qUncompress:
Цитировать
Note: If you want to use this function to uncompress external data compressed using zlib, you first need to prepend four bytes to the byte array that contain the expected length (as an unsigned integer) of the uncompressed data encoded in big-endian order (most significant byte first).
Записан
eldar85
Гость
« Ответ #7 : Декабрь 12, 2010, 21:46 »

как я понял нужно добавить в начало 4 байта информации об ожидаемой длине принимаего контента? Но у меня приходит Content-Length:  20, получается мне сервер всего 20 байт присылает?
Записан
BRE
Гость
« Ответ #8 : Декабрь 12, 2010, 21:50 »

Но ведь webkit как то же распаковывает такие страницы, ниужли сторонними библиотеками...
Вообще Qt и так собирается с zlib, а вот доступ к ее функционалу ограничен функциями qCompress/qUncompress.
Посмотри реализацию этих функций.
Записан
SimpleSunny
Гость
« Ответ #9 : Декабрь 12, 2010, 22:03 »

Если используете QNAM, то он автоматически распаковывает сжатые страницы, и заботится об этом не нужно.
Записан
eldar85
Гость
« Ответ #10 : Декабрь 12, 2010, 22:31 »

Вот так я и хочу, сейчас поищу инфу про этот QNAM
Записан
SimpleSunny
Гость
« Ответ #11 : Декабрь 12, 2010, 22:41 »

QNetworkAccessManager
Записан
eldar85
Гость
« Ответ #12 : Декабрь 15, 2010, 15:56 »

и все же я не разобрался, какая же функция у QNetworkAccessManager расспаковывает сжатые данные???
Записан
eldar85
Гость
« Ответ #13 : Декабрь 15, 2010, 16:20 »

Цитировать
    request.setUrl(QUrl(load_url));
    request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.12) Gecko/20101026 MRA 5.7 (build 03773) Firefox/3.6.12");
    request.setRawHeader("Accept-Encoding", "gzip");


    if(!referer.isEmpty())
        request.setRawHeader( "Referer", referer );

    if(!cookie.isEmpty())
        request.setRawHeader( "Cookie", cookie);

    if(!proxy.isEmpty() && with_proxy)
    {
        ip_port = proxy.split(":");

        if( ip_port.length() == 2 )
        {
            tmp = ip_port[1];
            port = tmp.toInt();

            if( http_socks5 )
                manager.setProxy(QNetworkProxy(QNetworkProxy::HttpProxy, ip_port[0], port));
            else
                manager.setProxy(QNetworkProxy(QNetworkProxy::Socks5Proxy, ip_port[0], port));
        }
    }

    if(post_data.isEmpty())
        reply = manager.get( request );
    else
        reply = manager.post( request, post_data );


    QObject::connect( reply, SIGNAL( finished() ), &loop, SLOT( quit() ) );
    QObject::connect( &timer, SIGNAL( timeout() ), &loop, SLOT( quit() ) );

    timer.start(30000);
    loop.exec();

    cookie_loaded = reply->rawHeader("Set-Cookie");
    location = reply->rawHeader("Location");

    buf = reply->readAll();

вот часть моего класса работы с сетью, но он у меня не расспаковывает автоматически gzip или возможно что то сделал я не так Непонимающий
« Последнее редактирование: Декабрь 15, 2010, 21:32 от eldar85 » Записан
eldar85
Гость
« Ответ #14 : Декабрь 17, 2010, 06:58 »

хмм и в правду QNAM расспаковывает все, проблема была в моем классе, я после пост запроса не очищал переменную post_data - жесть... странно но я долго не мог заметить этот баг... в программе задействовано достаточно не мало кода, а этот класс достаточно свежий и еще хорошо не протестил его))) но хоть убей не видел этого бага, пока не спя двое суток подряд уже в состоянии "никаком" не взгленул таки на эти строки
Цитировать
if(post_data.isEmpty())
        reply = manager.get( request );
    else
        reply = manager.post( request, post_data );

и проследил весь класс))) получается после первого пост запроса все остальные запросы тоже шли постом)))))))) фак... а я думал из за распаковки такая кака приходит)))))))
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.1 секунд. Запросов: 20.