From 69c416c85bf92fca4b59aa78888a8aefbd0e0640 Mon Sep 17 00:00:00 2001 From: iceyrazor Date: Sat, 1 Aug 2026 01:25:42 -0500 Subject: init --- www/cgi-bin/cgi.lua | 52 ++++++++++++++++++++++++++++++++++++++++++++++ www/cgi-bin/req-params.lua | 38 +++++++++++++++++++++++++++++++++ www/cgi-bin/test.lua | 43 ++++++++++++++++++++++++++++++++++++++ www/html/index.html | 5 +++++ 4 files changed, 138 insertions(+) create mode 100755 www/cgi-bin/cgi.lua create mode 100755 www/cgi-bin/req-params.lua create mode 100755 www/cgi-bin/test.lua create mode 100644 www/html/index.html (limited to 'www') diff --git a/www/cgi-bin/cgi.lua b/www/cgi-bin/cgi.lua new file mode 100755 index 0000000..5033984 --- /dev/null +++ b/www/cgi-bin/cgi.lua @@ -0,0 +1,52 @@ +local cgi={} + +cgi.newline=false + +function cgi.tag(key,value,attrib) + local ret_str="<"..key + + if (attrib) then + for a_key,a_val in pairs(attrib) do + ret_str=ret_str.." "..a_key..'="'..a_val..'"' + end + end + + ret_str=ret_str..">" + if cgi.newline==true then ret_str=ret_str.."\n" end + + ret_str=ret_str..value + + if cgi.newline==true then ret_str=ret_str.."\n" end + + ret_str=ret_str.."" + + if cgi.newline==true then ret_str=ret_str.."\n" end + + return ret_str +end + +local function get_phrase(code) + local cases={ + [200]="OK", + [401]="Unauthorized", + } + if(cases[code]) then return cases[code] else return "" end +end + +function cgi.header(code,headers) + print("Status: "..code.." "..get_phrase(code)) + for h_name,header in pairs(headers) do + print(h_name..": "..header) + end + print() +end + +function cgi.render(content,headers,code) + headers["Content-Length"] = tostring(content:len()+1) + cgi.header(code,headers) + print(content); +end + +_G.m = cgi.tag + +return cgi diff --git a/www/cgi-bin/req-params.lua b/www/cgi-bin/req-params.lua new file mode 100755 index 0000000..077a7e4 --- /dev/null +++ b/www/cgi-bin/req-params.lua @@ -0,0 +1,38 @@ +-- /var/www/cgi-bin/cgi.lua +-- Simple Lua CGI helper for GET and POST + +local params = {} + +-- Parse URL-encoded query string into a table +local function parse_query(qs) + local t = {} + for k, v in string.gmatch(qs or "", "([^&=]+)=([^&]*)") do + -- URL-decode + k = k:gsub("+", " "):gsub("%%(%x%x)", function(h) return string.char(tonumber(h,16)) end) + v = v:gsub("+", " "):gsub("%%(%x%x)", function(h) return string.char(tonumber(h,16)) end) + t[k] = v + end + return t +end + +-- GET parameters +params.get_params = parse_query(os.getenv("QUERY_STRING")) + +-- POST parameters +params.post_params = {} +local content_length = tonumber(os.getenv("CONTENT_LENGTH") or 0) +if content_length > 0 then + local body = io.read(content_length) + params.post_params = parse_query(body) +end + +-- Convenience functions +function params.get(key) return params.get_params[key] end +function params.post(key) return params.post_params[key] end + +-- Combine GET+POST if you want +function params.param(key) + return params.post(key) or params.get(key) +end + +return params diff --git a/www/cgi-bin/test.lua b/www/cgi-bin/test.lua new file mode 100755 index 0000000..c86b3f5 --- /dev/null +++ b/www/cgi-bin/test.lua @@ -0,0 +1,43 @@ +#!/usr/bin/env luajit + +local cgi = require("cgi") +local req_params = require("req-params") +local str="" + +if req_params.param("password") and req_params.param("password") == "401" then + cgi.render("401 Unauthorized",{["Content-Type"]="text/html"},401) + return +end + +-- Access GET parameters +if next(req_params.get_params) then + str=str..m("h2","GET parameters:") + for k,v in pairs(req_params.get_params) do + str=str..k.." = "..v.."
" + end +end + +-- Access POST parameters +if next(req_params.post_params) then + str=str..m("h2","POST parameters:") + for k,v in pairs(req_params.post_params) do + str=str..k.." = "..v.."
" + end +end + +-- Combined helper +local name = req_params.param("name") or "anonymous" +str=str..m("p","Hello, "..name.."!") + +cgi.render(m("html", + m("head", + m("title","ssg test") + ).. + m("body", + m("h1","Hello from Lua CGI").. + m("p", "ssg test").. + m("p",_VERSION).. + str + ) +), +{["Content-Type"]="text/html"},200) \ No newline at end of file diff --git a/www/html/index.html b/www/html/index.html new file mode 100644 index 0000000..34459dd --- /dev/null +++ b/www/html/index.html @@ -0,0 +1,5 @@ + + + a page + + -- cgit v1.3