mame/plugins/weblit/static.lua

63 lines
1.7 KiB
Lua

local getType = require("mime").getType
local jsonStringify = require('json').stringify
local makeChroot = require('coro-fs').chroot
return function (rootPath)
local fs = makeChroot(rootPath)
return function (req, res, go)
if req.method ~= "GET" then return go() end
local path = (req.params and req.params.path) or req.path
path = path:match("^[^?#]*")
if path:byte(1) == 47 then
path = path:sub(2)
end
local stat = fs.stat(path)
if not stat then return go() end
local function renderFile()
local body = assert(fs.readFile(path))
res.code = 200
res.headers["Content-Type"] = getType(path)
res.body = body
return
end
local function renderDirectory()
if req.path:byte(-1) ~= 47 then
res.code = 301
res.headers.Location = req.path .. '/'
return
end
local files = {}
for entry in fs.scandir(path) do
if entry.name == "index.html" and entry.type == "file" then
path = (#path > 0 and path .. "/" or "") .. "index.html"
return renderFile()
end
files[#files + 1] = entry
entry.url = "http://" .. req.headers.host .. req.path .. entry.name
end
local body = jsonStringify(files) .. "\n"
res.code = 200
res.headers["Content-Type"] = "application/json"
res.body = body
return
end
if stat.type == "directory" then
return renderDirectory()
elseif stat.type == "file" then
if req.path:byte(-1) == 47 then
res.code = 301
res.headers.Location = req.path:match("^(.*[^/])/+$")
return
end
return renderFile()
end
end
end