Распакуйте ответ HTTP GZIPed в Java

Я пытаюсь распаковать Ответ HTTP GZIPed при помощи 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, сопровождаемый gziped ответом.

Я попробовал 2 кода similars для распаковки:

ОБНОВЛЕНИЕ: В следующих кодах, 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

9
задан bill0ute 19 March 2010 в 01:19
поделиться

1 ответ

Вы не показываете, как вы получаете tBytes, которые вы используете для настройки gzip-потока:

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

Одно из объяснений заключается в том, что вы включаете весь HTTP-ответ в tBytes. Вместо этого, это должно быть только содержимое после HTTP-заголовков.

Другое объяснение заключается в том, что ответ chunked.

edit: Вы принимаете данные после строки content-encoding за тело сообщения. Однако, согласно спецификации HTTP 1.1, поля заголовка не идут в каком-либо определенном порядке, так что это очень опасно.

Как объясняется в этой части спецификации HTTP, тело сообщения запроса или ответа идет не после определенного поля заголовка, а после первой пустой строки:

Запрос (раздел 5) и Ответ (раздел 6) сообщения используют общий формат сообщений RFC 822 [9] для передачи сущностей (полезная нагрузка сообщения). Оба типа сообщений состоят из начальной строки, нуля или более полей заголовка (также известных как "заголовки"), пустой строки (т.е. строка, в которой нет ничего, предшествующего CRLF) указывающая на конец полей заголовка и, возможно, тело сообщения.

Вы все еще не показали, как именно вы составляете tBytes, но на данный момент я думаю, что вы ошибочно включаете пустую строку в данные, которые пытаетесь распаковать. Тело сообщения начинается после символов CRLF пустой строки.

Могу я предложить вам вместо этого использовать библиотеку httpclient для извлечения тела сообщения?

9
ответ дан 4 December 2019 в 21:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: