X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=plugins%2Fmod_http_files.lua;h=2e9f418298ff244614312d2fafd553e2e2371559;hb=96de7897afdc96ec1320dfa8c7a97086d794e32f;hp=1de584072015135452e70bdc44c0e014563822c6;hpb=04100797d180bbc832c5cabb1570bb0afc942e81;p=prosody.git diff --git a/plugins/mod_http_files.lua b/plugins/mod_http_files.lua index 1de58407..2e9f4182 100644 --- a/plugins/mod_http_files.lua +++ b/plugins/mod_http_files.lua @@ -1,24 +1,26 @@ -- Prosody IM -- Copyright (C) 2008-2010 Matthew Wild -- Copyright (C) 2008-2010 Waqas Hussain --- +-- -- This project is MIT/X11 licensed. Please see the -- COPYING file in the source package for more information. -- module:depends("http"); +local server = require"net.http.server"; local lfs = require "lfs"; local os_date = os.date; local open = io.open; local stat = lfs.attributes; local build_path = require"socket.url".build_path; +local path_sep = package.config:sub(1,1); local base_path = module:get_option_string("http_files_dir", module:get_option_string("http_path")); local dir_indices = module:get_option("http_index_files", { "index.html", "index.htm" }); local directory_index = module:get_option_boolean("http_dir_listing"); -local mime_map = module:shared("mime").types; +local mime_map = module:shared("/*/http_files/mime").types; if not mime_map then mime_map = { html = "text/html", htm = "text/html", @@ -31,7 +33,7 @@ if not mime_map then jpeg = "image/jpeg", jpg = "image/jpeg", svg = "image/svg+xml", }; - module:shared("mime").types = mime_map; + module:shared("/*/http_files/mime").types = mime_map; local mime_types, err = open(module:get_option_string("mime_types_file", "/etc/mime.types"),"r"); if mime_types then @@ -50,6 +52,9 @@ end local cache = setmetatable({}, { __mode = "kv" }); -- Let the garbage collector have it if it wants to. function serve(opts) + if type(opts) ~= "table" then -- assume path string + opts = { path = opts }; + end local base_path = opts.path; local dir_indices = opts.index_files or dir_indices; local directory_index = opts.directory_index; @@ -57,7 +62,7 @@ function serve(opts) local request, response = event.request, event.response; local orig_path = request.path; local full_path = base_path .. (path and "/"..path or ""); - local attr = stat(full_path); + local attr = stat((full_path:gsub('%'..path_sep..'+$',''))); if not attr then return 404; end @@ -77,11 +82,11 @@ function serve(opts) return 304; end - local data = cache[path]; + local data = cache[orig_path]; if data and data.etag == etag then response_headers.content_type = data.content_type; data = data.data; - elseif attr.mode == "directory" then + elseif attr.mode == "directory" and path then if full_path:sub(-1) ~= "/" then local path = { is_absolute = true, is_directory = true }; for dir in orig_path:gmatch("[^/]+") do path[#path+1]=dir; end @@ -94,27 +99,14 @@ function serve(opts) end end - if not directory_index then + if directory_index then + data = server._events.fire_event("directory-index", { path = request.path, full_path = full_path }); + end + if not data then return 403; - else - local html = require"util.stanza".stanza("html") - :tag("head"):tag("title"):text(path):up() - :tag("meta", { charset="utf-8" }):up() - :up() - :tag("body"):tag("h1"):text(path):up() - :tag("ul"); - for file in lfs.dir(full_path) do - if file:sub(1,1) ~= "." then - local attr = stat(full_path..file) or {}; - html:tag("li", { class = attr.mode }) - :tag("a", { href = file }):text(file) - :up():up(); - end - end - data = "\n"..tostring(html); - cache[path] = { data = data, content_type = mime_map.html; etag = etag; }; - response_headers.content_type = mime_map.html; end + cache[orig_path] = { data = data, content_type = mime_map.html; etag = etag; }; + response_headers.content_type = mime_map.html; else local f, err = open(full_path, "rb"); @@ -126,9 +118,9 @@ function serve(opts) module:log("debug", "Could not open or read %s. Error was %s", full_path, err); return 403; end - local ext = path:match("%.([^./]+)$"); + local ext = full_path:match("%.([^./]+)$"); local content_type = ext and mime_map[ext]; - cache[path] = { data = data; content_type = content_type; etag = etag }; + cache[orig_path] = { data = data; content_type = content_type; etag = etag }; response_headers.content_type = content_type; end @@ -138,6 +130,14 @@ function serve(opts) return serve_file; end +function wrap_route(routes) + for route,handler in pairs(routes) do + if type(handler) ~= "function" then + routes[route] = serve(handler); + end + end + return routes; +end if base_path then module:provides("http", {