mirror of
https://github.com/holub/mame
synced 2025-05-05 22:04:43 +03:00
63 lines
1.7 KiB
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
|