-- $NetBSD: printenv.lua,v 1.3.18.1 2021/03/05 13:34:19 martin Exp $ -- this small Lua script demonstrates the use of Lua in (bozo)httpd -- it will simply output the "environment" -- Keep in mind that bozohttpd forks for each request when started in -- daemon mode, you can set global variables here, but they will have -- the same value on each invocation. You can not keep state between -- two calls. -- You can test this example by running the following command: -- /usr/libexec/httpd -b -f -I 8080 -L test printenv.lua . -- and then navigate to: http://127.0.0.1:8080/test/printenv local httpd = require 'httpd' function escape_html(s) return s:gsub('&', '&'):gsub('<', '<'):gsub('>', '>'):gsub('"', '"') end function printenv(env, headers, query) -- we get the "environment" in the env table, the values are more -- or less the same as the variable for a CGI program -- output headers using httpd.write() -- httpd.write() will not append newlines httpd.write("HTTP/1.1 200 Ok\r\n") httpd.write("Content-Type: text/html\r\n\r\n") -- output html using httpd.print() -- you can also use print() and io.write() but they will not work with SSL httpd.print([[ Bozotic Lua Environment

Bozotic Lua Environment

]]) httpd.print('module version: ' .. httpd._VERSION .. '
') httpd.print('

Server Environment

') -- print the list of "environment" variables for k, v in pairs(env) do httpd.print(escape_html(k) .. '=' .. escape_html(v) .. '
') end httpd.print('

Request Headers

') for k, v in pairs(headers) do httpd.print(escape_html(k) .. '=' .. escape_html(v) .. '
') end if query ~= nil then httpd.print('

Query Variables

') for k, v in pairs(query) do httpd.print(escape_html(k) .. '=' .. escape_html(v) .. '
') end end httpd.print('

Form Test

') httpd.print([[
]]) -- output a footer httpd.print([[ ]]) end function form(env, header, query) httpd.write("HTTP/1.1 200 Ok\r\n") httpd.write("Content-Type: text/html\r\n\r\n") if query ~= nil then httpd.print('

Form Variables

') if env.CONTENT_TYPE ~= nil then httpd.print('Content-type: ' .. env.CONTENT_TYPE .. '
') end for k, v in pairs(query) do httpd.print(escape_html(k) .. '=' .. escape_html(v) .. '
') end else httpd.print('No values') end end -- register this handler for http:////printenv httpd.register_handler('printenv', printenv) httpd.register_handler('form', form)