page2.lua 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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 = {}
  13. function print_if_available(tab, name)
  14. if tab then
  15. mg.write("<li>" .. name .. " available</li>\n")
  16. if type(tab)=="table" then
  17. demo_data[name] = {}
  18. demo_data[name][0] = name
  19. for nname,nval in pairs(tab) do
  20. demo_data[name][nname] = type(nval)
  21. end
  22. else
  23. demo_data[name] = type(tab)
  24. end
  25. else
  26. mg.write("<li>" .. name .. " not available</li>\n")
  27. end
  28. end
  29. function recurse(tab, excl)
  30. excl = excl or {}
  31. mg.write("<ul>\n")
  32. for k,v in pairs(tab) do
  33. if type(v) == "table" then
  34. mg.write("<li>" .. tostring(k) .. ":</li>\n")
  35. if excl[v] then
  36. -- cyclic
  37. else
  38. excl[v] = true
  39. recurse(v, excl)
  40. excl[v] = false
  41. end
  42. else
  43. mg.write("<li>" .. tostring(k) .. " = " .. tostring(v) .. "</li>\n")
  44. end
  45. end
  46. mg.write("</ul>\n")
  47. end
  48. -- Print Lua version and available libraries
  49. mg.write("<li>" .. _VERSION .. " with the following standard libraries</li>\n")
  50. mg.write("<ul>\n")
  51. libs = {"string", "math", "table", "io", "os", "bit32", "utf8", "package", "coroutine", "debug"};
  52. for _,n in ipairs(libs) do
  53. print_if_available(_G[n], n);
  54. end
  55. mg.write("</ul>\n")
  56. print_if_available(sqlite3, "SQLite3 binding (sqlite3)")
  57. print_if_available(lfs, "LuaFileSystem (lfs)")
  58. print_if_available(json, "JSON binding (json)")
  59. print_if_available(xml, "LuaXML (xml)")
  60. print_if_available(shared, "Lua shared data (shared)")
  61. --recurse(_G)
  62. -- Print mg library
  63. libname = "mg"
  64. print_if_available(_G[libname], libname .. " library")
  65. recurse(_G[libname])
  66. -- Print connect function
  67. print_if_available(connect, "connect function")
  68. -- Get all server options
  69. mg.write("<li>server options</li>\n")
  70. recurse(mg.get_option())
  71. -- Print some data from random generators
  72. if mg.uuid then
  73. mg.write("<li>random data</li>\n")
  74. local t = {GUID = mg.uuid(), random = mg.random()}
  75. recurse(t)
  76. end
  77. -- Print loaded packages known to Lua
  78. if package and (type(package.loaded)=="table") then
  79. if #package.loaded > 0 then
  80. mg.write("<li>loaded packages</li>\n")
  81. recurse(package.loaded)
  82. else
  83. mg.write("<li>loaded packages: none</li>\n")
  84. end
  85. end
  86. -- Print preloaded packages known to Lua
  87. if xml then
  88. mg.write("<li>xml</li>\n")
  89. recurse(xml)
  90. end
  91. -- Current date/time
  92. mg.write("</ul></p>\n");
  93. mg.write("<p> Today is " .. os.date("%A") .. "</p>\n");
  94. -- Request content
  95. mg.write("\n<hr/>\n")
  96. l = mg.request_info.content_length
  97. if l then
  98. mg.write("<p>Content-Length = "..l..":<br>\n<pre>\n")
  99. mg.write(mg.read())
  100. mg.write("\n</pre>\n</p>\n")
  101. else
  102. mg.write("<p>not request content available</p>\n")
  103. end
  104. -- Directory listing
  105. mg.write("\n<hr/>\n")
  106. mg.write("<p>\n");
  107. if not lfs then
  108. mg.write("lfs not available\n")
  109. else
  110. mg.write("Files in " .. lfs.currentdir())
  111. mg.write("\n<ul>\n")
  112. local cnt = 0
  113. for f in lfs.dir(".") do
  114. cnt = cnt + 1
  115. if (cnt < 6) then
  116. local mime = mg.get_mime_type(f)
  117. mg.write("<li>" .. f .. " (" .. mime .. ")</li>\n")
  118. local at = lfs.attributes(f);
  119. recurse(at)
  120. end
  121. end
  122. mg.write("</ul>\n")
  123. mg.write(string.format("<ul>%u files total</ul>\n", cnt))
  124. end
  125. mg.write("</p>\n")
  126. function htmlEsc(txt)
  127. s = txt:gsub("%&", "&amp;")
  128. s = s:gsub("%<", "&lt;")
  129. s = s:gsub("%>", "&gt;")
  130. return (s)
  131. end
  132. function printTable(tab, indent)
  133. indent = indent or 0
  134. for k,v in pairs(tab) do
  135. if (type(v)=="table") then
  136. mg.write(string.rep(" ", indent) .. tostring(k) .. ":\n")
  137. printTable(v, indent + 1)
  138. else
  139. mg.write(string.rep(" ", indent) .. tostring(k) .. "\t" .. v .. "\n")
  140. end
  141. end
  142. end
  143. -- xml test
  144. if (xml) then
  145. mg.write("\n<hr/>\n")
  146. mg.write("<p>xml2lua:<br>\n<pre>\n");
  147. xmlstr = [[<obj attr="a"><sub1 attr="suba">sub1val</sub1><sub2 attr="suba2" /><sub3></sub3><sub4><subsub>subsubval</subsub></sub4></obj>]]
  148. xmlev = xml.eval(xmlstr)
  149. mg.write(htmlEsc(xmlstr))
  150. mg.write("\n-->\n")
  151. mg.write(type(xmlev) .. ":\n")
  152. mg.write(printTable(xmlev, 1))
  153. mg.write("</pre>\n</p>\n")
  154. mg.write("<p>lua2xml:<br>\n<pre>\n");
  155. mg.write(htmlEsc(xml.str(xmlev, 1, "xml")))
  156. mg.write("</pre>\n</p>\n")
  157. mg.write("<p>lua2xml:<br>\n<pre>\n");
  158. mg.write(htmlEsc(xml.str(demo_data, 1, "xml")))
  159. mg.write("</pre>\n</p>\n")
  160. end
  161. mg.write([[
  162. </body></html>
  163. ]])