commit a927293263d4c7c48bfa925d23a648ebca0d12db
parent beeae7c6e260d3ea5b262fac2d1096c2c8858514
Author: Dan Callaghan <djc@djc.id.au>
Date: Sun, 11 May 2025 16:10:16 +1000
assume draft charset is $encoding instead of ASCII when indexing
Sup writes drafts without any Content-Type header. It assumes when
sending the mail that it is text/plain with charset=$encoding.
Assume the same when indexing the draft.
Fixes #343.
Diffstat:
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/lib/sup/draft.rb b/lib/sup/draft.rb
@@ -76,7 +76,11 @@ class DraftLoader < Source
def load_message offset
raise SourceError, "Draft not found" unless File.exist? fn_for_offset(offset)
- File.open(fn_for_offset(offset)) { |f| RMail::Parser.read f }
+ File.open(fn_for_offset(offset)) do |f|
+ message = RMail::Parser.read f
+ message.header.set "Content-Type", "text/plain; charset=#{$encoding}"
+ message
+ end
end
def fallback_date_for_message offset
diff --git a/test/integration/test_draft.rb b/test/integration/test_draft.rb
@@ -99,4 +99,28 @@ EOS
messages_in_index = Index.instance.enum_for(:each_message).to_a
assert_equal "", messages_in_index[0].subj
end
+
+ def test_draft_with_non_ascii_chars
+ message = <<EOS
+From: Some Person <someone@example.invalid>
+To:
+Cc:
+Bcc:
+Subject: UTF-8 draft 🤐
+Date: Fri, 11 Apr 2025 22:34:05 +1000
+Message-ID: <123@example.invalid>
+
+¡Buen día! Доброго ранку! おはよう!
+EOS
+ DraftManager.write_draft { |f| f.write message }
+ draft_filename = File.join @draft_dir, "0"
+ assert_equal message, (File.read draft_filename)
+
+ PollManager.poll_from @draft_source
+ messages_in_index = Index.instance.enum_for(:each_message).to_a
+ assert_equal "UTF-8 draft 🤐", messages_in_index[0].subj
+ assert_equal message, messages_in_index.first.raw_message
+ assert_equal "¡Buen día! Доброго ранку! おはよう!", \
+ messages_in_index[0].chunks[0].lines[0]
+ end
end