2017-05-19 3 views
1

Ich versuche, Körper einer HTTP-Anfrage mit gziped Daten + chunked Kodierung zu erhalten. Der Code ich verwende:Das Lesen von gziped chunked Daten HTTP 1.1 in Java

byte[] d; // *whole* request body 

ByteArrayOutputStream b = new ByteArrayOutputStream(); 

int c = 0; 
int p = 0; 

int s = 0; 

for(int i = 0; i < d.length; ++i) { 
    if (s == 0 && d[i] == '\r' && d[i + 1] == '\n') { 
     c = Integer.parseInt(new String(Arrays.copyOfRange(d, p+1, i)), 16); 

     if(c == 0) break; 

     b.write(Arrays.copyOfRange(d, i+2, i+2+c)); 

     p = i + 1; 
     i += c + 1; 

     s = 1; 
    } else if (s == 1 && d[i] == '\r' && d[i + 1] == '\n') { 
     p = i + 1; 
     s = 0; 
    } 
} 

// here comes the part where I decompress b.toByteArray() 

Kurz gesagt, liest das Programm Chunkgröße und schreibt Teil des Ganzen Anfrage (von ‚\ n‘ auf die ‚\ n‘ + Chunkgröße) an die ByteArrayOutputStream b und wiederholen Sie die verarbeiten, bis Chunk mit der Größe 0 gefunden wird.

Wenn ich versuche, solche Daten zu dekomprimieren, bekomme ich immer einige beschädigte Daten Warnung, z. java.util.zip.ZipException: invalid distance too far back.

Irgendwelche Gedanken, was ich falsch machen könnte?

Antwort

2

Obligatorische Präambel: In einem professionellen Kontext würde ich immer eine Bibliothek dafür verwenden. Siehe Apache HttpComponents zum Beispiel, das würde das (und viel mehr) für Sie behandeln. Wenn Sie keine Bibliothek möchten und Risiko mögen, gibt es in der JRE sun.net.www.http.ChunkedInputStream.

Auch in einem professionellen Kontext beschreibende Variablennamen wäre vorzuziehen :)

Wie dem auch sei, sah ich einen Fehler: p sollte mit -1 initialisiert werden, nicht 0.

Es scheint, das ist alles, denn mit diesem Update kann ich die folgende (mit freundlicher Genehmigung Wikipedia) dekodieren:

4\r\n 
Wiki\r\n 
5\r\n 
pedia\r\n 
E\r\n 
in\r\n 
\r\n 
chunks.\r\n 
0\r\n 
\r\n 

in dieser:

Wikipedia in 

chunks. 

(ja, das ist die erwartete Ausgabe, siehe Wikipedia Seite).

Wenn Sie p-0 initialisieren, dann das erste Mal, wenn Sie es verwenden müssen 4 zu lesen, das Sie verwenden p+1 so zeigt es nach die 4.

Ich merke, mein Beispiel ist nicht gezippt, aber mein Punkt ist, dass der Fehler in dem Code ist, der die Größe des ersten Chunks liest, also sollte es keine Rolle spielen ... und mit etwas Glück wird das der einzige Fehler sein.

+0

Heilige Moly !!! Nehmen Sie die Kopfgeld-Art Sir. Bearbeiten: Es ist verfügbar in 22h. – carobnodrvo

+1

Das ist mein [zweites "Heiliges *"] (http://stackoverflow.com/questions/44032813/start-native-terminal-with-command-arguments-java/44091598?noredirect=1#comment75206712_44091598) Kommentar heute, danke;) –

Verwandte Themen