From 894df5338c62ff1a6d7849590aae3baeac1624cc Mon Sep 17 00:00:00 2001 From: Cody Lerum Date: Thu, 16 Oct 2025 07:58:33 -0700 Subject: [PATCH 1/2] account for null content type --- src/main/java/co/cfly/email/impl/util/MailUtility.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/co/cfly/email/impl/util/MailUtility.java b/src/main/java/co/cfly/email/impl/util/MailUtility.java index 3fa2690..4a82225 100644 --- a/src/main/java/co/cfly/email/impl/util/MailUtility.java +++ b/src/main/java/co/cfly/email/impl/util/MailUtility.java @@ -18,6 +18,7 @@ import java.util.Enumeration; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -291,7 +292,7 @@ public static String decodeString(String value) { * Determines the content type of the part, or empty if it cannot determine */ public static Charset determineCharset(Part part, Charset defaultValue) throws MessagingException { - return Arrays.stream(part.getHeader("Content-Type")).findFirst().map(value -> { + return Arrays.stream(Optional.ofNullable(part.getHeader("Content-Type")).orElseGet(() -> new String[0])).findFirst().map(value -> { Matcher matcher = CHARSET_EXTRACT.matcher(value); if (matcher.find()) { String charsetName = matcher.group(1).trim().toUpperCase(); From a44cd427584dd1be0d844a20188bba5141ab2567 Mon Sep 17 00:00:00 2001 From: Cody Lerum Date: Thu, 16 Oct 2025 08:06:38 -0700 Subject: [PATCH 2/2] simplify and add test --- src/main/java/co/cfly/email/impl/util/MailUtility.java | 3 ++- src/test/java/co/cfly/email/MailUtilityTest.java | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/co/cfly/email/impl/util/MailUtility.java b/src/main/java/co/cfly/email/impl/util/MailUtility.java index 4a82225..cd4b544 100644 --- a/src/main/java/co/cfly/email/impl/util/MailUtility.java +++ b/src/main/java/co/cfly/email/impl/util/MailUtility.java @@ -291,8 +291,9 @@ public static String decodeString(String value) { /** * Determines the content type of the part, or empty if it cannot determine */ + @SuppressWarnings("SwitchStatementWithTooFewBranches") public static Charset determineCharset(Part part, Charset defaultValue) throws MessagingException { - return Arrays.stream(Optional.ofNullable(part.getHeader("Content-Type")).orElseGet(() -> new String[0])).findFirst().map(value -> { + return Optional.ofNullable(part.getHeader("Content-Type")).flatMap(headers -> Arrays.stream(headers).findFirst()).map(value -> { Matcher matcher = CHARSET_EXTRACT.matcher(value); if (matcher.find()) { String charsetName = matcher.group(1).trim().toUpperCase(); diff --git a/src/test/java/co/cfly/email/MailUtilityTest.java b/src/test/java/co/cfly/email/MailUtilityTest.java index 777532a..9bb9fc8 100644 --- a/src/test/java/co/cfly/email/MailUtilityTest.java +++ b/src/test/java/co/cfly/email/MailUtilityTest.java @@ -32,6 +32,12 @@ public void determineCharset() throws MessagingException { Assert.assertEquals(StandardCharsets.UTF_8, MailUtility.determineCharset(part, StandardCharsets.UTF_8)); } + @Test + public void determineCharsetNoContentType() throws MessagingException { + MimeBodyPart part = new MimeBodyPart(); + Assert.assertEquals(StandardCharsets.UTF_8, MailUtility.determineCharset(part, StandardCharsets.UTF_8)); + } + @Test public void determineCharsetQuoted() throws MessagingException { MimeBodyPart part = new MimeBodyPart();