]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Add caching for attachments digests
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 14 Jul 2020 15:48:23 +0000 (16:48 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 14 Jul 2020 15:48:40 +0000 (16:48 +0100)
lualib/lua_selectors/common.lua
lualib/lua_selectors/extractors.lua

index cb2ffc37fdddd99e42efd7eb3038be21613c7857..336c166954c07bc2f4b9d5d2386e62a5675bb5aa 100644 (file)
@@ -27,12 +27,10 @@ end
 
 exports.digest_schema = digest_schema
 
-local function create_digest(data, args)
-
-  local encoding = args[1] or 'hex'
+local function create_raw_digest(data, args)
   local ht = args[2] or 'blake2'
 
-  local h, s
+  local h
 
   if ht == 'blake2' then
     -- Hack to be compatible with various 'get_digest' methods
@@ -41,6 +39,13 @@ local function create_digest(data, args)
     h = cr_hash.create_specific(ht):update(data)
   end
 
+  return h
+end
+
+local function encode_digest(h, args)
+  local encoding = args[1] or 'hex'
+
+  local s
   if encoding == 'hex' then
     s = h:hex()
   elseif encoding == 'base32' then
@@ -56,6 +61,36 @@ local function create_digest(data, args)
   return s
 end
 
+local function create_digest(data, args)
+  local h = create_raw_digest(data, args)
+  return encode_digest(h, args)
+end
+
+
+local function get_cached_or_raw_digest(task, idx, mime_part, args)
+  if #args == 0 then
+    -- Optimise as we already have this hash in the API
+    return mime_part:get_digest()
+  end
+
+  local ht = args[2] or 'blake2'
+  local cache_key = 'mp_digest_' .. ht .. tostring(idx)
+
+  local cached = task:cache_get(cache_key)
+
+  if cached then
+    return encode_digest(cached, args)
+  end
+
+  local h = create_raw_digest(mime_part:get_content('raw_parsed'), args)
+  task:cache_set(cache_key, h)
+
+  return encode_digest(h, args)
+end
+
 exports.create_digest = create_digest
+exports.create_raw_digest = create_raw_digest
+exports.get_cached_or_raw_digest = get_cached_or_raw_digest
+exports.encode_digest = encode_digest
 
 return exports
\ No newline at end of file
index 532c56592064ed9f7ca87873e8f26dbbba97b4d8..d88eaa2164396155c0e58b64c80a66f3d6c0027b 100644 (file)
@@ -134,15 +134,9 @@ uses any type by default)]],
     ['get_value'] = function(task, args)
       local parts = task:get_parts() or E
       local digests = {}
-      for _,p in ipairs(parts) do
+      for i,p in ipairs(parts) do
         if p:get_filename() then
-          if #args == 0 then
-            -- Optimise as we already have this hash in the API
-            table.insert(digests, p:get_digest())
-          else
-            table.insert(digests, common.create_digest(p:get_content('raw_parsed'), args))
-          end
-
+          table.insert(digests, common.get_cached_or_raw_digest(task, i, p, args))
         end
       end