1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
-- 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 open = io.open;
local fileserver = require"net.http.files";
local base_path = module:get_option_path("http_files_dir", module:get_option_path("http_path"));
local cache_size = module:get_option_number("http_files_cache_size", 128);
local cache_max_file_size = module:get_option_number("http_files_cache_max_file_size", 4096);
local dir_indices = module:get_option_array("http_index_files", { "index.html", "index.htm" });
local directory_index = module:get_option_boolean("http_dir_listing");
local mime_map = module:shared("/*/http_files/mime").types;
if not mime_map then
mime_map = {
html = "text/html", htm = "text/html",
xml = "application/xml",
txt = "text/plain",
css = "text/css",
js = "application/javascript",
png = "image/png",
gif = "image/gif",
jpeg = "image/jpeg", jpg = "image/jpeg",
svg = "image/svg+xml",
};
module:shared("/*/http_files/mime").types = mime_map;
local mime_types, err = open(module:get_option_path("mime_types_file", "/etc/mime.types", "config"), "r");
if mime_types then
local mime_data = mime_types:read("*a");
mime_types:close();
setmetatable(mime_map, {
__index = function(t, ext)
local typ = mime_data:match("\n(%S+)[^\n]*%s"..(ext:lower()).."%s") or "application/octet-stream";
t[ext] = typ;
return typ;
end
});
end
end
local function get_calling_module()
local info = debug.getinfo(3, "S");
if not info then return "An unknown module"; end
return info.source:match"mod_[^/\\.]+" or info.short_src;
end
-- COMPAT -- TODO deprecate
function serve(opts)
if type(opts) ~= "table" then -- assume path string
opts = { path = opts };
end
if opts.directory_index == nil then
opts.directory_index = directory_index;
end
if opts.mime_map == nil then
opts.mime_map = mime_map;
end
if opts.cache_size == nil then
opts.cache_size = cache_size;
end
if opts.cache_max_file_size == nil then
opts.cache_max_file_size = cache_max_file_size;
end
if opts.index_files == nil then
opts.index_files = dir_indices;
end
-- TODO Crank up to warning
module:log("debug", "%s should be updated to use 'net.http.files' insead of mod_http_files", get_calling_module());
return fileserver.serve(opts);
end
function wrap_route(routes)
module:log("debug", "%s should be updated to use 'net.http.files' insead of mod_http_files", get_calling_module());
for route,handler in pairs(routes) do
if type(handler) ~= "function" then
routes[route] = fileserver.serve(handler);
end
end
return routes;
end
module:provides("http", {
route = {
["GET /*"] = fileserver.serve({
path = base_path;
directory_index = directory_index;
mime_map = mime_map;
cache_size = cache_size;
cache_max_file_size = cache_max_file_size;
index_files = dir_indices;
});
};
});
|