73 lines
1.6 KiB
Lua
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
|