page2.lua 7.3 KB

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