#include <math.h>
#define UTF8_CHARSET "UTF-8"
+#define RSPAMD_BINARYENC_CHARSET "x-binaryenc"
#define RSPAMD_CHARSET_FLAG_UTF (1 << 0)
#define RSPAMD_CHARSET_FLAG_ASCII (1 << 1)
return FALSE;
}
+static void
+set_part_binary(struct rspamd_task *task,
+ struct rspamd_mime_text_part *text_part,
+ GByteArray *part_content,
+ const char *charset)
+{
+ msg_debug_task("text part contains binary data (detected charset: %s), skip conversion",
+ charset);
+ SET_PART_RAW(text_part);
+ text_part->utf_raw_content = part_content;
+}
+
void rspamd_mime_text_part_maybe_convert(struct rspamd_task *task,
struct rspamd_mime_text_part *text_part)
{
text_part->parsed.len);
if (charset != NULL) {
+ if (g_ascii_strcasecmp(charset, RSPAMD_BINARYENC_CHARSET) == 0) {
+ set_part_binary(task, text_part, part_content, charset);
+ return;
+ }
msg_info_task("detected charset %s", charset);
}
if (need_charset_heuristic) {
charset = rspamd_mime_charset_find_by_content_maybe_split(part_content->data,
part_content->len);
+ if (charset != NULL && g_ascii_strcasecmp(charset, RSPAMD_BINARYENC_CHARSET) == 0) {
+ set_part_binary(task, text_part, part_content, charset);
+ return;
+ }
msg_info_task("detected charset: %s", charset);
checked = TRUE;
text_part->real_charset = charset;
else {
charset = charset_tok.begin;
+ if (g_ascii_strcasecmp(charset, RSPAMD_BINARYENC_CHARSET) == 0) {
+ set_part_binary(task, text_part, part_content, charset);
+ return;
+ }
+
if (!rspamd_mime_text_part_utf8_convert(task, text_part,
part_content, charset, &err)) {
msg_warn_task("<%s>: cannot convert from %s to utf8: %s",