10

を使用してGZIPされたHTTP応答を解凍しようとしていGZIPInputStreamます。ただし、ストリームを読み込もうとすると、常に同じ例外が発生します。java.util.zip.ZipException: invalid bit length repeat

私のHTTPリクエストヘッダー:

GET www.myurl.com HTTP/1.0\r\n
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2) Gecko/20100115 Firefox/3.6\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3\r\n
Accept-Encoding: gzip,deflate\r\n
Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7\r\n
Keep-Alive: 115\r\n
Connection: keep-alive\r\n
X-Requested-With: XMLHttpRequest\r\n
Cookie: Some Cookies\r\n\r\n

HTTP応答ヘッダーの最後にpath=/Content-Encoding: gzip、gzipされた応答が続きます。

私は解凍するために2つの類似したコードを試しました:

更新:次のコードでは、tBytes = (the string after 'path=/Content-Encoding: gzip').getBytes ();

GZIPInputStream  gzip = new GZIPInputStream (new ByteArrayInputStream (tBytes));

StringBuffer  szBuffer = new StringBuffer ();

byte  tByte [] = new byte [1024];

while (true)
{
    int  iLength = gzip.read (tByte, 0, 1024); // <-- Error comes here

    if (iLength < 0)
        break;

    szBuffer.append (new String (tByte, 0, iLength));
}

そして、これは私がこのフォーラムで入手したものです:

InputStream     gzipStream = new GZIPInputStream   (new ByteArrayInputStream (tBytes));
Reader          decoder    = new InputStreamReader (gzipStream, "UTF-8");//<- I tried ISO-8859-1 and get the same exception
BufferedReader  buffered   = new BufferedReader    (decoder);

これはエンコーディングエラーだと思います。

よろしくお願いします、

bill0ute

4

2 に答える 2

9

tBytesここでは、gzipストリームの設定に使用するを取得する方法を示していません。

GZIPInputStream  gzip = new GZIPInputStream (new ByteArrayInputStream (tBytes));

1つの説明は、HTTP応答全体をに含めているということですtBytes。代わりに、HTTPヘッダーの後のコンテンツのみにする必要があります。

もう1つの説明は、応答がチャンク化されていることです。

編集:メッセージ本文としてコンテンツエンコーディング行の後のデータを取得しています。ただし、HTTP 1.1仕様によれば、ヘッダーフィールドは特定の順序ではないため、これは非常に危険です。

HTTP仕様のこの部分で説明されているように、要求または応答のメッセージ本文は、特定のヘッダーフィールドの後ではなく、最初の空の行の後にあります

要求(セクション5)および応答(セクション6)メッセージは、エンティティ(メッセージのペイロード)を転送するためにRFC822[9]の一般的なメッセージ形式を使用します。どちらのタイプのメッセージも、開始行、0個以上のヘッダーフィールド(「ヘッダー」とも呼ばれます)、ヘッダーフィールドの終わりを示す空の行(つまり、CRLFの前に何もない行)、および場合によってはメッセージ本文。

まだ正確に構成していることを示していませんtBytesが、この時点で、解凍しようとしているデータに誤って空の行が含まれていると思います。メッセージ本文は、空行のCRLF文字の後に始まります。

メッセージ本文を抽出する代わりに、 httpclientライブラリを使用することをお勧めしますか?

于 2010-03-19T01:01:36.223 に答える
1

ここで私が見ることができる問題があります。

int  iLength = gzip.read (tByte, 0, 1024);

以下を使用して修正してください。

        byte[] buff = new byte[1024];
byte[] emptyBuff = new byte[1024];
                            StringBuffer unGzipRes = new StringBuffer();

                            int byteCount = 0;
                            while ((byteCount = gzip.read(buff, 0, 1024)) > 0) {
                                // only append the buff elements that
                                // contains data
                                unGzipRes.append(new String(Arrays.copyOf(
                                        buff, byteCount), "utf-8"));

                                // empty the buff for re-usability and
                                // prevent dirty data attached at the
                                // end of the buff
                                System.arraycopy(emptyBuff, 0, buff, 0,
                                        1024);
                            }
于 2014-01-09T11:05:15.177 に答える