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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: qnetworkaccessmanager и gzip  (Прочитано 13915 раз)
SimpleSunny
Гость
« Ответ #15 : Декабрь 17, 2010, 08:36 »

В таких случаях снифер бы помог быстрее решить проблему Подмигивающий
Записан
eldar85
Гость
« Ответ #16 : Декабрь 17, 2010, 21:23 »

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

как такое может быть, приходит от сервера ответ с заголовком

Date:  Fri, 17 Dec 2010 11:47:18 GMT
Server:  Apache/2
X-Powered-By:  PHP/5.2.14
Expires:  Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control:  private, no-cache
Pragma:  no-cache
Vary:  Accept-Encoding,User-Agent
Content-Encoding:  gzip
Content-Length:  4177
Keep-Alive:  timeout=1, max=98
Connection:  Keep-Alive
Content-Type:  text/html; charset=windows-1251

и тело

"‹"

причем в снифере смотрел, приходит тип присылаемых данных text/html а на деле как будто что то бинарное, хотя судя по заголовку длинна html странички должна быть Content-Length:  4177
Записан
SimpleSunny
Гость
« Ответ #17 : Декабрь 17, 2010, 21:42 »

Может ошибка какая-то, и данные не докачиваются. reply->error() что говорит.
Записан
eldar85
Гость
« Ответ #18 : Декабрь 17, 2010, 21:48 »

0 ошибок как не странно.
Записан
eldar85
Гость
« Ответ #19 : Декабрь 17, 2010, 21:53 »

возможно что то с сайтом, кто нить попробуйте у себя загрузить http://awmproxy.com  у меня все страницы этого сайта такую фигню выдают...
Записан
eldar85
Гость
« Ответ #20 : Декабрь 17, 2010, 22:01 »

ну наконец то решил проблему)) спасибо SimpleSunny и  BRE за помощь)

убрал вот эту строку из хидера запрос  request.setRawHeader("Accept-Encoding", "gzip,deflate");
но все же есть сайты которые не дают ответа если эту строку не указать, то как же быть с ними...
Записан
SimpleSunny
Гость
« Ответ #21 : Декабрь 17, 2010, 23:09 »

Deflate обещают в 4.7.2 добавить (http://bugreports.qt.nokia.com/browse/QTBUG-13191), сейчас можно довольствоваться только gzip.
Записан
eldar85
Гость
« Ответ #22 : Декабрь 18, 2010, 00:44 »

так оно и так не расспаковывается request.setRawHeader("Accept-Encoding", "gzip");
Записан
thechicho
Гость
« Ответ #23 : Октябрь 27, 2011, 21:55 »

.pro
Код
C++ (Qt)
INCLUDEPATH += $$[QT_INSTALL_PREFIX]/src/3rdparty/zlib

.h
Код
C++ (Qt)
QByteArray uncompress(const QByteArray &);

.cpp
Код
C++ (Qt)
#include <zlib.h>
 
   QNetworkAccessManager qnam;
 
   QNetworkProxy proxy;
   if (proxySOCKS5) {
       proxy.setType(QNetworkProxy::Socks5Proxy);
   } else if (proxyHTTP) {
       proxy.setType(QNetworkProxy::HttpProxy);
   }
 
   if (proxyOne.isEmpty() && !proxyNO) {
       qDebug() << "Нема прокси"; return;
   }
   if (!proxyNO) {
   QStringList proxyList = proxyOne.trimmed().split(":");
 
   QString proxyHostName = proxyList[0];
   quint16 proxyPort = QString(proxyList[1]).toInt();
 
   proxy.setHostName(proxyHostName);
   proxy.setPort(proxyPort);
 
   qnam.setProxy(proxy);
   }
 
   RemadedNetworkCookieJar *cookieJar = new RemadedNetworkCookieJar();
   qnam.setCookieJar(cookieJar);
 
   QNetworkRequest request;
   request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1");
   request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
   request.setRawHeader("Accept-Language", "ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3");
   request.setRawHeader("Accept-Encoding", "gzip, deflate");
   request.setRawHeader("Accept-Charset", "windows-1251,utf-8;q=0.7,*;q=0.7");
   request.setRawHeader("Connection", "keep-alive");
   request.setUrl(QUrl("http://mail.ru"));
 
   QNetworkReply *reply = qnam.get(request);
 
   QEventLoop loop;
   connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
   loop.exec();
 
   reply->deleteLater();
   if(reply->error() != QNetworkReply::NoError) {
       qDebug() << reply->errorString();
   }
 
   QString answer = QString::fromLocal8Bit(uncompress(reply->readAll())); // если кодировка сайта Windows-1251. если локаль в другой кодировке, будут иероглифы. как без привязки к локале из Windows-1251 преобразовать не догнал
   QString answer = QString::fromUtf8(uncompress(reply->readAll())); // charset=UTF-8
 
 
QByteArray Class::uncompress(const QByteArray &data)
{
   if (data.size() <= 4) {
       qWarning("gUncompress: Input data is truncated");
       return QByteArray();
   }
 
   QByteArray result;
 
   int ret;
   z_stream strm;
   static const int CHUNK_SIZE = 1024;
   char out[CHUNK_SIZE];
 
   /* allocate inflate state */
   strm.zalloc = Z_NULL;
   strm.zfree = Z_NULL;
   strm.opaque = Z_NULL;
   strm.avail_in = data.size();
   strm.next_in = (Bytef*)(data.data());
 
   ret = inflateInit2(&strm, 15 +  32); // gzip decoding
   if (ret != Z_OK)
       return QByteArray();
 
   // run inflate()
   do {
       strm.avail_out = CHUNK_SIZE;
       strm.next_out = (Bytef*)(out);
 
       ret = inflate(&strm, Z_NO_FLUSH);
       Q_ASSERT(ret != Z_STREAM_ERROR);  // state not clobbered
 
       switch (ret) {
       case Z_NEED_DICT:
           ret = Z_DATA_ERROR;     // and fall through
       case Z_DATA_ERROR:
       case Z_MEM_ERROR:
           (void)inflateEnd(&strm);
           return QByteArray();
       }
 
       result.append(out, CHUNK_SIZE - strm.avail_out);
   } while (strm.avail_out == 0);
 
   // clean up and return
   inflateEnd(&strm);
   return result;
}

источник: http://stackoverflow.com/questions/2690328/qt-quncompress-gzip-data
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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