Gestione HTTP ContentEncoding “sgonfiare”
-
30-09-2019 - |
Domanda
Cosa InputStream tipo dovrebbe essere utilizzato per i flussi URLConnection maniglia che hanno HTTP Content-Encoding insieme a deflate
Per un Content-Encoding di gzip o zip io uso un GZIPInputStream, nessun problema.
Per un Content-Encoding di "sgonfiare" Ho provato con InflaterInputStream e DeflaterInputStream , ma ottengo
java.util.zip.ZipException: sconosciuto metodo di compressione a java.util.zip.InflaterInputStream.read (InflaterInputStream.java:147)
Mi risulta che codifica "deflate" si riferisce a Zlib compressione, e secondo la docs questo dovrebbe essere gestita da InflaterInputStream.
Soluzione
HTTP / 1.1, Content-encoding: deflate
effettivamente si riferisce all'algoritmo di compressione DEFLATE, come definito dalla RFC 1951 , avvolto nel formato di dati zlib, come definito dalla RFC 1950 .
Tuttavia alcuni fornitori solo implementare l'algoritmo DEFLATE come definito RFC 1951, ignorando completamente RFC 1950 (intestazioni zlib).
Altri sono stati colpiti dallo stesso problema:
Per risolvere questo problema, tenta di creare un'istanza della InflaterInputStream
superando un Inflater
che è stato creato con il parametro nowrap
insieme a true
:
in = new InflaterInputStream(conn.getInputStream()), new Inflater(true));
Altri suggerimenti
Purtroppo, utilizzando l'InflaterInputStream con un oggetto Inflater non sempre produrre la decompressione. Ho dovuto rilevare le intestazioni e dire al Inflater in cui l'offset per il carico utile è stato.
http://thushw.blogspot.com/ 2014/05 / decodifica-html-pagine-con-content.html