2017-05-19 84 views
1

gzippedデータ+チャンクエンコーディングでHTTPリクエストの本体を取得しようとしています。コード私が使用しています:要するにgzipで圧縮されたチャンクデータを読むJavaでHTTP 1.1

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() 

を、プログラムはチャンクサイズを読み取り、(「\ n」は「\ n」は+チャンクサイズまでから)ByteArrayOutputStream bに全体の要求の一部を書き込み、繰り返しサイズ0のチャンクが見つかるまで処理します。

このようなデータを解凍しようとすると、私はいつも破損したデータ警告を受け取ります。 java.util.zip.ZipException: invalid distance too far back

私が間違っていると思われることは何ですか?

答えて

2

必須のプリアンブル:プロフェッショナルな文脈では、私は常にこのためのライブラリを使用します。たとえば、あなたのためにそれを扱う(そしてはるかに)Apache HttpComponentsを参照してください。ライブラリを必要とせず、リスクのようなものがある場合は、JREにsun.net.www.http.ChunkedInputStreamがあります。

また、プロのコンテキストで記述変数名は好ましいであろう:)

とにかく、私は間違いを見た:p-1、ない0で初期化する必要があります。

その修正と私は、次の(礼儀Wikipedia)デコードできるので、それは、すべてのだそうです。この中

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 

を:

Wikipedia in 

chunks. 

(はいそれが予想される出力され、ウィキペディアを参照してくださいページ)。あなたは、0にあなたが4を読むためにそれを使用する必要があり、最初の時間をpを初期化する場合は

、あなたはp+1を使用しているので、4を指します。

私の例はgzippedではありませんが、私の指摘は、エラーは最初のチャンクのサイズを読み取るコードにあるため、問題ではないはずです...そして幸運にも唯一の間違いです。

+0

Holy moly !!!奨励金の種類を取る。編集:それは22hで利用可能です。 – carobnodrvo

+1

これは私の[第2の "聖*"](http://stackoverflow.com/questions/44032813/start-native-terminal-with-command-arguments-java/44091598?noredirect=1#comment75206712_44091598)コメントです。 ) –

関連する問題