]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Minor] Add function to encode mime headers
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 20 Dec 2016 16:46:49 +0000 (16:46 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 20 Dec 2016 17:14:17 +0000 (17:14 +0000)
src/libmime/mime_headers.c
src/libmime/mime_headers.h

index 6fec91add4d437c7acf39c1655f9ef4e9ebae82b..0c47988def336b842f324996af3640c734f887bd 100644 (file)
@@ -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?<qp>?= 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;
+}
index 4d2597c8465d05db91ebb362683413c3763dfb30..1310c0b758391de0dc2d5bfb87ed1fe28bb6a0d4 100644 (file)
@@ -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_ */