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

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

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: QSslSocket. Неизвестная кодировка в ответе от сервера.  (Прочитано 27482 раз)
DmP
Гость
« Ответ #15 : Август 11, 2011, 15:54 »

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

Пробовал разные заголовки типа:
Код:
?gzip=false
и т.д. и т.п. Все равно сжимает, нехороший такой.
На самом апаче отключить не могу, т.к. не один я туда бегаю.
Что такое HTTP заголовок?
И описание поля Accept-Encoding необходимого для отключения сжатия.
Записан
Даниил
Гость
« Ответ #16 : Август 12, 2011, 06:51 »

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

Пробовал разные заголовки типа:
Код:
?gzip=false
и т.д. и т.п. Все равно сжимает, нехороший такой.
На самом апаче отключить не могу, т.к. не один я туда бегаю.
Что такое HTTP заголовок?
И описание поля Accept-Encoding необходимого для отключения сжатия.
Дело в том, что в HTTP запросе я не передаю таковой параметр на сервер. И даже если его добавляю, сервер все равно жмет данные.
Единственный выход, как я понимаю - это все-таки расжимать данные.
Записан
Даниил
Гость
« Ответ #17 : Август 12, 2011, 08:41 »

Цитировать
Можно-ли поподробней?
1. Ищем конец заголовка (два символа новой строки)
2. Считываем шестнадцатиричную длину чанка, находящуюся в отдельной строке. Если длина равна нулю, переходим к шагу 5.
3. Считываем в буфер число символов, полученных на предыдущем шаге.
4. Возвращаемся к шагу 2.
5. Распаковываем содержимое буфера.
Попробовал по данному алгоритму принимать данные. Результат тот же - получаемые данные не расжимаются функциями. И архив получается нечитабельным.
Записан
Serr500
Гость
« Ответ #18 : Август 12, 2011, 09:23 »

получаемые данные не расжимаются функциями. И архив получается нечитабельным.
1) Это не архив, а gzip-поток, у него нет заголовка, поэтому он не распознаётся как архив.
2) Какими функциями не разжимаются? qUncompress? И не будет.  Подмигивающий
3) http://blog.lugru.com/2010/06/compressing-decompressing-web-gzip-stream/ - возможно, поможет. Только там код предполагает наличие заголовка, а здесь его не будет.
Записан
Странник
Гость
« Ответ #19 : Август 12, 2011, 10:17 »

Дело в том, что в HTTP запросе я не передаю таковой параметр на сервер. И даже если его добавляю, сервер все равно жмет данные.
Единственный выход, как я понимаю - это все-таки расжимать данные.
если не передаете этот параметр - сервер все равно может сжимать данные, лучше явно запрещать. покажите запрос свой, не может же сервер так дико косячить.
Записан
DmP
Гость
« Ответ #20 : Август 12, 2011, 10:57 »

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

Пробовал разные заголовки типа:
Код:
?gzip=false
и т.д. и т.п. Все равно сжимает, нехороший такой.
На самом апаче отключить не могу, т.к. не один я туда бегаю.
Что такое HTTP заголовок?
И описание поля Accept-Encoding необходимого для отключения сжатия.
Дело в том, что в HTTP запросе я не передаю таковой параметр на сервер. И даже если его добавляю, сервер все равно жмет данные.
Единственный выход, как я понимаю - это все-таки расжимать данные.
Мне так показалось, что здесь есть какое то недопонимание: HTTP запрос - часть HTTP заголовка, но не наоборот. В запросе нельзя передать поле заголовка.
Записан
DmP
Гость
« Ответ #21 : Август 12, 2011, 11:01 »

Да, без текста программы не понятно, что происходит.
Записан
Даниил
Гость
« Ответ #22 : Август 12, 2011, 12:27 »

Код:
POST /axis2gzip_test_orders/services/WSProxyForDB?gzip=true HTTP/1.1
SOAPAction: urn:ACTION
User-Agent: USER
Host: HOST:PORT
Transfer-Encoding: chunked
Content-Type:text/xml; charset=Windows-1251

<?xml version="1.0" encoding="Windows-1251"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
        <soapenv:Header />
        <soapenv:Body>
             <CSqueryP xmlns=\"http://service/xsd\">
                 <arg0 xmlns="">{call mod_sync_GetRemoteServersDB}</arg0>
             </CSqueryP>
        </soapenv:Body>
    </soapenv:Envelope>
Вот тестовый запрос
Записан
DmP
Гость
« Ответ #23 : Август 12, 2011, 14:00 »

А текст программы, который формирует запрос и который получает ответ? Кстати в заголовке нет поля Accept-Encoding.
Записан
Даниил
Гость
« Ответ #24 : Август 12, 2011, 14:08 »

Запрос:
Код:
QByteArray QSslClient::ConfigureQuery()
{
    QByteArray param0 = "{call mod_sync_GetShowsList}";
    QByteArray request = "";
    QByteArray query = "";


    request += "<?xml version=\"1.0\" encoding=\"Windows-1251\"?>";
    request += "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">";
    request += "<soapenv:Header />";
    request += "<soapenv:Body><CSqueryP xmlns=\"http://service/xsd\">";
    request += "<arg0 xmlns=\"\">" + param0 + "</arg0>";
    request += "</CSqueryP></soapenv:Body></soapenv:Envelope>";

    int len = request.length();
    QString reqLen = QString::number(len, 10);

    query += "POST /Cobo/services/WSProxyForDB?gzip=true";
    query += " HTTP/1.1\r\n";
    query += "SOAPAction: \"";
    query += "urn:ACTION";
    query += "\"\r\n";
    query += "User-Agent: ";
    query += "AGENT";
    query += "\r\n";
    query += "Host: ";
    query += "HOST";
    query += ":";
    query += "PORT";
    query += "\r\n";
    query += "Accept: */*\r\nf";
    query += "Transfer-Encoding: chunked\r\n";
    query += "Content-Type:text/xml; charset=Windows-1251\r\n\r\n";
    query += reqLen + "\r\n";
    query += request;
    query += "\r\n0\r\n\r\n";

    return query;
}
Прием:
Код:
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();
    }
}
Записан
DmP
Гость
« Ответ #25 : Август 13, 2011, 10:50 »

Так что если написать что то вроде этого, то ни чего не меняется?
Код:
    query += "User-Agent: ";
    query += "AGENT";
    query += "\r\n";
    query += "Accept-Encoding: ";
    query += "\r\n";
Записан
Странник
Гость
« Ответ #26 : Август 13, 2011, 10:53 »

вряд ли поможет. судя по запросу, жмет не веб-сервер:
Код:
POST /Cobo/services/WSProxyForDB?gzip=true
Записан
DmP
Гость
« Ответ #27 : Август 13, 2011, 11:03 »

вряд ли поможет. судя по запросу, жмет не веб-сервер:
Код:
POST /Cobo/services/WSProxyForDB?gzip=true
Да точно, тогда автору остается только освоить прием чанков. Из кода выше можно только сказать, что он не гарантирует того, что пришли все данные от сервера.
Записан
Даниил
Гость
« Ответ #28 : Август 15, 2011, 06:50 »

Да точно, тогда автору остается только освоить прием чанков. Из кода выше можно только сказать, что он не гарантирует того, что пришли все данные от сервера.
Как это не гарантирует? На чем, извините построили такое предположение? Можно немного конкретики?
Записан
DmP
Гость
« Ответ #29 : Август 15, 2011, 09:28 »

Да точно, тогда автору остается только освоить прием чанков. Из кода выше можно только сказать, что он не гарантирует того, что пришли все данные от сервера.
Как это не гарантирует? На чем, извините построили такое предположение? Можно немного конкретики?
Имелось в виду, что вызовов slotReadyRead() может быть произвольное количество раз, в зависимости от объема данных и скорости канала. Т.е. хотел сказать, что постоянно нужно анализировать, пришли ли все данные или нужно ждать еще пакета.
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


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