Обработка HTTP ContentEncoding "deflate" - PullRequest
12 голосов
/ 14 октября 2010

Какой InputStream тип должен использоваться для обработки потоков URLConnection, для которых HTTP Content-Encoding имеет значение deflate ?

Для Content-Encoding из gzip или zip я использую GZIPInputStream, никаких проблем.

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

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

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

Ответы [ 2 ]

22 голосов
/ 14 октября 2010

В 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));
1 голос
/ 25 мая 2014

К сожалению, использование InflaterInputStream с объектом Inflater не всегда приводило к правильной распаковке. Я должен был обнаружить заголовки и сообщить Инфлятору, где было смещение к полезной нагрузке.

http://thushw.blogspot.com/2014/05/decoding-html-pages-with-content.html

...