From 2426ef05eca594c1a88b154b4d0d52a7713bc640 Mon Sep 17 00:00:00 2001 From: Leeingnyo Date: Sun, 15 Aug 2021 20:59:11 +0900 Subject: [PATCH] Apply cache on dimensions api Use zip_path and mtime for hashing It used for weak validation --- src/routes/api.cr | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/routes/api.cr b/src/routes/api.cr index f865a61..d854b1d 100644 --- a/src/routes/api.cr +++ b/src/routes/api.cr @@ -649,21 +649,31 @@ struct APIRouter "height" => Int32, }], } + Koa.response 304 get "/api/dimensions/:tid/:eid" do |env| begin tid = env.params.url["tid"] eid = env.params.url["eid"] + prev_e_tag = env.request.headers["If-None-Match"]? title = Library.default.get_title tid raise "Title ID `#{tid}` not found" if title.nil? entry = title.get_entry eid raise "Entry ID `#{eid}` of `#{title.title}` not found" if entry.nil? - sizes = entry.page_dimensions - send_json env, { - "success" => true, - "dimensions" => sizes, - }.to_json + file_hash = Digest::SHA1.hexdigest (entry.zip_path + entry.mtime.to_s) + e_tag = "W/#{file_hash}" + if e_tag == prev_e_tag + env.response.status_code = 304 + "" + else + sizes = entry.page_dimensions + env.response.headers["ETag"] = e_tag + send_json env, { + "success" => true, + "dimensions" => sizes, + }.to_json + end rescue e Logger.error e send_json env, {