Undefinierte Zeichenketten in SOAP Nachricht

Status
Nicht offen für weitere Antworten.

Conn

Aktives Mitglied
Hallo,

sitze gerade an meiner Bachelor Thesis. Möchte für Forschungszwecke eine komplett eigenständige SOAP WebService Implementierung erstellen(ohne die gängigen Frameworks).

Habe einen SOAP Client geschrieben der zunächst für Testzwecke eine SOAP Request an einen deployten JAX-WS WebService schickt und einen entsprechende SOAP Response erhält. Leider enthält dieser undefinierte Zeichenketten (hier 5d c8 und 0), hier die Antwort mit Header:
Code:
HTTP/1.1 200 OK
Transfer-encoding: chunked
Content-type: text/xml; charset=utf-8

5d
<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body
c8
><ns2:sendPollResponse xmlns:ns2="http://ba-finkelstein.org/wsdl/EPCglobalEPCISService"><return><queryName>Neu:Das ist wieder ein Test</queryName></return></ns2:sendPollResponse></S:Body></S:Envelope>
0

Kennt jemand ein ähnliches Phänomen. Hatte überlegt, dass das was mit der Zeichenkodierung charset=utf-8 zu tun haben könnte, konnte aber keine Dekodierung finden, die diese Zeichenketten aufgelöst hätte.

Für mögliche Antworten oder Hinweise im Voraus vielen Dank.

Viele Grüße,
Conrad

@admin
SORRY an falscher stelle gepostet ... bitte nach SOA verschieben ... vielen Dank
 
Zuletzt bearbeitet:
Ist mir auch schon aufgefallen. Da ich selbst nicht der Implementer war, wars mir aber bisher egal.

Das scheint mit dem Übertragungsmodus "chunked" zusammenzuhängen. 5d z. B. ist 93 und die Zeile, die danach folgt, ist auch genau 93 Zeichen lang. Ist also keine Sache von SOAP, sondern HTTP. Im entsprechenden RFC dürfte das zu finden sein.
 
@musiKk
Vielen Dank für die Antwort.
Das war der entscheidende Hinweis:

The content can be broken up into a number of chunks; each of which is prefixed by its size in bytes. A zero size chunk indicates the end of the response message. If a server is using chunked encoding it must set the Transfer-Encoding header to "chunked".
Quelle: HTTP Chunked Encoding
 
Würde gerne ergänzend noch eine Frage loswerden.
Gibt es irgendeine besonders schöne(performante) Variante den "chunked" Inputstream auzulesen??

Hatte eigentlich vor den InputStream direkt an die XMLStreamReader Klasse weiterzuleiten. Dadurch das ich ja nun im Vorfeld nicht weiß, welche Teile notwendig sind, muss ich einzelne String-Teile in StringBuilder Objekten zwischenspeichern(in meiner Lösung):

Code:
       StringBuilder tmpBuilder = new StringBuilder();
       boolean hit = false;
       int chunckedInt;

       int c;
       while((c=inputStream.read())!=-1) {         
            if((char)c != '\r' && (char)c != '\n') {
                if(hit) hit = false;
                tmpBuilder.append((char)c);
            }
            else if(!hit) {

                if(tmpBuilder.toString().matches(("\\p{XDigit}+"))) {

                    hit = true;
                    chunckedInt = Integer.parseInt(tmpBuilder.toString(), 16);

                    if(chunckedInt == 0) {
                        tmpBuilder = new StringBuilder();
                        break;
                    }

                }
                else {
                    this.inputPipe.getOutputStream().write(tmpBuilder.toString().getBytes());
                }
                tmpBuilder = new StringBuilder();
            }
        }

        this.inputPipe.getOutputStream().write(tmpBuilder.toString().getBytes());
        this.inputPipe.getOutputStream().close();


Bewege mich in Regionen jenseits der 100.000 Objekte, deshalb hatte ich eine unmittelbare Streamverarbeitung angedacht. Leider macht mir hier das "Chunked Encoding" einen Strich durch die Rechnung.

Falls Ihr nochmal eine Idee habt, erneut im Voraus vielen Dank.

Viele Grüße,
Conrad
 
Hier der letzte Beitrag zum Thema. Meine Lösung mit der ich vorerst weiterarbeiten will. Hierbei werden die Zeichen die zur SOAP Message gehören rausgefiltert und direkt an den verarbeitenden Stream weitergegeben.

Code:
 public void readInputStream(InputStream inputStream) throws IOException {

        boolean chunked = true;
        StringBuilder chunkedBuilder = new StringBuilder();

        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        InputStreamReader inputStreamReader = new InputStreamReader(bufferedInputStream,"UTF-8");
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(this.inputPipe.getOutputStream(),"UTF-8");

        int bytes = 0;
        int c;
        while ((c = bufferedReader.read()) != -1) {


           

            if ((char) c != '\r' && (char) c != '\n') {
                if (chunked) {
                    chunkedBuilder.append((char) c);

                } else {

                    if (bytes == 0) {
                        bytes = Integer.parseInt(chunkedBuilder.toString(), 16);
                        chunkedBuilder.delete(0, chunkedBuilder.length());

                    }

                    if (bytes > 0) {

                       

                        bytes -= this.countBytesForChar((char)c);
                        outputStreamWriter.write(c);
                    }

                }
            } else {
                if (chunkedBuilder.length() > 0) {
                    chunked = false;
                } else {
                    chunked = true;
                }

                if (chunkedBuilder.length() == 1 && chunkedBuilder.charAt(0) == '0') {
                    break;
                }

            }

        }


        outputStreamWriter.close();



   

    }

    private int countBytesForChar(char c) {
        byte[] byteArray = {(byte) (c & 0xff), (byte) (c >> 8 & 0xff)};
        if (byteArray[1] == 0) {
            return 1;
        } else {
            return 2;
        }

    }
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben