Мы пробовали использовать выходной поток Deflater и выходной поток GZIP на стороне сервера для сжатия ответа и модуль Pako на стороне клиента для его распаковки. Использование deflater дает консольную ошибку «неперехваченное исключение: недопустимое расстояние слишком далеко назад» в браузере, а использование gzip дает «неперехваченное исключение: недопустимый тип блока».
Из того, что я прочитал, браузер должен иметь возможность распаковывать сам ответ, но с помощью response.addHeader ("Content-Encoding", "gzip"); " не работает. Ошибки нет, ответ просто не имеет этого заголовка, когда браузер его получает.
Код дефлатера:
private static String compress(String str)
{
try
{
final ByteArrayOutputStream out = new ByteArrayOutputStream();
try
{
final DeflaterOutputStream def = new DeflaterOutputStream(out, new Deflater(Deflater.BEST_COMPRESSION, true));
try
{
def.write(str.getBytes());
return new String(Base64.encodeBase64(out.toByteArray()));
}
finally
{def.close();}
}
finally
{out.close();}
}
catch(IOException e)
{
LOGGER.warn("Failed to compress.");
}
return str;
Код Gzip.
try
{
final ByteArrayOutputStream out = new ByteArrayOutputStream();
try
{
final GZIPOutputStream gzip = new GZIPOutputStream(out);
try
{gzip.write(str.getBytes());}
finally
{gzip.close();}
return out.toString("UTF-8");
}
finally
{out.close();}
}
catch(IOException e)
{LOGGER.warn("Failed to compress.");}
return str;
}
Призыв пако
LandAdditions.prototype.loadfields = function() {
let me = this;
me.loadingBanner().show();
var url =
"/rest/accounts/" + app.accountIdBox().val() + "/land_additions/fields";
$.get(url)
.done(function(data) {
me.onLoadFields(JSON.parse(pako.inflateRaw(data, { to: 'string'})));





Deflater (sic) производит необработанные данные deflate, которые вы затем кодируете в кодировке Base-64. Ваш декодер pako сначала не декодирует кодировку Base-64, поэтому inflateRaw получает кучу символов Base-64 вместо ожидаемого необработанного потока deflate.
GZIPOutputStream создает поток дефлятирования, обернутый gzip. inflateRaw ожидает необработанный поток deflate, но вместо этого получает заголовок gzip, который не ищет и интерпретирует как недопустимые данные deflate.
Для первого нужно расшифровать Base-64. Для второго вам нужно декодировать данные gzip, для которых у pako есть ungzip.
Кстати, вы не хотите кодировать двоичные данные как UTF-8. UTF-8 не может представлять все двоичные последовательности.
Спасибо за вашу помощь. Мы вернулись к GZIPOutputStream на стороне сервера, но когда мы используем pako.ungzip, мы получаем ошибку: «неправильная проверка заголовка».