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

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

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: QSslSocket. Неизвестная кодировка в ответе от сервера.  (Прочитано 27481 раз)
Даниил
Гость
« : Август 08, 2011, 10:57 »

Здравствуйте.

Словил беду, никак не могу корректно прочитать ответ от сервера = приходит заголовок и текст в неизвестной кодировке. При попытке использования qUncompress - прога зависает. Пробовал распаковать с помощью zlib - ничего не меняется. Соединяюсь сервером Tomcat.

Помогите, пожалуйста. Уже нервы сдают.

Код
C++ (Qt)
"HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Type: text/xml;charset=Windows-1251
Transfer-Encoding: chunked
Date: Mon, 08 Aug 2011 07:46:30 GMT
Server: Apache (Unix)
 
a
?
"
153
mRNr?0u&??' ±8A?VieC«vuLa?IhB¤u??D?a|UU;now??=iwF\a?NLbU¦4eYN7o3§u}2s"
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Август 08, 2011, 11:34 »

Transfer-Encoding: chunkedВы всех пакетов дожидаетесь?
Читаете во что? Не в QString надеюсь?
Записан
Даниил
Гость
« Ответ #2 : Август 08, 2011, 11:42 »

Дожидаюсь всех пакетов.
Код:
while(pClient->bytesAvailable() != 0)
Читаю в QByteArray
Код:
QByteArray incoming = pClient->readAll()
Записан
RedDog
Гость
« Ответ #3 : Август 08, 2011, 12:28 »

может это в сжатом виде?
текст запроса какой?
Записан
Даниил
Гость
« Ответ #4 : Август 08, 2011, 12:34 »

может это в сжатом виде?
текст запроса какой?

Собственно - да. Текст сжатый, не могу его распаковать. Пробовал как уже описывал выше - qUncmpress и zlib. Удовлетворительного результат не получил.
Записан
Даниил
Гость
« Ответ #5 : Август 09, 2011, 14:18 »

Неужели никто не сталкивался с подобными вещами?
Никто не распаковывал данные сжатые gzip. Может я попросту неправильно пытаюсь прочитать?
Если есть примеры у кого, выложите, пожалуйста.
Записан
RedDog
Гость
« Ответ #6 : Август 09, 2011, 14:33 »

так попробуй распаковать через gzip а не
Цитировать
qUncmpress и zlib
Записан
Странник
Гость
« Ответ #7 : Август 09, 2011, 14:55 »

Неужели никто не сталкивался с подобными вещами?
Никто не распаковывал данные сжатые gzip. Может я попросту неправильно пытаюсь прочитать?
Если есть примеры у кого, выложите, пожалуйста.
по поводу 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).
Записан
Даниил
Гость
« Ответ #8 : Август 10, 2011, 07:36 »

Неужели никто не сталкивался с подобными вещами?
Никто не распаковывал данные сжатые gzip. Может я попросту неправильно пытаюсь прочитать?
Если есть примеры у кого, выложите, пожалуйста.
по поводу 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).

Это конечно, очень занимательная заметка. Пробовал всячески приписать размер. В сообщении от сервера, кстати, вначале идет цифра и она вполне читабельна.
Записан
Serr500
Гость
« Ответ #9 : Август 10, 2011, 15:12 »

Цитировать
Transfer-Encoding: chunked
http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Если кратко, то собираем все чанки в массив (конец блока чанков - нулевая длина), а затем прогоняем через gunzip.
« Последнее редактирование: Август 10, 2011, 15:14 от Serr500 » Записан
Даниил
Гость
« Ответ #10 : Август 11, 2011, 07:11 »

Цитировать
Transfer-Encoding: chunked
http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Если кратко, то собираем все чанки в массив (конец блока чанков - нулевая длина), а затем прогоняем через gunzip.
Можно-ли поподробней?
Вот мой код приема сообщения от сервера:
Код:
connect (pClient, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
void QSslClient::slotReadyRead()
{
    try
    {
        QByteArray incoming;
        while(pClient->bytesAvailable() != 0)
        {
            incoming = pClient->readAll();
            //Записываем ответ в глобальную переменную
            temp += incoming;//QByteArray temp
        }
    }
    catch(exception ex)
    {
        qDebug() << "###" << ex.what();
    }
}
При чем, если я помещаю всю информацию в текстовый файл - возникает множество непечатных символов. Их видно в текстовом файле, т.к. редактор не может верно определить кодировку.
Возникает вопрос: может быть с ответом приходит какой-то мусор? И его нужно фильтровать?
Файл с ответом во вложении.
Записан
Serr500
Гость
« Ответ #11 : Август 11, 2011, 08:31 »

Цитировать
Можно-ли поподробней?
Что там подробней? И так всё ясно. Ответ сервера закодирован два раза: вначале он пожат gzip'ом, а затем разбит на части. Соответственно, сначала необходимо собрать части воедино, а затем выполнить распаковку. Код писать лень, приведу только алгоритм.

1. Ищем конец заголовка (два символа новой строки)
2. Считываем шестнадцатиричную длину чанка, находящуюся в отдельной строке. Если длина равна нулю, переходим к шагу 5.
3. Считываем в буфер число символов, полученных на предыдущем шаге.
4. Возвращаемся к шагу 2.
5. Распаковываем содержимое буфера.

Цитировать
При чем, если я помещаю всю информацию в текстовый файл - возникает множество непечатных символов. Их видно в текстовом файле, т.к. редактор не может верно определить кодировку.
Возникает вопрос: может быть с ответом приходит какой-то мусор? И его нужно фильтровать?
Естественно, что там будут непечатные символы - это архив, а не текст. Мусора там нет, только служебная информация, её нужно убрать описанным выше методом и получить поток gzip.
Записан
Даниил
Гость
« Ответ #12 : Август 11, 2011, 11:35 »

Цитировать
Можно-ли поподробней?
Код писать лень, приведу только алгоритм.

Ну пожалуйста Грустный
Записан
RedDog
Гость
« Ответ #13 : Август 11, 2011, 12:53 »

А не легче в POST запросе сказать серверу, что бы данные не сжимал?
Записан
Даниил
Гость
« Ответ #14 : Август 11, 2011, 12:57 »

А не легче в POST запросе сказать серверу, что бы данные не сжимал?

Пробовал разные заголовки типа:
Код:
?gzip=false
и т.д. и т.п. Все равно сжимает, нехороший такой.
На самом апаче отключить не могу, т.к. не один я туда бегаю.
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


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