Files
2026-07-13 12:32:21 +08:00

73 lines
1.6 KiB
Lua

local buffer = require "string.buffer"
local zlib = require "ffi-zlib"
local yield = require("kong.tools.yield").yield
local inflate_gzip = zlib.inflateGzip
local deflate_gzip = zlib.deflateGzip
local _M = {}
-- lua-ffi-zlib allocated buffer of length +1,
-- so use 64KB - 1 instead
local GZIP_CHUNK_SIZE = 65535
local function read_input_buffer(input_buffer)
local count = 0
local yield_size = GZIP_CHUNK_SIZE * 2
return function(size)
count = count + size
if count > yield_size then
count = 0
yield()
end
local data = input_buffer:get(size)
return data ~= "" and data or nil
end
end
local function write_output_buffer(output_buffer)
return function(data)
return output_buffer:put(data)
end
end
local function gzip_helper(inflate_or_deflate, input)
local input_buffer = buffer.new(0):set(input)
local output_buffer = buffer.new()
local ok, err = inflate_or_deflate(read_input_buffer(input_buffer),
write_output_buffer(output_buffer),
GZIP_CHUNK_SIZE)
if not ok then
return nil, err
end
return output_buffer:get()
end
--- Gzip compress the content of a string
-- @tparam string str the uncompressed string
-- @return gz (string) of the compressed content, or nil, err to if an error occurs
function _M.deflate_gzip(str)
return gzip_helper(deflate_gzip, str)
end
--- Gzip decompress the content of a string
-- @tparam string gz the Gzip compressed string
-- @return str (string) of the decompressed content, or nil, err to if an error occurs
function _M.inflate_gzip(gz)
return gzip_helper(inflate_gzip, gz)
end
return _M