1 1.5 rillig -- $NetBSD: printenv.lua,v 1.5 2021/02/28 16:10:00 rillig Exp $ 2 1.2 mrg 3 1.1 mbalmer -- this small Lua script demonstrates the use of Lua in (bozo)httpd 4 1.1 mbalmer -- it will simply output the "environment" 5 1.1 mbalmer 6 1.1 mbalmer -- Keep in mind that bozohttpd forks for each request when started in 7 1.4 leot -- daemon mode, you can set global variables here, but they will have 8 1.1 mbalmer -- the same value on each invocation. You can not keep state between 9 1.1 mbalmer -- two calls. 10 1.1 mbalmer 11 1.3 kamil -- You can test this example by running the following command: 12 1.3 kamil -- /usr/libexec/httpd -b -f -I 8080 -L test printenv.lua . 13 1.3 kamil -- and then navigate to: http://127.0.0.1:8080/test/printenv 14 1.3 kamil 15 1.1 mbalmer local httpd = require 'httpd' 16 1.1 mbalmer 17 1.5 rillig function escape_html(s) 18 1.5 rillig return s:gsub('&', '&'):gsub('<', '<'):gsub('>', '>'):gsub('"', '"') 19 1.5 rillig end 20 1.5 rillig 21 1.1 mbalmer function printenv(env, headers, query) 22 1.1 mbalmer 23 1.1 mbalmer -- we get the "environment" in the env table, the values are more 24 1.1 mbalmer -- or less the same as the variable for a CGI program 25 1.1 mbalmer 26 1.3 kamil -- output headers using httpd.write() 27 1.3 kamil -- httpd.write() will not append newlines 28 1.3 kamil httpd.write("HTTP/1.1 200 Ok\r\n") 29 1.3 kamil httpd.write("Content-Type: text/html\r\n\r\n") 30 1.3 kamil 31 1.3 kamil -- output html using httpd.print() 32 1.3 kamil -- you can also use print() and io.write() but they will not work with SSL 33 1.3 kamil httpd.print([[ 34 1.1 mbalmer <html> 35 1.1 mbalmer <head> 36 1.1 mbalmer <title>Bozotic Lua Environment</title> 37 1.1 mbalmer </head> 38 1.1 mbalmer <body> 39 1.1 mbalmer <h1>Bozotic Lua Environment</h1> 40 1.1 mbalmer ]]) 41 1.1 mbalmer 42 1.3 kamil httpd.print('module version: ' .. httpd._VERSION .. '<br>') 43 1.1 mbalmer 44 1.3 kamil httpd.print('<h2>Server Environment</h2>') 45 1.1 mbalmer -- print the list of "environment" variables 46 1.1 mbalmer for k, v in pairs(env) do 47 1.5 rillig httpd.print(escape_html(k) .. '=' .. escape_html(v) .. '<br/>') 48 1.1 mbalmer end 49 1.1 mbalmer 50 1.3 kamil httpd.print('<h2>Request Headers</h2>') 51 1.1 mbalmer for k, v in pairs(headers) do 52 1.5 rillig httpd.print(escape_html(k) .. '=' .. escape_html(v) .. '<br/>') 53 1.1 mbalmer end 54 1.1 mbalmer 55 1.1 mbalmer if query ~= nil then 56 1.3 kamil httpd.print('<h2>Query Variables</h2>') 57 1.1 mbalmer for k, v in pairs(query) do 58 1.5 rillig httpd.print(escape_html(k) .. '=' .. escape_html(v) .. '<br/>') 59 1.1 mbalmer end 60 1.1 mbalmer end 61 1.1 mbalmer 62 1.3 kamil httpd.print('<h2>Form Test</h2>') 63 1.1 mbalmer 64 1.3 kamil httpd.print([[ 65 1.3 kamil <form method="POST" action="form?sender=me"> 66 1.1 mbalmer <input type="text" name="a_value"> 67 1.1 mbalmer <input type="submit"> 68 1.1 mbalmer </form> 69 1.1 mbalmer ]]) 70 1.1 mbalmer -- output a footer 71 1.3 kamil httpd.print([[ 72 1.1 mbalmer </body> 73 1.1 mbalmer </html> 74 1.1 mbalmer ]]) 75 1.1 mbalmer end 76 1.1 mbalmer 77 1.1 mbalmer function form(env, header, query) 78 1.3 kamil 79 1.3 kamil httpd.write("HTTP/1.1 200 Ok\r\n") 80 1.3 kamil httpd.write("Content-Type: text/html\r\n\r\n") 81 1.3 kamil 82 1.1 mbalmer if query ~= nil then 83 1.3 kamil httpd.print('<h2>Form Variables</h2>') 84 1.1 mbalmer 85 1.1 mbalmer if env.CONTENT_TYPE ~= nil then 86 1.3 kamil httpd.print('Content-type: ' .. env.CONTENT_TYPE .. '<br>') 87 1.1 mbalmer end 88 1.1 mbalmer 89 1.1 mbalmer for k, v in pairs(query) do 90 1.5 rillig httpd.print(escape_html(k) .. '=' .. escape_html(v) .. '<br/>') 91 1.1 mbalmer end 92 1.1 mbalmer else 93 1.3 kamil httpd.print('No values') 94 1.1 mbalmer end 95 1.1 mbalmer end 96 1.1 mbalmer 97 1.1 mbalmer -- register this handler for http://<hostname>/<prefix>/printenv 98 1.1 mbalmer httpd.register_handler('printenv', printenv) 99 1.1 mbalmer httpd.register_handler('form', form) 100