Обработка 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