Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.05.2010, 15:29
amelnyk amelnyk вне форума
Прохожий
 
Регистрация: 20.05.2010
Сообщения: 2
Репутация: 10
По умолчанию Unzip SOAP response

Всем привет!
Думал довольно стандартная ситуация, но запнулся и уже совсем измотался в поиске...

Есть приложение, работающее по SOAP (через импортированный wsdl). Стала задача использовать зипование для SOAP ответов.
Я добавил заголовок ко всем запросам - "Accept-Encoding: gzip". Да, теперь получаю респонсы в зипованном виде...
Но тут стала проблемка...
Delphi при попытке распарсить зипованный ответ, выдаёт эксепшн:
An invalid character was found in text content.
Line: 1

Вылетает именно при вызове метода удаленного интерфейса, я сам с этим зипованным ответом еще не успеваю ничего сделать. Как распаковать ответ до его обработки?

Подскажите куда копать...
Ответить с цитированием
  #2  
Старый 21.05.2010, 17:58
amelnyk amelnyk вне форума
Прохожий
 
Регистрация: 20.05.2010
Сообщения: 2
Репутация: 10
По умолчанию

Родил решение). Может кому еще будет полезно...
Создаю класс наследник THTTPReqResp, в котором переопределен метод Receive:

Код:
 TMyHTTPReqResp = class(THTTPReqResp)
    public
      procedure Receive(Context: Integer; Resp: TStream; IsGet: Boolean);override;
  end;

Сам метод выглядит примерно так:

////////////////////////////////////////////////////////////////////////////////

Код:
procedure TMyHTTPReqResp.Receive(Context: Integer; Resp: TStream; IsGet: Boolean);
var
  outStream    : TMemoryStream;
  contEncoding : string;
  size         : DWord;
  index        : DWord;
begin
  inherited;

  try
    size := 20;
    index := 0;
    SetLength(contEncoding, size);
    //проверяем есть ли заголовок Content-Encoding
    if not HttpQueryInfo(Pointer(Context), HTTP_QUERY_CONTENT_ENCODING, @contEncoding[1], size, index) then
      Exit;

    //если есть, то смотрим стоит ли там gzip
    if Pos('gzip', contEncoding) = 0 then
      Exit;

    //если gzip, то разархивировываем и копируем в возвращаемый стрим
    Resp.Position := 0;
    outStream := TMemoryStream.Create;
    try
      GZDecompressStream(Resp, outStream);

      Resp.Position := 0;
      Resp.CopyFrom(outStream, 0)
    finally
      outStream.Free;
    end;
  except

  end;
end;
Admin: Учимся пользоваться тегами!

Где метод GZDecompressStream взят из либы Zlib, скачанной для Delphi 2009 отсюда: http://www.base2ti.com/zlib.htm
А то с родным ZLib че-то не сложилось, не хотел он распаковывать.

Последний раз редактировалось Admin, 21.05.2010 в 20:07.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:47.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter