mg.write("HTTP/1.0 200 OK\r\n")
mg.write("Content-Type: text/html\r\n")
mg.write("\r\n")
mg.write([[
CivetWeb Lua test page2
This is Lua script example 2, served by the
CivetWeb web server,
version ]] .. mg.version .. [[.
The following features are available:
]])
demo_data_for_xml = {}
demo_data_for_json = {}
function print_if_available(tab, name)
  if tab then
    mg.write("- " .. name .. " available\n")
	if type(tab)=="table" then
	  demo_data_for_xml[name] = {}
	  demo_data_for_xml[name][0] = name
	  demo_data_for_json[name] = {}
	  for nname,nval in pairs(tab) do
	    demo_data_for_xml[name][nname] = type(nval)
		demo_data_for_json[name][nname] = type(nval)
	  end
	else
  	  demo_data_for_xml[name] = type(tab)
	  demo_data_for_json[name] = type(tab)
	end
  else
    mg.write("
- " .. name .. " not available\n")
  end
end
function recurse(tab, excl)
  excl = excl or {}
  mg.write("
\n")
  for k,v in pairs(tab) do
    if type(v) == "table" then
      mg.write("- " .. tostring(k) .. ":\n")
      if excl[v] then
        -- cyclic
      else
        excl[v] = true
        recurse(v, excl)
        excl[v] = false
      end
    else
      mg.write("
- " .. tostring(k) .. " = " .. tostring(v) .. "\n")
    end
  end
  mg.write("
\n")
end
-- Print Lua version and available libraries
mg.write("- " .. _VERSION .. " with the following standard libraries\n")
mg.write("
\n")
libs = {"string", "math", "table", "io", "os", "bit32", "utf8", "package", "coroutine", "debug"};
for _,n in ipairs(libs) do
  print_if_available(_G[n], n);
end
mg.write("
\n")
print_if_available(sqlite3, "SQLite3 binding (sqlite3)")
print_if_available(lfs, "LuaFileSystem (lfs)")
print_if_available(json, "JSON binding (json)")
print_if_available(xml, "LuaXML (xml)")
print_if_available(shared, "Lua shared data (shared)")
--recurse(_G)
-- Print mg library
libname = "mg"
print_if_available(_G[libname], libname .. " library")
recurse(_G[libname])
-- Print connect function
print_if_available(connect, "connect function")
-- Get all server options
mg.write("- server options\n")
recurse(mg.get_option())
-- Print some data from random generators
if mg.uuid then
  mg.write("
- random data\n")
  local t = {GUID = mg.uuid(), random = mg.random()}
  recurse(t)
end
-- Print loaded packages known to Lua
if package and (type(package.loaded)=="table") then
  if #package.loaded > 0 then
    mg.write("
- loaded packages\n")
    recurse(package.loaded)
  else
    mg.write("
- loaded packages: none\n")
  end
end
-- Load path
mg.write("
- Package search path: " .. package.path .. "\n");
-- End of list
mg.write("
\n");
-- Current date/time
mg.write("\n
\n")
mg.write("Today is " .. os.date("%A") .. "
\n");
-- Request content
mg.write("\n
\n")
l = mg.request_info.content_length
if l then
  mg.write("Content-Length = "..l..":
\n
\n")
  mg.write(mg.read())
  mg.write("\n\n\n")
else
  mg.write("no request content available for " .. mg.request_info.request_method .. " method
\n")
end
-- Directory listing
mg.write("\n
\n")
mg.write("\n");
if not lfs then
  mg.write("lfs not available\n")
else
  mg.write("Files in " .. lfs.currentdir())
  mg.write("\n
\n")
  local cnt = 0
  for f in lfs.dir(".") do
    cnt = cnt + 1
    if (cnt < 6) then
      local mime = mg.get_mime_type(f)
      mg.write("- " .. f .. " (" .. mime .. ")\n")
      local at = lfs.attributes(f);
      recurse(at)
    end
  end
  mg.write("
\n")
  mg.write(string.format("\n", cnt))
end
mg.write("\n")
function htmlEsc(txt)
  s = txt:gsub("%&", "&")
  s = s:gsub("%<", "<")
  s = s:gsub("%>", ">")
  return (s)
end
function printTable(tab, indent)
  indent = indent or 0
  for k,v in pairs(tab) do
    if (type(v)=="table") then
      mg.write(string.rep("  ", indent) .. tostring(k) .. ":\n")
	  printTable(v, indent + 1)
	else
      mg.write(string.rep("  ", indent) .. tostring(k) .. "\t" .. tostring(v) .. "\n")
	end
  end
end
-- xml test
if (xml) then
mg.write("\n
\n")
mg.write("xml2lua:
\n
\n");
xmlstr = [[sub1valsubsubval]]
xmlev = xml.eval(xmlstr)
mg.write(htmlEsc(xmlstr))
mg.write("\n-->\n")
mg.write(type(xmlev) .. ":\n")
mg.write(printTable(xmlev, 1)) 
mg.write("
\n\n")
mg.write("lua2xml:
\n
\n");
mg.write(htmlEsc(xml.str(xmlev, 1, "xml")))
mg.write("\n\n")
mg.write("lua2xml:
\n
\n");
mg.write(htmlEsc(xml.str(demo_data_for_xml, 1, "xml")))
mg.write("\n\n")
end
-- json test
current_script_path = mg.script_name:match("(.*[%/%\\]).*%.lua")
script_search_path = current_script_path .. "?.lua"
package.path = script_search_path .. ";" .. package.path
json = require "json"
mg.write("\n
\n")
mg.write("json2lua:
\n
\n");
-- JSON example from https://en.wikipedia.org/wiki/JSON#Example
jsonstr = [[{
  "firstName": "John",
  "lastName": "Smith",
  "isAlive": true,
  "age": 27,
  "address": {
    "streetAddress": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postalCode": "10021-3100"
  },
  "phoneNumbers": [
    {
      "type": "home",
      "number": "212 555-1234"
    },
    {
      "type": "office",
      "number": "646 555-4567"
    },
    {
      "type": "mobile",
      "number": "123 456-7890"
    }
  ],
  "children": [],
  "spouse": null
}]]
jsonev = json.decode(jsonstr)
mg.write(htmlEsc(jsonstr))
mg.write("\n-->\n")
mg.write(type(jsonev) .. ":\n")
mg.write(printTable(jsonev, 1)) 
mg.write("\n\n")
mg.write("lua2json:
\n
\n");
mg.write(htmlEsc(json.encode(jsonev)))
mg.write("\n\n")
mg.write("lua2json:
\n
\n");
mg.write(htmlEsc(json.encode(demo_data_for_json)))
mg.write("\n\n")
if mg.request_info.query_string then
  qtab = mg.split_form_data(mg.request_info.query_string)
  mg.write("\nSplit form test:
\n");
  mg.write("
\n");
  mg.write("\n");
  mg.write("| #\n");
  mg.write(" | name\n");
  mg.write(" | value\n");
  mg.write(" | 
\n");
  for n,t in pairs(qtab) do
    mg.write("\n");
    mg.write("| " .. n .. "\n");
    mg.write(" | " .. tostring(t.name) .. "\n");
    mg.write(" | " .. tostring(t.value) .. "\n");
    mg.write(" | 
\n");
  end
  mg.write("
\n");
  mg.write("\n");
end
-- Next section ...
mg.write("\n
\n")
mg.write([[
]])