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 <[email protected]>
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");