Russian Qt Forum
Май 18, 2012, 18:58
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Работа с сетью
(Модератор:
Sergeich
) >
qnetworkaccessmanager и gzip
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: qnetworkaccessmanager и gzip (Прочитано 2465 раз)
eldar85
Чайник
Offline
Сообщений: 70
qnetworkaccessmanager и gzip
«
:
Декабрь 12, 2010, 21:22 »
Добрый день. Столкнулся с такой проблемой - работаю с сетью через qnetworkaccessmanager. программка должна загружать страничку сжатую в gzip, а вот распаковать ее не получается.
Причем страничка обязательно должна быть сжата ( в заголовке запроса должен быть request.setRawHeader("Accept-Encoding", "gzip"); ) потому что иначе ответ пустой. Есть ли специальный функции у Qt для расспаковки таких страниц?
Записан
BRE
Джедай : наставник для всех
Offline
Сообщений: 3231
Re: qnetworkaccessmanager и gzip
«
Ответ #1 :
Декабрь 12, 2010, 21:25 »
Цитата: eldar85 от Декабрь 12, 2010, 21:22
Есть ли специальный функции у Qt для расспаковки таких страниц?
Попробуй использовать:
QByteArray qUncompress ( const QByteArray & data )
Записан
Каждое препятствие – это возможность
.
eldar85
Чайник
Offline
Сообщений: 70
Re: qnetworkaccessmanager и gzip
«
Ответ #2 :
Декабрь 12, 2010, 21:27 »
пробовал, выдает ошибку qUncompress: Z_DATA_ERROR: Input data is corrupted
Записан
BRE
Джедай : наставник для всех
Offline
Сообщений: 3231
Re: qnetworkaccessmanager и gzip
«
Ответ #3 :
Декабрь 12, 2010, 21:30 »
Цитата: eldar85 от Декабрь 12, 2010, 21:27
пробовал, выдает ошибку qUncompress: Z_DATA_ERROR: Input data is corrupted
Ну тогда попробуй саму библиотеку gzip.
Записан
Каждое препятствие – это возможность
.
eldar85
Чайник
Offline
Сообщений: 70
Re: qnetworkaccessmanager и gzip
«
Ответ #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
Чайник
Offline
Сообщений: 70
Re: qnetworkaccessmanager и gzip
«
Ответ #5 :
Декабрь 12, 2010, 21:33 »
такого ни разу не пробовал, можно подробнее???
Но ведь webkit как то же распаковывает такие страницы, ниужли сторонними библиотеками...
Записан
BRE
Джедай : наставник для всех
Offline
Сообщений: 3231
Re: qnetworkaccessmanager и gzip
«
Ответ #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
Чайник
Offline
Сообщений: 70
Re: qnetworkaccessmanager и gzip
«
Ответ #7 :
Декабрь 12, 2010, 21:46 »
как я понял нужно добавить в начало 4 байта информации об ожидаемой длине принимаего контента? Но у меня приходит Content-Length: 20, получается мне сервер всего 20 байт присылает?
Записан
BRE
Джедай : наставник для всех
Offline
Сообщений: 3231
Re: qnetworkaccessmanager и gzip
«
Ответ #8 :
Декабрь 12, 2010, 21:50 »
Цитата: eldar85 от Декабрь 12, 2010, 21:33
Но ведь webkit как то же распаковывает такие страницы, ниужли сторонними библиотеками...
Вообще Qt и так собирается с zlib, а вот доступ к ее функционалу ограничен функциями qCompress/qUncompress.
Посмотри реализацию этих функций.
Записан
Каждое препятствие – это возможность
.
SimpleSunny
Крякер
Offline
Сообщений: 366
Малевич
Re: qnetworkaccessmanager и gzip
«
Ответ #9 :
Декабрь 12, 2010, 22:03 »
Если используете QNAM, то он автоматически распаковывает сжатые страницы, и заботится об этом не нужно.
Записан
"There must have been a moment at the beginning, where we could have said no. But somehow we missed it. Well, we'll know better next time." ©
eldar85
Чайник
Offline
Сообщений: 70
Re: qnetworkaccessmanager и gzip
«
Ответ #10 :
Декабрь 12, 2010, 22:31 »
Вот так я и хочу, сейчас поищу инфу про этот QNAM
Записан
SimpleSunny
Крякер
Offline
Сообщений: 366
Малевич
Re: qnetworkaccessmanager и gzip
«
Ответ #11 :
Декабрь 12, 2010, 22:41 »
QNetworkAccessManager
Записан
"There must have been a moment at the beginning, where we could have said no. But somehow we missed it. Well, we'll know better next time." ©
eldar85
Чайник
Offline
Сообщений: 70
Re: qnetworkaccessmanager и gzip
«
Ответ #12 :
Декабрь 15, 2010, 15:56 »
и все же я не разобрался, какая же функция у QNetworkAccessManager расспаковывает сжатые данные???
Записан
eldar85
Чайник
Offline
Сообщений: 70
Re: qnetworkaccessmanager и gzip
«
Ответ #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
Чайник
Offline
Сообщений: 70
Re: qnetworkaccessmanager и gzip
«
Ответ #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
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
=> Архив
===> Программирование
=====> Python
===> Веб программирование
=====> PHP, PERL, CGI
Загружается...