From 88db18b733523001b81b1a66ffd33ecf41af1c55 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 20 Dec 2016 16:46:49 +0000 Subject: [PATCH] [Minor] Add function to encode mime headers --- src/libmime/mime_headers.c | 81 ++++++++++++++++++++++++++++++++++++++ src/libmime/mime_headers.h | 8 ++++ 2 files changed, 89 insertions(+) diff --git a/src/libmime/mime_headers.c b/src/libmime/mime_headers.c index 6fec91add..0c47988de 100644 --- a/src/libmime/mime_headers.c +++ b/src/libmime/mime_headers.c @@ -520,3 +520,84 @@ rspamd_mime_header_decode (rspamd_mempool_t *pool, const gchar *in, return out->str; } + +gchar * +rspamd_mime_header_encode (const gchar *in, gsize len) +{ + const gchar *p = in, *end = in + len; + gchar *out, encode_buf[80]; + GString *res; + gboolean need_encoding = FALSE; + + /* Check if we need to encode */ + while (p < end) { + if ((((guchar)*p) & 0x80) != 0) { + need_encoding = TRUE; + break; + } + p ++; + } + + if (!need_encoding) { + out = g_malloc (len + 1); + rspamd_strlcpy (out, in, len + 1); + } + else { + /* Need encode */ + gsize ulen, pos; + gint r; + const gchar *prev; + /* Choose step: =?UTF-8?Q??= should be less than 76 chars */ + const guint step = (76 - 12) / 3 + 1; + + ulen = g_utf8_strlen (in, len); + res = g_string_sized_new (len * 2 + 1); + pos = 0; + prev = in; + + while (pos < ulen) { + p = g_utf8_offset_to_pointer (in, pos); + + if (p > prev) { + /* Encode and print */ + r = rspamd_encode_qp2047_buf (prev, p - prev, + encode_buf, sizeof (encode_buf)); + + if (r != -1) { + if (res->len > 0) { + rspamd_printf_gstring (res, " =?UTF-8?Q?%*s?=", r, + encode_buf); + } + else { + rspamd_printf_gstring (res, "=?UTF-8?Q?%*s?=", r, + encode_buf); + } + } + } + + pos += MIN (step, ulen - pos); + prev = p; + } + + /* Leftover */ + if (prev < end) { + r = rspamd_encode_qp2047_buf (prev, end - prev, + encode_buf, sizeof (encode_buf)); + + if (r != -1) { + if (res->len > 0) { + rspamd_printf_gstring (res, " =?UTF-8?Q?%*s?=", r, + encode_buf); + } + else { + rspamd_printf_gstring (res, "=?UTF-8?Q?%*s?=", r, + encode_buf); + } + } + } + + out = g_string_free (res, FALSE); + } + + return out; +} diff --git a/src/libmime/mime_headers.h b/src/libmime/mime_headers.h index 4d2597c84..1310c0b75 100644 --- a/src/libmime/mime_headers.h +++ b/src/libmime/mime_headers.h @@ -58,4 +58,12 @@ void rspamd_mime_headers_process (struct rspamd_task *task, GHashTable *target, gchar * rspamd_mime_header_decode (rspamd_mempool_t *pool, const gchar *in, gsize inlen); +/** + * Encode mime header if needed + * @param in + * @param len + * @return newly allocated encoded header + */ +gchar * rspamd_mime_header_encode (const gchar *in, gsize len); + #endif /* SRC_LIBMIME_MIME_HEADERS_H_ */ -- 2.39.5