2010-10-14 6 views
11

Что InputStream типа следует использовать для обработки URLConnection потоков, которые HTTP ContentEncoding набор для выкачать?Обработка HTTP ContentEncoding "выкачать"

Для кодирования содержимого gzip или zip Я использую GZIPInputStream, без проблем.

Для Content-Encoding из "выкачать" Я попытался с помощью InflaterInputStream и DeflaterInputStream, но я получаю

java.util.zip.ZipException: неизвестный метод сжатия в java.util .zip.InflaterInputStream.read (InflaterInputStream.java:147)

Я понимаю, что "выкачать" кодирование относится к Zlib, и в соответствии с docs это должно обрабатываться InflaterInputStream.

ответ

22

В HTTP/1.1, Content-encoding: deflate фактически ссылается на алгоритм сжатия DEFLATE, как определено RFC 1951, завернутый в формат данных zlib, как определено RFC 1950.

Однако некоторые производители просто реализуют алгоритм DEFLATE, как определено RFC 1951, полностью игнорируя RFC 1950 (без заголовков zlib).

Другие были поражены одним и тем же вопросом:

Для того, чтобы обойти эту проблему, попробуйте создать экземпляр InflaterInputStream пропускании Inflater, который был создан с nowrap параметр установлен на true:

in = new InflaterInputStream(conn.getInputStream()), new Inflater(true)); 
+0

Оба РЛК, кажется, ссылка Zlib, но я думаю, разные версии? . – Joel

+0

«6.2.2.2 выкачивает Кодирование „выкачать“формат определяется как„спустить“компрессионный механизм (описанный в [RFC1951]), используемый внутри„формата“данных ZLib ([RFC1950]) Примечание: Некоторые неправильно реализация отправляет сжатые данные «сдуть» без обложек zlib ». - http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p1-messaging-11.html#rfc.section.6.2.2.2 –

+0

Ваше предложение пройти Inflater сработало! Благодарю. – Joel

Смежные вопросы