Обработка HTTP ContentEncoding "deflate"

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

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

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

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

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

Ответ 1

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

Ответ 2

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

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