SkunkyURL/src/url.lua

87 lines
2.6 KiB
Lua

ngx.req.read_body()
local json = loadfile(string.format("%s/bytecode/jsonlib", ngx.var.document_root))()
local arg = ngx.req.get_post_args()
local aliasfmt = string.format("%s/aliases/", ngx.var.document_root)
local allowwrite = true
local function err(reason, status)
if status == nil then status = 404 end
ngx.status = status
ngx.say(reason)
allowwrite = false
ngx.eof()
end
for a, b in pairs(arg) do
if a == "url" then
url = b
end if a == "alias" then
alias = b
end if a == "expires" then
expires = b
end
end
if ngx.var.uri == "/" then
ngx.header.content_type = "text/html"; local htm = io.open(string.format("%s/etc/url.htm", ngx.var.document_root)):read("*a")
ngx.say(htm); ngx.eof()
end
if ngx.var.uri == "/create" then
if alias == "create" or alias == "etc" then ngx.say("This alias is not allowed.") ngx.eof() end
if url:find("://") == nil then url = string.format("https://%s", url) end
if expires == "" then
url = json.encode({ url = url, expires = "nil" })
else
url = json.encode({ url = url, expires = expires })
end
local dateuri = json.decode(url)["expires"]
if expires ~= "" then
if dateuri:len() < 10 or dateuri:len() > 10 then
err("Bad Data fmt.", 400)
end
if (expires:gsub("-", ""):gsub(":", "")) < os.date("%Y%m%d%T") then
err("The Date less than on Server.", 400)
end
end
if (url:find("%.")) == nil then
err("Got invalid URL.", 400)
end
alias = alias:gsub("%p", {["/"] = "", ["."] = ""})
local msg = string.format("Alias for \"%s\" is \"%s\".", json.decode(url)["url"], alias)
if dateuri:len() ~= nil then
msg = string.format("%s It expires at %s.", msg, dateuri)
end
aliasfmt = string.format("%s%s.json", aliasfmt, alias)
if io.open(aliasfmt) ~= nil then
err("Alias already exists.", 403)
end
if allowwrite ~= false then
local file = io.open(aliasfmt, "w")
file:write(url)
file:close()
ngx.say(msg)
ngx.eof()
end
else
local jfile = ""
local opnalias = string.format("%s%s.json", aliasfmt, ngx.var.uri)
if io.open(opnalias) == nil then
err("The Alias was not found.")
else
ngx.header["Cache-Control"] = {'no-cache'}
jfile = io.open(opnalias, "r"):read("*all")
date = (json.decode(jfile)["expires"]:gsub("-", ""))
if date < os.date("%Y%m%d%T") then
os.remove(opnalias)
end
ngx.redirect(json.decode(jfile)["url"], 301)
end
end