aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2021-01-28 16:34:13 +0100
committerKim Alvefur <zash@zash.se>2021-01-28 16:34:13 +0100
commit5236e4bef0a77e217e3b4253f7335c3f3b2e8fa8 (patch)
treea3631d29b77ae63dccf0d0c222485b27f21bdb5c
parentbf23a2fb0db31ff96bd95d2dd55b83a1ce49bab3 (diff)
downloadprosody-5236e4bef0a77e217e3b4253f7335c3f3b2e8fa8.tar.gz
prosody-5236e4bef0a77e217e3b4253f7335c3f3b2e8fa8.zip
mod_http_file_share: Cache file metadata
For faster access by avoiding archive ID. No benchmarks were harmed in the making of this commit. ... no benchmarks were performed at all.
-rw-r--r--plugins/mod_http_file_share.lua47
1 files changed, 38 insertions, 9 deletions
diff --git a/plugins/mod_http_file_share.lua b/plugins/mod_http_file_share.lua
index 23454e57..feb21a16 100644
--- a/plugins/mod_http_file_share.lua
+++ b/plugins/mod_http_file_share.lua
@@ -17,6 +17,7 @@ local errors = require "util.error";
local dataform = require "util.dataforms".new;
local dt = require "util.datetime";
local hi = require "util.human.units";
+local cache = require "util.cache";
local namespace = "urn:xmpp:http:upload:0";
@@ -55,6 +56,8 @@ local upload_errors = errors.init(module.name, namespace, {
filesizefmt = { type = "modify"; condition = "bad-request"; text = "File size must be positive integer"; }
});
+local upload_cache = cache.new(1024);
+
-- Convenience wrapper for logging file sizes
local function B(bytes) return hi.format(bytes, "B", "b"); end
@@ -214,6 +217,13 @@ function handle_upload(event, path) -- PUT /upload/:slot
if uploaded then
module:log("debug", "Upload of %q completed, %s", filename, B(final_size));
assert(os.rename(filename.."~", filename));
+
+ upload_cache:set(upload_info.slot, {
+ name = upload_info.filename;
+ size = tostring(upload_info.filesize);
+ type = upload_info.filetype;
+ time = os.time();
+ });
return 201;
else
assert(os.remove(filename.."~"));
@@ -226,21 +236,39 @@ end
function handle_download(event, path) -- GET /uploads/:slot+filename
local request, response = event.request, event.response;
local slot_id = path:match("^[^/]+");
- -- TODO cache
local basename, filetime, filetype, filesize;
- local slot, when = errors.coerce(uploads:get(nil, slot_id));
- if not slot then
- module:log("debug", "uploads:get(%q) --> not-found, %s", slot_id, when);
+ local cached = upload_cache:get(slot_id);
+ if cached then
+ module:log("debug", "Cache hit");
+ -- TODO stats (instead of logging?)
+ basename = cached.name;
+ filesize = cached.size;
+ filetype = cached.type;
+ filetime = cached.time;
+ upload_cache:set(slot_id, cached);
+ -- TODO cache negative hits?
else
- basename = slot.attr.filename;
- filesize = slot.attr.size;
- filetype = slot.attr["content-type"];
- filetime = when;
+ module:log("debug", "Cache miss");
+ local slot, when = errors.coerce(uploads:get(nil, slot_id));
+ if not slot then
+ module:log("debug", "uploads:get(%q) --> not-found, %s", slot_id, when);
+ else
+ module:log("debug", "uploads:get(%q) --> %s, %d", slot_id, slot, when);
+ basename = slot.attr.filename;
+ filesize = slot.attr.size;
+ filetype = slot.attr["content-type"];
+ filetime = when;
+ upload_cache:set(slot_id, {
+ name = basename;
+ size = slot.attr.size;
+ type = filetype;
+ time = when;
+ });
+ end
end
if not basename then
return 404;
end
- module:log("debug", "uploads:get(%q) --> %s, %d", slot_id, slot, when);
local last_modified = os.date('!%a, %d %b %Y %H:%M:%S GMT', filetime);
if request.headers.if_modified_since == last_modified then
return 304;
@@ -292,6 +320,7 @@ if expiry >= 0 and not external_base_url then
for slot_id in iter do
i = i + 1;
obsolete_files:push(get_filename(slot_id));
+ upload_cache:set(slot_id, nil);
end
sleep(0.1);