#!/usr/bin/env luajit local path = os.getenv("PATH_INFO") local method = os.getenv("REQUEST_METHOD") local function escape(s) return s:gsub("<", "<"):gsub("<", "<") end local function respond(status, title, body) print(string.format("Status: %d", status)) print("Content-Type: text/html") print("") print(string.format([[
Error: %s
", escape(message))) end) end local function form_data() local data = {} for pair in string.gmatch(io.read(), "([^&]+)") do local key, value = string.match(pair, "([^=]+)=([^=]+)") if key == nil or value == nil then goto continue end data[key] = value ::continue:: end return data end local function read_log() local log = io.open("log", "r") if log == nil then return function() return nil end end local lines = log:lines("l") return function() local l = lines() local time, username, amount, comment = string.match(l, "(%d+),([%w_-]+),(-?%d+),([%w_-]*)") return tonumber(time), username, tonumber(amount), comment end end if path == "/" then print("Status: 200 OK") print("Content-Type: text/plain") print("") elseif path ~= nil then local username = path:sub(2) if username:match("^[%w_-]+$") == nil then return respond_error("username invalid") end if method == "POST" then local data = form_data() local amount = tonumber(data.amount) if amount == nil then return respond_error("amount invalid") end local comment = data.comment or "" if comment:match("^[%w_-]*$") == nil then return respond_error("comment invalid") end local log = io.open("log", "a+") if log == nil then return respond_error("failed to open log") end local time = os.time() log:write(string.format("%d,%s,%s,%s\n", time, username, amount, comment)) log:flush() log:close() end respond(200, username, function() print(string.format("