summaryrefslogtreecommitdiffstatshomepage
path: root/plugins/weblit/static.lua
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/weblit/static.lua')
-rw-r--r--plugins/weblit/static.lua62
1 files changed, 62 insertions, 0 deletions
diff --git a/plugins/weblit/static.lua b/plugins/weblit/static.lua
new file mode 100644
index 00000000000..b34ea638fa1
--- /dev/null
+++ b/plugins/weblit/static.lua
@@ -0,0 +1,62 @@
+
+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