CAMEL-22359 Fix MDN multipart/report parsing issue with no Content-Type (#18937)

* CAMEL-22359 Fix MDN multipart/report parsing issue with no Content-Type

* CAMEL-22359 Add tests

* CAMEL-22359 Fix code formatting

---------

Co-authored-by: m.sorce <m.sorce@datailor.fr>
diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/EntityParser.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/EntityParser.java
index 3f37590..fb81535 100644
--- a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/EntityParser.java
+++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/EntityParser.java
@@ -678,9 +678,12 @@
                     textReportContentTransferEncoding = header.getValue();
                 }
             }
+
+            // If Content-Type is not defined, should be considered as "text/plain; charset=us-ascii" (RFC 2045 - 5.2)
             if (textReportContentType == null) {
-                throw new HttpException("Failed to find Content-Type header in EDI message body part");
+                textReportContentType = ContentType.parse("text/plain").withCharset(StandardCharsets.US_ASCII.name());
             }
+
             if (!textReportContentType.getMimeType().equalsIgnoreCase(AS2MimeType.TEXT_PLAIN)) {
                 throw new HttpException(
                         "Invalid content type '" + textReportContentType.getMimeType()
diff --git a/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/entity/EntityParserTest.java b/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/entity/EntityParserTest.java
index 69a35ca..168ef7f 100644
--- a/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/entity/EntityParserTest.java
+++ b/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/entity/EntityParserTest.java
@@ -70,6 +70,7 @@
 
 import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
@@ -395,6 +396,35 @@
                 "Decrypted entity has unexpected content");
     }
 
+    @Test
+    public void parseMultipartReportOmittingContentTypeOnTextPlainPartTest() throws Exception {
+        String reportContentWithoutContentType = "\r\n"
+                                                 + "------=_Part_56_1672293592.1028122454656\r\n"
+                                                 // Intentionally omit Content-Type: text/plain
+                                                 + "Content-Transfer-Encoding: 7bit\r\n"
+                                                 + "\r\n"
+                                                 + EXPECTED_TEXT_PLAIN_CONTENT + "\r\n"
+                                                 + "------=_Part_56_1672293592.1028122454656\r\n"
+                                                 + "Content-Type: message/disposition-notification\r\n"
+                                                 + "Content-Transfer-Encoding: 7bit\r\n"
+                                                 + "\r\n"
+                                                 + DISPOSITION_NOTIFICATION_CONTENT
+                                                 + "------=_Part_56_1672293592.1028122454656--\r\n";
+
+        DispositionNotificationMultipartReportEntity multipartReportEntity
+                = createMdnEntity(reportContentWithoutContentType, DISPOSITION_NOTIFICATION_REPORT_CONTENT_BOUNDARY);
+
+        assertEquals(2, multipartReportEntity.getPartCount(), "Unexpected number of parts");
+
+        assertInstanceOf(TextPlainEntity.class, multipartReportEntity.getPart(0),
+                "First part should default to TextPlainEntity");
+        TextPlainEntity textPlainPart = (TextPlainEntity) multipartReportEntity.getPart(0);
+        assertEquals(EXPECTED_TEXT_PLAIN_CONTENT, textPlainPart.getText(), "Unexpected text/plain content");
+
+        assertInstanceOf(AS2MessageDispositionNotificationEntity.class, multipartReportEntity.getPart(1),
+                "Second part should be a disposition-notification entity");
+    }
+
     /**
      * create a basic X509 certificate from the given keys
      */