This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new b1e202a2d82 CAMEL-22113 [AS2] Sample changes for new header Content-Disposition if the structure is… (#18184) b1e202a2d82 is described below commit b1e202a2d82de9effd484d336effcd5c0c4b9a03 Author: Dmitry Kryukov <d...@users.noreply.github.com> AuthorDate: Wed May 28 08:06:05 2025 +0300 CAMEL-22113 [AS2] Sample changes for new header Content-Disposition if the structure is… (#18184) * Sample changes for new header Content-Disposition if the structure is PLAIN --- .../camel/component/as2/api/AS2ClientManager.java | 7 ++ .../as2/api/entity/ApplicationEntity.java | 2 +- .../camel/component/as2/AS2ServerManagerIT.java | 84 ++++++++++++++++++++++ 3 files changed, 92 insertions(+), 1 deletion(-) diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientManager.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientManager.java index 0aae64f96e6..72b64e6d7f7 100644 --- a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientManager.java +++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientManager.java @@ -45,6 +45,9 @@ import org.bouncycastle.cms.CMSCompressedDataGenerator; import org.bouncycastle.cms.CMSEnvelopedDataGenerator; import org.bouncycastle.operator.OutputCompressor; import org.bouncycastle.operator.OutputEncryptor; +import org.slf4j.helpers.MessageFormatter; + +import static org.apache.camel.component.as2.api.entity.ApplicationEntity.CONTENT_DISPOSITION_PATTERN; /** * Sends EDI Messages over HTTP @@ -296,6 +299,10 @@ public class AS2ClientManager { switch (as2MessageStructure) { case PLAIN: { plain(applicationEntity, request); + if (attachedFileName != null && !attachedFileName.isEmpty()) { + request.setHeader(AS2Header.CONTENT_DISPOSITION, + MessageFormatter.format(CONTENT_DISPOSITION_PATTERN, attachedFileName).getMessage()); + } break; } case SIGNED: { diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationEntity.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationEntity.java index 1dad6d652cd..52f008521fa 100644 --- a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationEntity.java +++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationEntity.java @@ -34,7 +34,7 @@ import org.slf4j.helpers.MessageFormatter; public abstract class ApplicationEntity extends MimeEntity { - protected static final String CONTENT_DISPOSITION_PATTERN = "attachment; filename={}"; + public static final String CONTENT_DISPOSITION_PATTERN = "attachment; filename={}"; protected final byte[] ediContent; diff --git a/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ServerManagerIT.java b/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ServerManagerIT.java index 5793928696a..b07c7b6f3ec 100644 --- a/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ServerManagerIT.java +++ b/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ServerManagerIT.java @@ -56,10 +56,13 @@ import org.bouncycastle.util.io.Streams; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.slf4j.helpers.MessageFormatter; +import static org.apache.camel.component.as2.api.entity.ApplicationEntity.CONTENT_DISPOSITION_PATTERN; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; /** @@ -70,6 +73,8 @@ public class AS2ServerManagerIT extends AS2ServerManagerITBase { protected static final Logger LOG = LoggerFactory.getLogger(AS2ServerManagerIT.class); + private static final String ATTACHED_FILE_NAME = "file_123.txt"; + @Test public void receivePlainEDIMessageTest() throws Exception { receivePlainEDIMessage(EDI_MESSAGE, null); @@ -130,6 +135,85 @@ public class AS2ServerManagerIT extends AS2ServerManagerITBase { assertTrue(request.getFirstHeader(AS2Header.CONTENT_TYPE).getValue().startsWith(AS2MediaType.APPLICATION_EDIFACT), "Unexpected content type for message"); + assertTrue(request instanceof ClassicHttpRequest, "Request does not contain entity"); + HttpEntity entity = ((ClassicHttpRequest) request).getEntity(); + assertNotNull(entity, "Request does not contain entity"); + assertTrue(entity instanceof ApplicationEDIFACTEntity, "Unexpected request entity type"); + ApplicationEDIFACTEntity ediEntity = (ApplicationEDIFACTEntity) entity; + assertTrue(ediEntity.getContentType().startsWith(AS2MediaType.APPLICATION_EDIFACT), + "Unexpected content type for entity"); + assertTrue(ediEntity.isMainBody(), "Entity not set as main body of request"); + assertNull(request.getFirstHeader(AS2Header.CONTENT_DISPOSITION)); + + ApplicationEntity appEntity = (ApplicationEntity) entity; + if (encoding == null) { + assertTrue(appEntity.getEdiMessage() instanceof String); + String rcvdMessage = ((String) appEntity.getEdiMessage()).replaceAll("\r", ""); + assertEquals(EDI_MESSAGE, rcvdMessage, "EDI message does not match"); + } else if ("base64".equals(encoding)) { + assertTrue(appEntity.getEdiMessage() instanceof InputStream); + InputStream is = (InputStream) appEntity.getEdiMessage(); + String rcvdMessage = new String(is.readAllBytes(), StandardCharsets.US_ASCII).replaceAll("\r", ""); + assertEquals(EDI_MESSAGE, rcvdMessage, "EDI message does not match"); + } + String rcvdMessageFromBody = message.getBody(String.class); + assertEquals(EDI_MESSAGE.replaceAll("[\n\r]", ""), rcvdMessageFromBody.replaceAll("[\n\r]", ""), + "EDI message does not match"); + } + + @Test + public void receivePlainEDIStreamMessageWithAttachedFileNameTest() throws Exception { + receivePlainEDIMessageWithAttachedFileName(new ByteArrayInputStream(EDI_MESSAGE.getBytes(StandardCharsets.US_ASCII)), + null); + } + + private void receivePlainEDIMessageWithAttachedFileName(Object msg, String encoding) throws Exception { + final AS2ClientConnection clientConnection = getAs2ClientConnection(); + AS2ClientManager clientManager = new AS2ClientManager(clientConnection); + + clientManager.send(msg, REQUEST_URI, SUBJECT, FROM, AS2_NAME, AS2_NAME, AS2MessageStructure.PLAIN, + AS2MediaType.APPLICATION_EDIFACT, null, encoding, null, null, null, + null, DISPOSITION_NOTIFICATION_TO, SIGNED_RECEIPT_MIC_ALGORITHMS, null, null, ATTACHED_FILE_NAME, null, + null, null, null); + + MockEndpoint mockEndpoint = getMockEndpoint("mock:as2RcvMsgs"); + mockEndpoint.expectedMinimumMessageCount(1); + mockEndpoint.setResultWaitTime(TimeUnit.MILLISECONDS.convert(30, TimeUnit.SECONDS)); + mockEndpoint.assertIsSatisfied(); + + final List<Exchange> exchanges = mockEndpoint.getExchanges(); + assertNotNull(exchanges, "listen result"); + assertFalse(exchanges.isEmpty(), "listen result"); + LOG.debug("poll result: {}", exchanges); + + Exchange exchange = exchanges.get(0); + Message message = exchange.getIn(); + assertNotNull(message, "exchange message"); + + HttpCoreContext coreContext = exchange.getProperty(AS2Constants.AS2_INTERCHANGE, HttpCoreContext.class); + assertNotNull(coreContext, "context"); + HttpRequest request = coreContext.getRequest(); + assertNotNull(request, "request"); + assertEquals(METHOD, request.getMethod(), "Unexpected method value"); + assertEquals(REQUEST_URI, request.getUri().getPath(), "Unexpected request URI value"); + assertEquals(HttpVersion.HTTP_1_1, request.getVersion(), "Unexpected HTTP version value"); + assertEquals(SUBJECT, request.getFirstHeader(AS2Header.SUBJECT).getValue(), "Unexpected subject value"); + assertEquals(FROM, request.getFirstHeader(AS2Header.FROM).getValue(), "Unexpected from value"); + assertEquals(AS2_VERSION, request.getFirstHeader(AS2Header.AS2_VERSION).getValue(), "Unexpected AS2 version value"); + assertEquals(AS2_NAME, request.getFirstHeader(AS2Header.AS2_FROM).getValue(), "Unexpected AS2 from value"); + assertEquals(AS2_NAME, request.getFirstHeader(AS2Header.AS2_TO).getValue(), "Unexpected AS2 to value"); + assertTrue(request.getFirstHeader(AS2Header.MESSAGE_ID).getValue().endsWith(CLIENT_FQDN + ">"), + "Unexpected message id value"); + assertEquals(TARGET_HOST + ":" + TARGET_PORT, request.getFirstHeader(AS2Header.TARGET_HOST).getValue(), + "Unexpected target host value"); + assertEquals(USER_AGENT, request.getFirstHeader(AS2Header.USER_AGENT).getValue(), "Unexpected user agent value"); + assertNotNull(request.getFirstHeader(AS2Header.DATE), "Date value missing"); + assertNotNull(request.getFirstHeader(AS2Header.CONTENT_LENGTH), "Content length value missing"); + assertTrue(request.getFirstHeader(AS2Header.CONTENT_TYPE).getValue().startsWith(AS2MediaType.APPLICATION_EDIFACT), + "Unexpected content type for message"); + assertEquals(MessageFormatter.format(CONTENT_DISPOSITION_PATTERN, ATTACHED_FILE_NAME).getMessage(), + request.getFirstHeader(AS2Header.CONTENT_DISPOSITION).getValue(), "Unexpected user agent value"); + assertTrue(request instanceof ClassicHttpRequest, "Request does not contain entity"); HttpEntity entity = ((ClassicHttpRequest) request).getEntity(); assertNotNull(entity, "Request does not contain entity");