printenv.lua revision 1.5 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