page2.lua 6.2 KB

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