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
*/