Pergunta

Estou tentando descompactar uma resposta HTTP GziPed usando GZIPInputStream. No entanto, sempre tenho a mesma exceção quando tento ler o fluxo: java.util.zip.ZipException: invalid bit length repeat

Meu cabeçalho de solicitação 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

No final do cabeçalho da resposta HTTP, eu entendo path=/Content-Encoding: gzip, seguido pela resposta gziped.

Eu tentei 2 códigos semelhantes para descrever:

ATUALIZAÇÃO: Nos seguintes códigos, 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));
}

E este que eu pego neste fórum:

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

Eu acho que este é um erro de codificação.

Atenciosamente,

Bill0Ute

Foi útil?

Solução

Você não mostra como você consegue o tBytes que você usa para configurar o fluxo GZIP aqui:

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

Uma explicação é que você está incluindo toda a resposta HTTP em tBytes. Em vez disso, deve ser apenas o conteúdo após os cabeçalhos HTTP.

Outra explicação é que a resposta é emitido.

editar: Você está pegando os dados após a linha de codificação de conteúdo como o corpo da mensagem. No entanto, de acordo com a especificação HTTP 1.1, os campos do cabeçalho não vêm em nenhuma ordem específica, portanto isso é muito perigoso.

Como explicado nesta parte do Especificação HTTP, o corpo da mensagem de um pedido ou resposta não vem após um campo de cabeçalho específico, mas Após a primeira linha vazia:

As mensagens de solicitação (seção 5) e resposta (seção 6) usam o formato de mensagem genérico da RFC 822 [9] para transferir entidades (a carga útil da mensagem). Ambos os tipos de mensagem consistem em campos de inicialização, zero ou mais cabeçalho (também conhecidos como "cabeçalhos"), uma linha vazia (ou seja, uma linha sem nada que precede o CRLF) indicando a extremidade dos campos de cabeçalho e possivelmente a Corpo da mensagem.

Você ainda não mostrou como exatamente você compõe tBytes, mas neste momento acho que você está erroneamente incluindo a linha vazia nos dados que você tenta descomprimir. O corpo da mensagem inicia após os caracteres da CRLF da linha vazia.

Posso sugerir que você use o httpClient Biblioteca para extrair o corpo da mensagem?

Outras dicas

Bem, há o problema que posso ver aqui;

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

Use a seguir para corrigir isso;

        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);
                            }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top