]>
Commit | Line | Data |
---|---|---|
1e59de90 TL |
1 | mg.write("HTTP/1.0 200 OK\r\n")\r |
2 | mg.write("Content-Type: text/html\r\n")\r | |
3 | mg.write("\r\n")\r | |
4 | mg.write([[<html>\r | |
5 | <head>\r | |
6 | <title>CivetWeb Lua test page2</title>\r | |
7 | <style>\r | |
8 | table, th, td {\r | |
9 | border: 1px solid black;\r | |
10 | }\r | |
11 | </style>\r | |
12 | </head>\r | |
13 | <body>\r | |
14 | <p>This is Lua script example 2, served by the\r | |
15 | <a href="https://github.com/civetweb/civetweb">CivetWeb web server</a>,\r | |
16 | version ]] .. mg.version .. [[.\r | |
17 | </p><p>\r | |
18 | The following features are available:\r | |
19 | <ul>\r | |
20 | ]])\r | |
21 | \r | |
22 | demo_data_for_xml = {}\r | |
23 | demo_data_for_json = {}\r | |
24 | \r | |
25 | function print_if_available(tab, name)\r | |
26 | if tab then\r | |
27 | mg.write("<li>" .. name .. " available</li>\n")\r | |
28 | if type(tab)=="table" then\r | |
29 | demo_data_for_xml[name] = {}\r | |
30 | demo_data_for_xml[name][0] = name\r | |
31 | demo_data_for_json[name] = {}\r | |
32 | for nname,nval in pairs(tab) do\r | |
33 | demo_data_for_xml[name][nname] = type(nval)\r | |
34 | demo_data_for_json[name][nname] = type(nval)\r | |
35 | end\r | |
36 | else\r | |
37 | demo_data_for_xml[name] = type(tab)\r | |
38 | demo_data_for_json[name] = type(tab)\r | |
39 | end\r | |
40 | else\r | |
41 | mg.write("<li>" .. name .. " not available</li>\n")\r | |
42 | end\r | |
43 | end\r | |
44 | \r | |
45 | function recurse(tab, excl)\r | |
46 | excl = excl or {}\r | |
47 | mg.write("<ul>\n")\r | |
48 | for k,v in pairs(tab) do\r | |
49 | if type(v) == "table" then\r | |
50 | mg.write("<li>" .. tostring(k) .. ":</li>\n")\r | |
51 | if excl[v] then\r | |
52 | -- cyclic\r | |
53 | else\r | |
54 | excl[v] = true\r | |
55 | recurse(v, excl)\r | |
56 | excl[v] = false\r | |
57 | end\r | |
58 | else\r | |
59 | mg.write("<li>" .. tostring(k) .. " = " .. tostring(v) .. "</li>\n")\r | |
60 | end\r | |
61 | end\r | |
62 | mg.write("</ul>\n")\r | |
63 | end\r | |
64 | \r | |
65 | -- Print Lua version and available libraries\r | |
66 | mg.write("<li>" .. _VERSION .. " with the following standard libraries</li>\n")\r | |
67 | mg.write("<ul>\n")\r | |
68 | libs = {"string", "math", "table", "io", "os", "bit32", "utf8", "package", "coroutine", "debug"};\r | |
69 | for _,n in ipairs(libs) do\r | |
70 | print_if_available(_G[n], n);\r | |
71 | end\r | |
72 | mg.write("</ul>\n")\r | |
73 | print_if_available(sqlite3, "SQLite3 binding (sqlite3)")\r | |
74 | print_if_available(lfs, "LuaFileSystem (lfs)")\r | |
75 | print_if_available(json, "JSON binding (json)")\r | |
76 | print_if_available(xml, "LuaXML (xml)")\r | |
77 | print_if_available(shared, "Lua shared data (shared)")\r | |
78 | \r | |
79 | \r | |
80 | --recurse(_G)\r | |
81 | \r | |
82 | -- Print mg library\r | |
83 | libname = "mg"\r | |
84 | print_if_available(_G[libname], libname .. " library")\r | |
85 | recurse(_G[libname])\r | |
86 | \r | |
87 | -- Print connect function\r | |
88 | print_if_available(connect, "connect function")\r | |
89 | \r | |
90 | -- Get all server options\r | |
91 | mg.write("<li>server options</li>\n")\r | |
92 | recurse(mg.get_option())\r | |
93 | \r | |
94 | -- Print some data from random generators\r | |
95 | if mg.uuid then\r | |
96 | mg.write("<li>random data</li>\n")\r | |
97 | local t = {GUID = mg.uuid(), random = mg.random()}\r | |
98 | recurse(t)\r | |
99 | end\r | |
100 | \r | |
101 | -- Print loaded packages known to Lua\r | |
102 | if package and (type(package.loaded)=="table") then\r | |
103 | if #package.loaded > 0 then\r | |
104 | mg.write("<li>loaded packages</li>\n")\r | |
105 | recurse(package.loaded)\r | |
106 | else\r | |
107 | mg.write("<li>loaded packages: none</li>\n")\r | |
108 | end\r | |
109 | end\r | |
110 | \r | |
111 | -- Load path\r | |
112 | mg.write("<li>Package search path: " .. package.path .. "</li>\n");\r | |
113 | \r | |
114 | -- End of list\r | |
115 | mg.write("</ul></p>\n");\r | |
116 | \r | |
117 | \r | |
118 | -- Current date/time\r | |
119 | mg.write("\n<hr/>\n")\r | |
120 | mg.write("<p>Today is " .. os.date("%A") .. "</p>\n");\r | |
121 | \r | |
122 | -- Request content\r | |
123 | mg.write("\n<hr/>\n")\r | |
124 | l = mg.request_info.content_length\r | |
125 | if l then\r | |
126 | mg.write("<p>Content-Length = "..l..":<br>\n<pre>\n")\r | |
127 | mg.write(mg.read())\r | |
128 | mg.write("\n</pre>\n</p>\n")\r | |
129 | else\r | |
130 | mg.write("<p>no request content available for " .. mg.request_info.request_method .. " method</p>\n")\r | |
131 | end\r | |
132 | \r | |
133 | -- Directory listing\r | |
134 | mg.write("\n<hr/>\n")\r | |
135 | mg.write("<p>\n");\r | |
136 | if not lfs then\r | |
137 | mg.write("lfs not available\n")\r | |
138 | else\r | |
139 | mg.write("Files in " .. lfs.currentdir())\r | |
140 | mg.write("\n<ul>\n")\r | |
141 | local cnt = 0\r | |
142 | for f in lfs.dir(".") do\r | |
143 | cnt = cnt + 1\r | |
144 | if (cnt < 6) then\r | |
145 | local mime = mg.get_mime_type(f)\r | |
146 | mg.write("<li>" .. f .. " (" .. mime .. ")</li>\n")\r | |
147 | local at = lfs.attributes(f);\r | |
148 | recurse(at)\r | |
149 | end\r | |
150 | end\r | |
151 | mg.write("</ul>\n")\r | |
152 | mg.write(string.format("<ul>%u files total</ul>\n", cnt))\r | |
153 | end\r | |
154 | mg.write("</p>\n")\r | |
155 | \r | |
156 | \r | |
157 | function htmlEsc(txt)\r | |
158 | s = txt:gsub("%&", "&")\r | |
159 | s = s:gsub("%<", "<")\r | |
160 | s = s:gsub("%>", ">")\r | |
161 | return (s)\r | |
162 | end\r | |
163 | \r | |
164 | \r | |
165 | function printTable(tab, indent)\r | |
166 | indent = indent or 0\r | |
167 | for k,v in pairs(tab) do\r | |
168 | if (type(v)=="table") then\r | |
169 | mg.write(string.rep(" ", indent) .. tostring(k) .. ":\n")\r | |
170 | printTable(v, indent + 1)\r | |
171 | else\r | |
172 | mg.write(string.rep(" ", indent) .. tostring(k) .. "\t" .. tostring(v) .. "\n")\r | |
173 | end\r | |
174 | end\r | |
175 | end\r | |
176 | \r | |
177 | \r | |
178 | -- xml test\r | |
179 | if (xml) then\r | |
180 | mg.write("\n<hr/>\n")\r | |
181 | mg.write("<p>xml2lua:<br>\n<pre>\n");\r | |
182 | xmlstr = [[<obj attr="a"><sub1 attr="suba">sub1val</sub1><sub2 attr="suba2" /><sub3></sub3><sub4><subsub>subsubval</subsub></sub4></obj>]]\r | |
183 | xmlev = xml.eval(xmlstr)\r | |
184 | mg.write(htmlEsc(xmlstr))\r | |
185 | mg.write("\n-->\n")\r | |
186 | mg.write(type(xmlev) .. ":\n")\r | |
187 | mg.write(printTable(xmlev, 1))\r | |
188 | mg.write("</pre>\n</p>\n")\r | |
189 | \r | |
190 | mg.write("<p>lua2xml:<br>\n<pre>\n");\r | |
191 | mg.write(htmlEsc(xml.str(xmlev, 1, "xml")))\r | |
192 | mg.write("</pre>\n</p>\n")\r | |
193 | \r | |
194 | mg.write("<p>lua2xml:<br>\n<pre>\n");\r | |
195 | mg.write(htmlEsc(xml.str(demo_data_for_xml, 1, "xml")))\r | |
196 | mg.write("</pre>\n</p>\n")\r | |
197 | end\r | |
198 | \r | |
199 | \r | |
200 | -- json test\r | |
201 | current_script_path = mg.script_name:match("(.*[%/%\\]).*%.lua")\r | |
202 | script_search_path = current_script_path .. "?.lua"\r | |
203 | package.path = script_search_path .. ";" .. package.path\r | |
204 | json = require "json"\r | |
205 | mg.write("\n<hr/>\n")\r | |
206 | mg.write("<p>json2lua:<br>\n<pre>\n");\r | |
207 | -- JSON example from https://en.wikipedia.org/wiki/JSON#Example\r | |
208 | jsonstr = [[{\r | |
209 | "firstName": "John",\r | |
210 | "lastName": "Smith",\r | |
211 | "isAlive": true,\r | |
212 | "age": 27,\r | |
213 | "address": {\r | |
214 | "streetAddress": "21 2nd Street",\r | |
215 | "city": "New York",\r | |
216 | "state": "NY",\r | |
217 | "postalCode": "10021-3100"\r | |
218 | },\r | |
219 | "phoneNumbers": [\r | |
220 | {\r | |
221 | "type": "home",\r | |
222 | "number": "212 555-1234"\r | |
223 | },\r | |
224 | {\r | |
225 | "type": "office",\r | |
226 | "number": "646 555-4567"\r | |
227 | },\r | |
228 | {\r | |
229 | "type": "mobile",\r | |
230 | "number": "123 456-7890"\r | |
231 | }\r | |
232 | ],\r | |
233 | "children": [],\r | |
234 | "spouse": null\r | |
235 | }]]\r | |
236 | jsonev = json.decode(jsonstr)\r | |
237 | mg.write(htmlEsc(jsonstr))\r | |
238 | mg.write("\n-->\n")\r | |
239 | mg.write(type(jsonev) .. ":\n")\r | |
240 | mg.write(printTable(jsonev, 1))\r | |
241 | mg.write("</pre>\n</p>\n")\r | |
242 | \r | |
243 | mg.write("<p>lua2json:<br>\n<pre>\n");\r | |
244 | mg.write(htmlEsc(json.encode(jsonev)))\r | |
245 | mg.write("</pre>\n</p>\n")\r | |
246 | \r | |
247 | mg.write("<p>lua2json:<br>\n<pre>\n");\r | |
248 | mg.write(htmlEsc(json.encode(demo_data_for_json)))\r | |
249 | mg.write("</pre>\n</p>\n")\r | |
250 | \r | |
251 | \r | |
252 | if mg.request_info.query_string then\r | |
253 | qtab = mg.split_form_data(mg.request_info.query_string)\r | |
254 | mg.write("<p>\nSplit form test:<br/>\n");\r | |
255 | mg.write("<table>\n");\r | |
256 | mg.write("<tr>\n");\r | |
257 | mg.write("<th>#</th>\n");\r | |
258 | mg.write("<th>name</th>\n");\r | |
259 | mg.write("<th>value</th>\n");\r | |
260 | mg.write("</tr>\n");\r | |
261 | for n,t in pairs(qtab) do\r | |
262 | mg.write("<tr>\n");\r | |
263 | mg.write("<td>" .. n .. "</td>\n");\r | |
264 | mg.write("<td>" .. tostring(t.name) .. "</td>\n");\r | |
265 | mg.write("<td>" .. tostring(t.value) .. "</td>\n");\r | |
266 | mg.write("</tr>\n");\r | |
267 | end\r | |
268 | mg.write("</table>\n");\r | |
269 | mg.write("</p>\n");\r | |
270 | end\r | |
271 | \r | |
272 | \r | |
273 | -- Test timer from Lua background script\r | |
274 | mg.write("\n<hr/>\n")\r | |
275 | \r | |
276 | mg.write("<p>\nLua shared.timer ");\r | |
277 | if (shared and shared.timer) then\r | |
278 | mg.write(tostring(shared.timer))\r | |
279 | mg.write([[ <button onClick="window.location.reload();">Refresh Page</button>]])\r | |
280 | else\r | |
281 | mg.write("not available")\r | |
282 | end\r | |
283 | mg.write("\n</p>\n")\r | |
284 | \r | |
285 | -- Next section ...\r | |
286 | mg.write("\n<hr/>\n")\r | |
287 | \r | |
288 | mg.write([[\r | |
289 | </body></html>\r | |
290 | ]])\r |