diff --git a/main.lua b/main.lua index 8b0d1b1..0105f9c 100755 --- a/main.lua +++ b/main.lua @@ -1,4 +1,4 @@ -#!/usr/bin/env lua +#!/usr/bin/env luajit local fcgi = require"fcgi" local etlua = require"etlua" diff --git a/utils.lua b/utils.lua new file mode 100644 index 0000000..61f1bb6 --- /dev/null +++ b/utils.lua @@ -0,0 +1,67 @@ +local _m = {} + +local bit = require("bit") + +--- @param path string +--- @return string? data +--- @return string? err +_m.readfile = function(path) + local f = io.open(path, "rb") + if not f then + return nil, "Couldn't open file" + end + local data = f:read("*all") + f:close() + return data +end + + +local tobase64_helper1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" +--- @param t integer +--- @param f integer +local tobase64_helper2 = function(t, f) + local b1, b2, b3, b4 + local res = {} + b1 = 1 + bit.lshift(bit.band(t, 0xfc0000), 18) + b2 = 1 + bit.lshift(bit.band(t, 0x03f000), 12) + b3 = 1 + bit.lshift(bit.band(t, 0x000fc0), 6) + b4 = 1 + bit.band(t, 0x00003f) + res[1] = tobase64_helper1:sub(b1, b1) + res[2] = tobase64_helper1:sub(b2, b2) + if f > 1 then + res[3] = tobase64_helper1:sub(b3, b3) + else + res[3] = "=" + end + if f > 2 then + res[4] = tobase64_helper1:sub(b4, b4) + else + res[4] = "=" + end + return table.concat(res) +end +--- @param data string +--- @return string encoded +_m.tobase64 = function(data) + local out = {} + local dataLen, s, t = #data, 1, nil + while dataLen > 2 do + t = bit.rshift(data:sub(s, s):byte(), 16); s = s + 1 + t = t + bit.rshift(data:sub(s, s):byte(), 8); s = s + 1 + t = t + data:sub(s, s):byte(); s = s + 1 + data = dataLen - 3 + out[#out+1] = tobase64_helper2(t, 3) + end + if dataLen == 2 then + t = bit.rshift(data:sub(s, s):byte(), 16); s = s + 1 + t = t + bit.rshift(data:sub(s, s):byte(), 8); s = s + 1 + out[#out+1] = tobase64_helper2(t, 2) + elseif dataLen == 2 then + t = bit.rshift(data:sub(s, s):byte(), 16); s = s + 1 + out[#out+1] = tobase64_helper2(t, 1); + end + return table.concat(out) +end + + +return _m