# Soap Nachricht Content Encoding Gzip



## Lito (4. Okt 2017)

Hallo zusammen,

ich würde gerne wissen wie ich bei meinem Soap Request (ich nutze javax.xml.soap) das Contentencoding auf G-Zip stellen kann. Ich dachte das es wie MTOM einfach per annotation @MTOM(enabled = true)  setzen könnte. habe aber leider nichts dazu gefunden.
In SoapUI kann ich meinen Request senden und bekomme eine Antwort... als Einstellung in der Config von SoapUI habe ich nur folgende Einstellungen vorgenommen:
-Dsoapui.https.protocols=TLSv1.2
-Dsoapui.https.ciphers=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
ansonsten alles Default. Im Request selbst noch Enable MTOM true; aber das sollte ja über die Annotation @MTOM(enabled = true) abgedeckt sein.
Ich nehme an das genau diese Einstellung das Contentencoding Gzip bewirkt. Ich habe nirgends eine Einstellung Contentencoding gefunden. trotzdem liefert mir eclipse den faultstring vom Server : Error: HTTP data must be compressed; Content-Encoding must be set to gzip


----------



## Lito (5. Okt 2017)

```
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
createSoapEnvelope(soapMessage);
MimeHeaders headers = soapMessage.getMimeHeaders();
headers.addHeader("SOAPAction", this.action);
headers.addHeader("Accept-Encoding", "gzip, deflate");
headers.addHeader("Content-Encoding", "gzip");
```

Das klappt leider nicht


----------



## Lito (16. Nov 2017)

An welcher Stelle sage ich meinem Soaprequest das er das HTTP gzippen soll ? Ich bin ein bischen am Verzweifeln, weder die MIME Header schaffen Abhilfe, noch die Verwendung von Axis2 HTTPConstants.

soapMessage.setProperty(HTTPConstants.MC_GZIP_REQUEST, true);
soapMessage.setProperty(HTTPConstants.COMPRESSION_GZIP, true);


Bin offen für wilde spekulationen.

Vielen dank im Voraus


----------



## taro (16. Nov 2017)

Bevor du einen Monolog halten musst, schmeiß einfach mal einen Link in die Runde ... und behaupte ohne weitere Prüfung: Du musst den Content dann auch selbst gzippen:

Beispiel: http://testws.galileo.com/GWSSample/Help/GWSHelp/gzip_java_request_response.htm

Viele Grüße


----------



## Lito (16. Nov 2017)

Vielen Dank für deine Antwort, das habe ich fast befürchtet. 
Wenn ich einen String g-zippe bekomme ich ja einen ByteArray als Antwort. 

Meine hoffnung war das ich die SOAPMessage direkt g-zippen kann. 

naja das zippen soll kein Probem darstellen, allerdings frage ich mich jetzt wie ich die g-zippte Soapnachricht an den Server weiterleite ? vorher habe ich nachdem ich meine SOAPMessage zusammengebaut habe einfach die .call Methode meiner SOAPConnection aufgerufen. die benötigt allerdings eine SOAPMessage als Prameter. siehe hier : https://docs.oracle.com/javase/7/docs/api/javax/xml/soap/SOAPConnection.html. Wie sende ich jetzt meinen Request an den Soapserver ?

Thxs


----------



## Lito (16. Nov 2017)

Muss denn die ganze Soap Nachricht g-Zippt werden oder lässt man den Header bzw Envelope uncompresst ?
Wenn ich mir den Raw Request in SoapUi anschaue sehe ich headder Informationen und danach kommt der Request als gezippter bytestream. Für mich sieht es aber ganz klar danach aus als ob die komplette Nachricht g-Zippt wird. Wenn ich g-Zip deaktiviere sehe ich die Komplette Nachricht (Envelope) im Klartext.


----------



## Lito (21. Nov 2017)

Soweit ich das Verstehe wird der ganze Envelope gzipt. Das gzipen muss ich auch selber übernehmen es gibt kein "Hebel" den ich schalten kann, weder als Annotation noch als Header !?
Ich gebe dem Header die ensprechenden infos:

Ich baue meine Soapnachricht nicht als String zusammen sondern als SOAPMessage finde ich intuitiver. Danach lese ich den Soapenvelope als String aus gzippe diesen String => zu einem byteArray. dieses wird in ein Inputstream eingelesen um damit wiederum eine neue gezippte SOAPMessage zu erzeugen. Der Fehler passiert beim erstellen der Soapnachricht aus dem Inputstream. (siehe unten)

MimeHeaders mheaders = soapMessage.getMimeHeaders();
mheaders.setHeader("Content-Encoding", "gzip"); // Ausgehend 
mheaders.setHeader("Accept-Encoding", "gzip,deflate");  // Eingehend
mheaders.setHeader("SOAPAction", "submit"+this.action);
Gzippe den kompletten Envelop und erstelle eine neue Soapnachricht mittels :

SOAPMessage gzipReq = messageFactory.createMessage(mheaders, SoapNachricht als gzip Inputstream);
leider bekomme ich eine seltsame Fehlermeldung, dass aus dem Content kein SoapEnvelope erstellt werden kann:
ERROR:  'Ungültiges Byte 1 von 1-Byte-UTF-8-Sequenz.'
Nov 21, 2017 5:03:43 PM com.sun.xml.internal.messaging.saaj.soap.EnvelopeFactory createEnvelope
SCHWERWIEGEND: SAAJ0511: Envelope kann nicht aus angegebener Quelle erstellt werden.
 allerdings nur wenn ich die mir die SOAPnachricht im Debugger anschaue. Tu ich das nicht kommt keine Fehlermeldung allerdings antwortet mir der Server "Malform content" vor dem Zippen kam die meldung "Contentencoding must be gzip"


----------

