-- Copyright (C) Yichun Zhang (agentzh) local ffi = require "ffi" local base = require "resty.core.base" local C = ffi.C local ffi_string = ffi.string local ngx = ngx local type = type local error = error local floor = math.floor local tostring = tostring local get_string_buf = base.get_string_buf local get_size_ptr = base.get_size_ptr local subsystem = ngx.config.subsystem local ngx_lua_ffi_encode_base64 local ngx_lua_ffi_decode_base64 if subsystem == "http" then ffi.cdef[[ size_t ngx_http_lua_ffi_encode_base64(const unsigned char *src, size_t len, unsigned char *dst, int no_padding); int ngx_http_lua_ffi_decode_base64(const unsigned char *src, size_t len, unsigned char *dst, size_t *dlen); ]] ngx_lua_ffi_encode_base64 = C.ngx_http_lua_ffi_encode_base64 ngx_lua_ffi_decode_base64 = C.ngx_http_lua_ffi_decode_base64 elseif subsystem == "stream" then ffi.cdef[[ size_t ngx_stream_lua_ffi_encode_base64(const unsigned char *src, size_t len, unsigned char *dst, int no_padding); int ngx_stream_lua_ffi_decode_base64(const unsigned char *src, size_t len, unsigned char *dst, size_t *dlen); ]] ngx_lua_ffi_encode_base64 = C.ngx_stream_lua_ffi_encode_base64 ngx_lua_ffi_decode_base64 = C.ngx_stream_lua_ffi_decode_base64 end local function base64_encoded_length(len, no_padding) return no_padding and floor((len * 8 + 5) / 6) or floor((len + 2) / 3) * 4 end ngx.encode_base64 = function (s, no_padding) if type(s) ~= 'string' then if not s then s = '' else s = tostring(s) end end local slen = #s local no_padding_bool = false; local no_padding_int = 0; if no_padding then if no_padding ~= true then local typ = type(no_padding) error("bad no_padding: boolean expected, got " .. typ, 2) end no_padding_bool = true no_padding_int = 1; end local dlen = base64_encoded_length(slen, no_padding_bool) local dst = get_string_buf(dlen) local r_dlen = ngx_lua_ffi_encode_base64(s, slen, dst, no_padding_int) -- if dlen ~= r_dlen then error("discrepancy in len") end return ffi_string(dst, r_dlen) end local function base64_decoded_length(len) return floor((len + 3) / 4) * 3 end ngx.decode_base64 = function (s) if type(s) ~= 'string' then error("string argument only", 2) end local slen = #s local dlen = base64_decoded_length(slen) -- print("dlen: ", tonumber(dlen)) local dst = get_string_buf(dlen) local pdlen = get_size_ptr() local ok = ngx_lua_ffi_decode_base64(s, slen, dst, pdlen) if ok == 0 then return nil end return ffi_string(dst, pdlen[0]) end return { version = base.version }
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
base.lua | File | 5.4 KB | 0644 |
|
base64.lua | File | 3.06 KB | 0644 |
|
coroutine.lua | File | 769 B | 0644 |
|
ctx.lua | File | 3.71 KB | 0644 |
|
exit.lua | File | 1.41 KB | 0644 |
|
hash.lua | File | 3.92 KB | 0644 |
|
misc.lua | File | 5.7 KB | 0644 |
|
ndk.lua | File | 2.13 KB | 0644 |
|
param.lua | File | 2.35 KB | 0644 |
|
phase.lua | File | 1.48 KB | 0644 |
|
regex.lua | File | 33.67 KB | 0644 |
|
request.lua | File | 11.14 KB | 0644 |
|
response.lua | File | 6.21 KB | 0644 |
|
shdict.lua | File | 26.56 KB | 0644 |
|
socket.lua | File | 7.22 KB | 0644 |
|
time.lua | File | 4.64 KB | 0644 |
|
uri.lua | File | 3.03 KB | 0644 |
|
utils.lua | File | 972 B | 0644 |
|
var.lua | File | 3.82 KB | 0644 |
|
worker.lua | File | 3.27 KB | 0644 |
|