Конференция "Сети" » Unzip SOAP response
 
  • amelnyk © (20.05.10 15:43) [0]
    Всем привет!
    Думал довольно стандартная ситуация, но запнулся и уже совсем измотался в поиске...

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

    Подскажите куда копать...
  • amelnyk © (21.05.10 17:58) [1]
    Родил решение). Может кому еще будет полезно...
    Создаю класс наследник THTTPReqResp, в котором переопределен метод Receive:

    [CODE=pas] TMyHTTPReqResp = class(THTTPReqResp)
       public
         procedure Receive(Context: Integer; Resp: TStream; IsGet: Boolean);override;
     end;[/CODE]

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

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

    [CODE=pas]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;[/CODE]

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