commit b9f3247: [Minor] Lua_mime: Refactor slightly
Vsevolod Stakhov
vsevolod at highsecure.ru
Tue Oct 27 15:21:06 UTC 2020
Author: Vsevolod Stakhov
Date: 2020-10-27 11:10:15 +0000
URL: https://github.com/rspamd/rspamd/commit/b9f3247f7c893f7d3df95ce1d936c454a7c5ccec
[Minor] Lua_mime: Refactor slightly
---
lualib/lua_mime.lua | 127 ++++++++++++++++++++++++++--------------------------
1 file changed, 64 insertions(+), 63 deletions(-)
diff --git a/lualib/lua_mime.lua b/lualib/lua_mime.lua
index 0dfeafd60..1f0fb38f2 100644
--- a/lualib/lua_mime.lua
+++ b/lualib/lua_mime.lua
@@ -36,6 +36,56 @@ local function newline(task)
return '\r\n'
end
+local function do_append_footer(task, part, footer, is_multipart, out, state)
+ local tp = part:get_text()
+ local ct = 'text/plain'
+ local cte = 'quoted-printable'
+ local newline_s = state.newline_s
+
+ if tp:is_html() then
+ ct = 'text/html'
+ end
+
+ local encode_func = function(input)
+ return rspamd_util.encode_qp(input, 80, task:get_newlines_type())
+ end
+
+ if part:get_cte() == '7bit' then
+ cte = '7bit'
+ encode_func = function(input)
+ if type(input) == 'userdata' then
+ return input
+ else
+ return rspamd_text.fromstring(input)
+ end
+ end
+ end
+
+ if is_multipart then
+ out[#out + 1] = string.format('Content-Type: %s; charset=utf-8%s'..
+ 'Content-Transfer-Encoding: %s',
+ ct, newline_s, cte)
+ out[#out + 1] = ''
+ else
+ state.new_cte = cte
+ end
+
+ local content = tp:get_content('raw_utf') or ''
+ local double_nline = newline_s .. newline_s
+ local nlen = #double_nline
+ -- Hack, if part ends with 2 newline, then we append it after footer
+ if content:sub(-(nlen), nlen + 1) == double_nline then
+ -- content without last newline
+ content = content:sub(-(#newline_s), #newline_s + 1) .. footer
+ out[#out + 1] = {encode_func(content), true}
+ out[#out + 1] = ''
+ else
+ content = content .. footer
+ out[#out + 1] = {encode_func(content), true}
+ out[#out + 1] = ''
+ end
+
+end
--[[[
-- @function lua_mime.add_text_footer(task, html_footer, text_footer)
@@ -48,7 +98,9 @@ end
--]]
exports.add_text_footer = function(task, html_footer, text_footer)
local newline_s = newline(task)
- local res = {}
+ local state = {
+ newline_s = newline_s
+ }
local out = {}
local text_parts = task:get_text_parts()
@@ -56,57 +108,6 @@ exports.add_text_footer = function(task, html_footer, text_footer)
return false
end
- local function do_append_footer(part, footer, is_multipart)
- local tp = part:get_text()
- local ct = 'text/plain'
- local cte = 'quoted-printable'
-
- if tp:is_html() then
- ct = 'text/html'
- end
-
- local encode_func = function(input)
- return rspamd_util.encode_qp(input, 80, task:get_newlines_type())
- end
-
- if part:get_cte() == '7bit' then
- cte = '7bit'
- encode_func = function(input)
- if type(input) == 'userdata' then
- return input
- else
- return rspamd_text.fromstring(input)
- end
- end
- end
-
- if is_multipart then
- out[#out + 1] = string.format('Content-Type: %s; charset=utf-8%s'..
- 'Content-Transfer-Encoding: %s',
- ct, newline_s, cte)
- out[#out + 1] = ''
- else
- res.new_cte = cte
- end
-
- local content = tostring(tp:get_content('raw_utf') or '')
- local double_nline = newline_s .. newline_s
- local nlen = #double_nline
- -- Hack, if part ends with 2 newline, then we append it after footer
- if content:sub(-(nlen), nlen + 1) == double_nline then
- content = string.format('%s%s',
- content:sub(-(#newline_s), #newline_s + 1), -- content without last newline
- footer)
- out[#out + 1] = {encode_func(content), true}
- out[#out + 1] = ''
- else
- content = content .. footer
- out[#out + 1] = {encode_func(content), true}
- out[#out + 1] = ''
- end
-
- end
-
if html_footer or text_footer then
-- We need to take extra care about content-type and cte
local ct = task:get_header('Content-Type')
@@ -118,31 +119,31 @@ exports.add_text_footer = function(task, html_footer, text_footer)
if ct.type and ct.type == 'text' then
if ct.subtype then
if html_footer and (ct.subtype == 'html' or ct.subtype == 'htm') then
- res.need_rewrite_ct = true
+ state.need_rewrite_ct = true
elseif text_footer and ct.subtype == 'plain' then
- res.need_rewrite_ct = true
+ state.need_rewrite_ct = true
end
else
if text_footer then
- res.need_rewrite_ct = true
+ state.need_rewrite_ct = true
end
end
- res.new_ct = ct
+ state.new_ct = ct
end
else
if text_parts then
if #text_parts == 1 then
- res.need_rewrite_ct = true
- res.new_ct = {
+ state.need_rewrite_ct = true
+ state.new_ct = {
type = 'text',
subtype = 'plain'
}
elseif #text_parts > 1 then
-- XXX: in fact, it cannot be
- res.new_ct = {
+ state.new_ct = {
type = 'multipart',
subtype = 'mixed'
}
@@ -224,8 +225,8 @@ exports.add_text_footer = function(task, html_footer, text_footer)
end
if append_footer and not skip_footer then
- do_append_footer(part, append_footer,
- parent and parent:is_multipart())
+ do_append_footer(task, part, append_footer,
+ parent and parent:is_multipart(), out, state)
else
out[#out + 1] = {part:get_raw_headers(), true}
out[#out + 1] = {part:get_raw_content(), false}
@@ -243,9 +244,9 @@ exports.add_text_footer = function(task, html_footer, text_footer)
b = table.remove(boundaries)
end
- res.out = out
+ state.out = out
- return res
+ return state
end
-- All mime extensions with corresponding content types
More information about the Commits
mailing list