Сжатие данных
Сжатие и распаковка данных с использованием алгоритмов gzip, deflate, zlib, brotli и zstd.
Загрузка
local compress = require("compress")
GZIP
Наиболее широко поддерживаемый формат (RFC 1952).
Сжатие {id="gzip-compress"}
-- Сжатие для HTTP-ответа
local body = json.encode(large_response)
local compressed, err = compress.gzip.encode(body)
if err then
return nil, err
end
-- Установка заголовка Content-Encoding
res:set_header("Content-Encoding", "gzip")
res:write(compressed)
-- Максимальное сжатие для хранения
local archived = compress.gzip.encode(data, {level = 9})
-- Быстрое сжатие для реального времени
local fast = compress.gzip.encode(data, {level = 1})
| Параметр |
Тип |
Описание |
data |
string |
Данные для сжатия |
options |
table? |
Опции кодирования (опционально) |
Опции {id="gzip-compress-options"}
| Поле |
Тип |
Описание |
level |
integer |
Уровень сжатия 1-9 (по умолчанию: 6) |
Возвращает: string, error
Распаковка {id="gzip-decompress"}
-- Распаковка HTTP-запроса
local content_encoding = req:header("Content-Encoding")
if content_encoding == "gzip" then
local body = req:body()
local decompressed, err = compress.gzip.decode(body)
if err then
return nil, errors.new("INVALID", "Invalid gzip data")
end
body = decompressed
end
-- Распаковка с ограничением размера (защита от zip-бомб)
local decompressed, err = compress.gzip.decode(data, {max_size = 10 * 1024 * 1024})
if err then
return nil, errors.new("INVALID", "Decompressed size exceeds 10MB limit")
end
| Параметр |
Тип |
Описание |
data |
string |
Сжатые GZIP-данные |
options |
table? |
Опции декодирования (опционально) |
Опции {id="gzip-decompress-options"}
| Поле |
Тип |
Описание |
max_size |
integer |
Макс. размер после распаковки в байтах (по умолчанию: 128MB, макс: 1GB) |
Возвращает: string, error
Brotli
Лучшая степень сжатия для текста (RFC 7932).
Сжатие {id="brotli-compress"}
-- Лучше всего подходит для статических ресурсов и текста
local compressed = compress.brotli.encode(html_content, {level = 11})
-- Кэширование сжатых ресурсов
cache:set("static:" .. hash, compressed)
-- Умеренное сжатие для API-ответов
local compressed = compress.brotli.encode(json_data, {level = 4})
| Параметр |
Тип |
Описание |
data |
string |
Данные для сжатия |
options |
table? |
Опции кодирования (опционально) |
Опции {id="brotli-compress-options"}
| Поле |
Тип |
Описание |
level |
integer |
Уровень сжатия 0-11 (по умолчанию: 6) |
Возвращает: string, error
Распаковка {id="brotli-decompress"}
local decompressed, err = compress.brotli.decode(compressed_data)
if err then
return nil, err
end
-- С ограничением размера
local decompressed = compress.brotli.decode(data, {max_size = 50 * 1024 * 1024})
| Параметр |
Тип |
Описание |
data |
string |
Сжатые Brotli-данные |
options |
table? |
Опции декодирования (опционально) |
Опции {id="brotli-decompress-options"}
| Поле |
Тип |
Описание |
max_size |
integer |
Макс. размер после распаковки в байтах (по умолчанию: 128MB, макс: 1GB) |
Возвращает: string, error
Zstandard
Быстрое сжатие с хорошим соотношением (RFC 8878).
Сжатие {id="zstd-compress"}
-- Хороший баланс скорости и степени сжатия
local compressed = compress.zstd.encode(binary_data)
-- Высокое сжатие для архивов
local archived = compress.zstd.encode(data, {level = 19})
-- Быстрый режим для потоковой передачи
local fast = compress.zstd.encode(data, {level = 1})
| Параметр |
Тип |
Описание |
data |
string |
Данные для сжатия |
options |
table? |
Опции кодирования (опционально) |
Опции {id="zstd-compress-options"}
| Поле |
Тип |
Описание |
level |
integer |
Уровень сжатия 1-22 (по умолчанию: 3) |
Возвращает: string, error
Распаковка {id="zstd-decompress"}
local decompressed, err = compress.zstd.decode(compressed_data)
if err then
return nil, err
end
| Параметр |
Тип |
Описание |
data |
string |
Сжатые Zstandard-данные |
options |
table? |
Опции декодирования (опционально) |
Опции {id="zstd-decompress-options"}
| Поле |
Тип |
Описание |
max_size |
integer |
Макс. размер после распаковки в байтах (по умолчанию: 128MB, макс: 1GB) |
Возвращает: string, error
Deflate
Чистое DEFLATE-сжатие (RFC 1951). Используется внутри других форматов.
Сжатие {id="deflate-compress"}
local compressed = compress.deflate.encode(data, {level = 6})
| Параметр |
Тип |
Описание |
data |
string |
Данные для сжатия |
options |
table? |
Опции кодирования (опционально) |
Опции {id="deflate-compress-options"}
| Поле |
Тип |
Описание |
level |
integer |
Уровень сжатия 1-9 (по умолчанию: 6) |
Возвращает: string, error
Распаковка {id="deflate-decompress"}
local decompressed = compress.deflate.decode(compressed)
| Параметр |
Тип |
Описание |
data |
string |
Сжатые DEFLATE-данные |
options |
table? |
Опции декодирования (опционально) |
Опции {id="deflate-decompress-options"}
| Поле |
Тип |
Описание |
max_size |
integer |
Макс. размер после распаковки в байтах (по умолчанию: 128MB, макс: 1GB) |
Возвращает: string, error
Zlib
DEFLATE с заголовком и контрольной суммой (RFC 1950).
Сжатие {id="zlib-compress"}
local compressed = compress.zlib.encode(data, {level = 6})
| Параметр |
Тип |
Описание |
data |
string |
Данные для сжатия |
options |
table? |
Опции кодирования (опционально) |
Опции {id="zlib-compress-options"}
| Поле |
Тип |
Описание |
level |
integer |
Уровень сжатия 1-9 (по умолчанию: 6) |
Возвращает: string, error
Распаковка {id="zlib-decompress"}
local decompressed = compress.zlib.decode(compressed)
| Параметр |
Тип |
Описание |
data |
string |
Сжатые Zlib-данные |
options |
table? |
Опции декодирования (опционально) |
Опции {id="zlib-decompress-options"}
| Поле |
Тип |
Описание |
max_size |
integer |
Макс. размер после распаковки в байтах (по умолчанию: 128MB, макс: 1GB) |
Возвращает: string, error
Выбор алгоритма
| Алгоритм |
Применение |
Скорость |
Степень |
Диапазон уровней |
| gzip |
HTTP, широкая совместимость |
Средняя |
Хорошая |
1-9 |
| brotli |
Статические ресурсы, текст |
Низкая |
Лучшая |
0-11 |
| zstd |
Большие файлы, потоки |
Высокая |
Хорошая |
1-22 |
| deflate/zlib |
Низкоуровневые протоколы |
Средняя |
Хорошая |
1-9 |
-- HTTP-ответ на основе Accept-Encoding
local accept = req:header("Accept-Encoding") or ""
local body = json.encode(response_data)
if accept:find("br") then
res:set_header("Content-Encoding", "br")
res:write(compress.brotli.encode(body))
elseif accept:find("gzip") then
res:set_header("Content-Encoding", "gzip")
res:write(compress.gzip.encode(body))
else
res:write(body)
end
Ошибки
| Условие |
Kind |
Повторяемо |
| Пустой ввод |
errors.INVALID |
нет |
| Уровень вне диапазона |
errors.INVALID |
нет |
| Некорректные сжатые данные |
errors.INVALID |
нет |
| Распакованный размер превышает лимит |
errors.INTERNAL |
нет |
См. Обработка ошибок для работы с ошибками.