Comparison

mod_http_muc_log/mod_http_muc_log.lua @ 2685:cd5781ca782d

mod_http_muc_log: Remove caching
author Kim Alvefur <zash@zash.se>
date Thu, 13 Apr 2017 22:47:09 +0200
parent 2593:b61b0ff1c0f9
child 2763:a6d19aea9b73
comparison
equal deleted inserted replaced
2684:e491a15d7621 2685:cd5781ca782d
1 local mt = require"util.multitable"; 1 local mt = require"util.multitable";
2 local datetime = require"util.datetime"; 2 local datetime = require"util.datetime";
3 local jid_split = require"util.jid".split; 3 local jid_split = require"util.jid".split;
4 local nodeprep = require"util.encodings".stringprep.nodeprep; 4 local nodeprep = require"util.encodings".stringprep.nodeprep;
5 local uuid = require"util.uuid".generate;
6 local it = require"util.iterators"; 5 local it = require"util.iterators";
7 local gettime = require"socket".gettime;
8 local url = require"socket.url"; 6 local url = require"socket.url";
9 local os_time, os_date = os.time, os.date; 7 local os_time, os_date = os.time, os.date;
10 local render = require"util.interpolation".new("%b{}", require"util.stanza".xml_escape); 8 local render = require"util.interpolation".new("%b{}", require"util.stanza".xml_escape);
11 9
12 local archive = module:open_store("muc_log", "archive"); 10 local archive = module:open_store("muc_log", "archive");
138 if i > 1 and tmp.wday == 2 then 136 if i > 1 and tmp.wday == 2 then
139 days = {}; 137 days = {};
140 weeks[#weeks+1] = { days = days }; 138 weeks[#weeks+1] = { days = days };
141 current_day = 1; 139 current_day = 1;
142 end 140 end
143 days[current_day], current_day = { wday = tmp.wday, day = i, href = days_t[i] and datetime.date(days_t[i]) }, current_day+1; 141 days[current_day] = {
142 wday = tmp.wday, day = i, href = days_t[i] and datetime.date(days_t[i])
143 };
144 current_day = current_day+1;
144 end 145 end
145 end 146 end
146 table.sort(year, sort_m); 147 table.sort(year, sort_m);
147 end 148 end
148 table.sort(years, sort_Y); 149 table.sort(years, sort_Y);
275 jid = module.host; 276 jid = module.host;
276 rooms = room_list; 277 rooms = room_list;
277 }); 278 });
278 end 279 end
279 280
280 local cache = setmetatable({}, {__mode = 'v'});
281
282 local function with_cache(f)
283 return function (event, path)
284 local request, response = event.request, event.response;
285 local ckey = path or "";
286 local cached = cache[ckey];
287
288 if cached then
289 local etag = cached.etag;
290 local if_none_match = request.headers.if_none_match;
291 if etag == if_none_match then
292 module:log("debug", "Client cache hit");
293 return 304;
294 end
295 module:log("debug", "Server cache hit");
296 response.headers.etag = etag;
297 response.headers.content_type = "text/html; charset=utf-8";
298 return cached[1];
299 end
300
301 local start = gettime();
302 local rendered = f(event, path);
303 module:log("debug", "Rendering took %dms", math.floor( (gettime() - start) * 1000 + 0.5));
304
305 if type(rendered) == "string" then
306 local etag = uuid();
307 cached = { rendered, etag = etag, date = datetime.date() };
308 response.headers.etag = etag;
309 cache[ckey] = cached;
310 end
311
312 response.headers.content_type = "text/html; charset=utf-8";
313 return rendered;
314 end
315 end
316
317 -- How is cache invalidation a hard problem? ;)
318 module:hook("muc-broadcast-message", function (event)
319 local room = event.room;
320 local room_name = jid_split(room.jid);
321 local today = datetime.date();
322 cache[get_link(room_name)] = nil;
323 cache[get_link(room_name, today)] = nil;
324 end);
325
326 module:provides("http", { 281 module:provides("http", {
327 route = { 282 route = {
328 ["GET /"] = list_rooms; 283 ["GET /"] = list_rooms;
329 ["GET /*"] = with_cache(logs_page); 284 ["GET /*"] = logs_page;
330 }; 285 };
331 }); 286 });
332 287