Software /
code /
prosody
Changeset
5236:8d116a0cdacd
mod_http_files: Cache data read from disk in a weak table
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Tue, 11 Dec 2012 23:02:06 +0100 |
parents | 5235:e0373e0dd048 |
children | 5237:b1038f449e15 |
files | plugins/mod_http_files.lua |
diffstat | 1 files changed, 18 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/plugins/mod_http_files.lua Tue Dec 11 22:30:50 2012 +0100 +++ b/plugins/mod_http_files.lua Tue Dec 11 23:02:06 2012 +0100 @@ -27,6 +27,8 @@ css = "text/css"; }; +local cache = setmetatable({}, { __mode = "kv" }); -- Let the garbage collector have it if it wants to. + function serve_file(event, path) local request, response = event.request, event.response; local orig_path = request.path; @@ -44,7 +46,11 @@ return 304; end - if attr.mode == "directory" then + local data = cache[path]; + if data then + response.headers.content_type = data.content_type; + data = data.data; + elseif attr.mode == "directory" then if full_path:sub(-1) ~= "/" then response.headers.location = orig_path.."/"; return 301; @@ -57,20 +63,19 @@ -- TODO File listing return 403; + else + local f = open(full_path, "rb"); + data = f and f:read("*a"); + f:close(); + if not data then + return 403; + end + local ext = path:match("%.([^.]*)$"); + local content_type = mime_map[ext]; + cache[path] = { data = data; content_type = content_type; }; + response.headers.content_type = content_type; end - local f, err = open(full_path, "rb"); - if not f then - module:log("warn", "Failed to open file: %s", err); - return 404; - end - local data = f:read("*a"); - f:close(); - if not data then - return 403; - end - local ext = path:match("%.([^.]*)$"); - response.headers.content_type = mime_map[ext]; -- Content-Type should be nil when not known return response:send(data); end