Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   SOAP mit gzip-Übertragung (https://www.delphipraxis.net/179712-soap-mit-gzip-uebertragung.html)

Zwixx 26. Mär 2014 13:38

SOAP mit gzip-Übertragung
 
Hallo,

ich versuche gerade SOAP-Nachricht die per gzip gepackt ist zu entpacken. An vielen Stellen im Netz gibt es da die einfache Möglichkeit per:

Delphi-Quellcode:
procedure TfrmMain.HTTPRIOHTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp;
  Data: Pointer);
const
  contentEncodingHeader : WideString = 'Accept-Encoding: gzip, deflate';
var
  Flag: LongBool;
begin
  Flag := True;
  if not HttpAddRequestHeaders(Data, PWideChar(contentEncodingHeader),
     Length(contentEncodingHeader), HTTP_ADDREQ_FLAG_ADD) then
    RaiseLastOSError;
  if not InternetSetOption(Data, INTERNET_OPTION_HTTP_DECODING,
     @Flag, SizeOf(Flag)) then
    RaiseLastOSError;
end;
gzip anzufordern und auch durch WinInet wieder entkodieren zu lassen. Problem ist, bei mir gibt es immer die Exception "Die Inhaltsdecodierung ist fehlgeschlagen."

Ich habe per WireShark nachgeprüft, die Daten kommen gepackt an.

System: Windows 7, IE11, Delphi XE5

Hat jemand eine Idee woran das liegen könnte?

Union 26. Mär 2014 16:11

AW: SOAP mit gzip-Übertragung
 
Wie sieht denn das SOAP-Paket aus? Was sagt Fiddler im SOAP-Modus dazu?

Zwixx 27. Mär 2014 06:41

AW: SOAP mit gzip-Übertragung
 
Das SOAP-Paket was zum Server geht ist nicht gezippt, sieht gut aus. Das Paket was vom Server zurück kommt ist gepackt (gzip), ausgepackt sieht es auch gut aus (Fiddler).

Union 27. Mär 2014 06:57

AW: SOAP mit gzip-Übertragung
 
Hast Du es mal so versucht:
Delphi-Quellcode:
InternetSetOption(Data, INTERNET_OPTION_HTTP_DECODING,
    PChar(@Flag), SizeOf(Flag));

Zwixx 27. Mär 2014 07:13

AW: SOAP mit gzip-Übertragung
 
Ja, habe ich - keinen Erfolg. Allerdings macht es eh keinen Unterschied ob man das vorher in einen anderen Typ verwandelt... Pointer bleibt Pointer.

SoapUI sagt auch, das alles in Ordnung ist und auch eine Validierung des Ergebnisses gegen den Server zeigte keine Fehler.

Zwixx 2. Apr 2014 08:07

AW: SOAP mit gzip-Übertragung
 
Im Endeffekt habe ich nun 7zip verwendet um die Daten zu dekomprimieren. Funktioniert hervorragend.

Union 2. Apr 2014 08:47

AW: SOAP mit gzip-Übertragung
 
Ist denn das ganze Paket gezippt oder nur ein bestimmter Wert? Wenn es nur ein bestimmter Response Wert wäre, könntest Du den in ein TBytes schreiben und dann mit Soap.EncdDecd.DecodeBase64 und IDZlib.DecompressStream umwandeln. Hier mal ein Beispiel, wo die Response ein komplettes Dataset darstellt, das gezipped und base64-codiert ist:

Delphi-Quellcode:
// WSDL-Generierte Interfacefunktion
function GetUserReports(const Sessionid: string): TByteDynArray; stdcall;

function TQCClient.GetUserReports: boolean;
var
  UserReportData : TByteDynArray;
begin
  UserReportData := IQC.GetUserReports(FSessionID);
  DynArrayToDataSet(UserReportData);
  result := True;
end;

procedure TQCClient.DynArrayToDataset(ADynArray: TByteDynArray);
var
  InStream : TMemoryStream;
  OutStream : TStringStream;
  DecodedData : TBytes;
begin
  DecodedData := DecodeBase64(AnsiString(ADynArray));
  InStream   := TMemoryStream.Create;
  try
    InStream.Write(DecodedData, length(LoginData));
    InStream.Position := 0;
    OutStream := TStringStream.Create;
    try
      DecompressStream(InStream, OutStream);
      OutStream.Position := 0;
      FDataSet.Active := False;
      FDataSet.LoadFromStream(OutStream);
      FDataSet.Active := True;
    finally
      OutStream.Free;
    end;
  finally
    InStream.Free;
  end;
end;
Der return-Wert sah dann z.b. so aus (return mit ... gekürzt):
Code:
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <NS1:GetUserReportsResponse xmlns:NS1="urn:CDSReportPublicInterfaceIntf-ICDSReportPublicInterface">
     <return xsi:type="xsd:base64Binary">ZUp6VVhHdHo0a2F6L2l0VHBDcGwxOEZZRis2Sms4SmNkamxyR3dmazNleEpwVndDRGFCWVNLd3V0...</return>
    </NS1:GetUserReportsResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Zwixx 2. Apr 2014 08:57

AW: SOAP mit gzip-Übertragung
 
Nein, das gesamte Paket. Der Server komprimiert den kompletten Request mit gzip. Quasi so, wie wenn man im Browser Content-Type: gzip anfordert.

Ich habe einfach einen eigenen Converter geschrieben der die Daten entgegennimmt und wenn sie mit gzip komprimiert sind entkomprimiert.

Union 2. Apr 2014 09:32

AW: SOAP mit gzip-Übertragung
 
Und was steht im content-encoding des Antwortpakets genau drin: deflate oder gzip? Es kann u.U. sein, dass ein Virenscanner den rausfiltert.

Union 2. Apr 2014 09:34

AW: SOAP mit gzip-Übertragung
 
Und was steht im content-encoding des Antwortpakets genau drin: deflate oder gzip? Es kann u.U. sein, dass ein Virenscanner den rausfiltert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:27 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz