mod_http_files: Have mimetypes in a shared table. Get mimetypes from /etc/mime.types if exists.
authorKim Alvefur <zash@zash.se>
Tue, 11 Dec 2012 23:21:25 +0100
changeset 5237 b1038f449e15
parent 5236 8d116a0cdacd
child 5238 0cc0359d8c39
mod_http_files: Have mimetypes in a shared table. Get mimetypes from /etc/mime.types if exists.
plugins/mod_http_files.lua
--- a/plugins/mod_http_files.lua	Tue Dec 11 23:02:06 2012 +0100
+++ b/plugins/mod_http_files.lua	Tue Dec 11 23:21:25 2012 +0100
@@ -16,16 +16,34 @@
 local http_base = module:get_option_string("http_files_dir", module:get_option_string("http_path", "www_files"));
 local dir_indices = module:get_option("http_files_index", { "index.html", "index.htm" });
 
--- TODO: Should we read this from /etc/mime.types if it exists? (startup time...?)
-local mime_map = {
-	html = "text/html";
-	htm = "text/html";
-	xml = "text/xml";
-	xsl = "text/xml";
-	txt = "text/plain; charset=utf-8";
-	js = "text/javascript";
-	css = "text/css";
-};
+local mime_map = module:shared("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("mime").types = mime_map;
+
+	local mime_types, err = open(module:get_option_string("mime_types_file", "/etc/mime.types"),"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 cache = setmetatable({}, { __mode = "kv" }); -- Let the garbage collector have it if it wants to.