Home | History | Annotate | Line # | Download | only in httpd
      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('&', '&amp;'):gsub('<', '&lt;'):gsub('>', '&gt;'):gsub('"', '&quot;')
     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