You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2018/05/19 18:43:53 UTC
[camel] branch master updated: [CAMEL-11257] Fixed serialization
issue with non-MIME messages
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push:
new 331476f [CAMEL-11257] Fixed serialization issue with non-MIME messages
331476f is described below
commit 331476f845f0c13144af5a7475fd1c4b722485b9
Author: William Collins <pu...@gmail.com>
AuthorDate: Fri May 18 15:30:39 2018 -0400
[CAMEL-11257] Fixed serialization issue with non-MIME messages
---
.../camel/component/as2/api/AS2ClientManager.java | 3 ++-
.../camel/component/as2/api/entity/EntityParser.java | 18 +++++++-----------
.../component/as2/api/io/AS2SessionInputBuffer.java | 18 ++++++++++++++++--
.../camel/component/as2/api/util/MicUtilsTest.java | 2 +-
.../org/apache/camel/component/as2/AS2Component.java | 16 ++++++++++++++++
.../component/as2/AS2ServerManagerIntegrationTest.java | 3 +++
6 files changed, 45 insertions(+), 15 deletions(-)
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 f13f282..b2daab5 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
@@ -49,7 +49,7 @@ public class AS2ClientManager {
* Prefix for all AS2 HTTP Context Attributes used by the Http Client
* Manager.
*/
- public static final String CAMEL_AS2_CLIENT_PREFIX = "camel-as2.client";
+ public static final String CAMEL_AS2_CLIENT_PREFIX = "camel-as2.client.";
/**
* The HTTP Context Attribute indicating the AS2 message structure to be sent.
@@ -231,6 +231,7 @@ public class AS2ClientManager {
try {
MultipartSignedEntity multipartSignedEntity = new MultipartSignedEntity(applicationEDIEntity, gen,
AS2Charset.US_ASCII, AS2TransferEncoding.BASE64, true, null);
+ multipartSignedEntity.setMainBody(true);
EntityUtils.setMessageEntity(request, multipartSignedEntity);
} catch (Exception e) {
throw new HttpException("Failed to sign message", e);
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 ff154f2..c13dead 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
@@ -209,6 +209,7 @@ public final class EntityParser {
}
multipartSignedEntity = parseMultipartSignedEntityBody(inbuffer, boundary, charsetName, contentTransferEncoding);
+ multipartSignedEntity.setMainBody(true);
EntityUtils.setMessageEntity(message, multipartSignedEntity);
@@ -245,18 +246,11 @@ public final class EntityParser {
Header transferEncoding = entity.getContentEncoding();
String contentTransferEncoding = transferEncoding == null ? null : transferEncoding.getValue();
- SessionInputBufferImpl inBuffer = new SessionInputBufferImpl(new HttpTransportMetricsImpl(), 8 * 1024);
+ AS2SessionInputBuffer inBuffer = new AS2SessionInputBuffer(new HttpTransportMetricsImpl(), 8 * 1024);
inBuffer.bind(entity.getContent());
- // Extract content from stream
- CharArrayBuffer lineBuffer = new CharArrayBuffer(1024);
- while (inBuffer.readLine(lineBuffer) != -1) {
- lineBuffer.append("\r\n"); // add line delimiter
- }
-
- // Build application EDI entity
- applicationEDIEntity = EntityUtils.createEDIEntity(lineBuffer.toString(), contentType,
- contentTransferEncoding, true);
+ applicationEDIEntity = parseEDIEntityBody(inBuffer, null, contentType, contentTransferEncoding);
+ applicationEDIEntity.setMainBody(true);
EntityUtils.setMessageEntity(message, applicationEDIEntity);
} catch (HttpException e) {
@@ -791,7 +785,9 @@ public final class EntityParser {
}
buffer.append(line);
- buffer.append("\r\n");
+ if (inbuffer.isLastLineReadTerminatedByLineFeed()) {
+ buffer.append("\r\n");
+ }
line.clear();
}
diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/io/AS2SessionInputBuffer.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/io/AS2SessionInputBuffer.java
index 630edeb..858c15c 100644
--- a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/io/AS2SessionInputBuffer.java
+++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/io/AS2SessionInputBuffer.java
@@ -49,6 +49,8 @@ public class AS2SessionInputBuffer implements SessionInputBuffer, BufferInfo {
private int bufferpos;
private int bufferlen;
private CharBuffer cbuf;
+
+ private boolean lastLineReadTerminatedByLineFeed;
public AS2SessionInputBuffer(final HttpTransportMetricsImpl metrics,
final int buffersize,
@@ -186,12 +188,14 @@ public class AS2SessionInputBuffer implements SessionInputBuffer, BufferInfo {
final int maxLineLen = this.constraints.getMaxLineLength();
int noRead = 0;
boolean retry = true;
+ this.lastLineReadTerminatedByLineFeed = false;
while (retry) {
// attempt to find end of line (LF)
int pos = -1;
for (int i = this.bufferpos; i < this.bufferlen; i++) {
if (this.buffer[i] == HTTP.LF) {
pos = i;
+ this.lastLineReadTerminatedByLineFeed = true;
break;
}
}
@@ -218,14 +222,16 @@ public class AS2SessionInputBuffer implements SessionInputBuffer, BufferInfo {
}
noRead = fillBuffer();
if (noRead == -1) {
+ // end of stream reached.
retry = false;
}
}
}
if (noRead == -1 && this.linebuffer.isEmpty()) {
- // indicate the end of stream
+ // end of stream reached with no further data in line buffer
return -1;
}
+
return lineFromLineBuffer(charbuffer);
}
@@ -240,6 +246,10 @@ public class AS2SessionInputBuffer implements SessionInputBuffer, BufferInfo {
}
}
+ public boolean isLastLineReadTerminatedByLineFeed() {
+ return lastLineReadTerminatedByLineFeed;
+ }
+
@Override
public boolean isDataAvailable(int timeout) throws IOException {
return hasBufferedData();
@@ -343,7 +353,11 @@ public class AS2SessionInputBuffer implements SessionInputBuffer, BufferInfo {
len = this.bufferlen - this.bufferpos;
}
this.linebuffer.append(this.buffer, this.bufferpos, len);
- this.bufferpos = pos + 1;
+ if (pos != -1) {
+ this.bufferpos = pos + 1;
+ } else {
+ this.bufferpos = this.bufferlen;
+ }
} catch (Exception e) {
throw new IOException("failed to decode transfer encoding", e);
}
diff --git a/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/util/MicUtilsTest.java b/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/util/MicUtilsTest.java
index f535786..5cbaba7 100644
--- a/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/util/MicUtilsTest.java
+++ b/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/util/MicUtilsTest.java
@@ -74,7 +74,7 @@ public class MicUtilsTest {
+ "UNZ+1+00000000000778'";
private static final String EXPECTED_MESSAGE_DIGEST_ALGORITHM = "sha1";
- private static final String EXPECTED_ENCODED_MESSAGE_DIGEST = "PaQyByOuBL7XiYyts4Sdmvl1WME=";
+ private static final String EXPECTED_ENCODED_MESSAGE_DIGEST = "XUt+ug5GEDD0X9+Nv8DGYZZThOQ=";
@Before
public void setUp() throws Exception {
diff --git a/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Component.java b/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Component.java
index 2bfd0de..7424fc8 100644
--- a/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Component.java
+++ b/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Component.java
@@ -16,16 +16,23 @@
*/
package org.apache.camel.component.as2;
+import java.security.Security;
+
import org.apache.camel.CamelContext;
import org.apache.camel.Endpoint;
import org.apache.camel.component.as2.internal.AS2ApiCollection;
import org.apache.camel.component.as2.internal.AS2ApiName;
import org.apache.camel.util.component.AbstractApiComponent;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* Represents the component that manages {@link AS2Endpoint}.
*/
public class AS2Component extends AbstractApiComponent<AS2ApiName, AS2Configuration, AS2ApiCollection> {
+
+ private static final Logger LOG = LoggerFactory.getLogger(AS2Component.class);
public AS2Component() {
super(AS2Endpoint.class, AS2ApiName.class, AS2ApiCollection.getCollection());
@@ -55,5 +62,14 @@ public class AS2Component extends AbstractApiComponent<AS2ApiName, AS2Configurat
public void setConfiguration(AS2Configuration configuration) {
super.setConfiguration(configuration);
}
+
+ @Override
+ protected void doStart() throws Exception {
+ super.doStart();
+ if (Security.getProvider("BC") == null) {
+ LOG.debug("Adding BouncyCastleProvider as security provider");
+ Security.addProvider(new BouncyCastleProvider());
+ }
+ }
}
diff --git a/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ServerManagerIntegrationTest.java b/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ServerManagerIntegrationTest.java
index 229c314..fda7aa0 100644
--- a/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ServerManagerIntegrationTest.java
+++ b/components/camel-as2/camel-as2-component/src/test/java/org/apache/camel/component/as2/AS2ServerManagerIntegrationTest.java
@@ -170,6 +170,8 @@ public class AS2ServerManagerIntegrationTest extends AbstractAS2TestSupport {
ApplicationEDIFACTEntity ediEntity = (ApplicationEDIFACTEntity) entity;
assertTrue("Unexpected content type for entity", ediEntity.getContentType().getValue().startsWith(AS2MediaType.APPLICATION_EDIFACT));
assertTrue("Entity not set as main body of request", ediEntity.isMainBody());
+ String rcvdMessage = ediEntity.getEdiMessage().replaceAll("\r", "");
+ assertEquals("EDI message does not match", EDI_MESSAGE, rcvdMessage);
}
@@ -307,4 +309,5 @@ public class AS2ServerManagerIntegrationTest extends AbstractAS2TestSupport {
}
};
}
+
}
--
To stop receiving notification emails like this one, please contact
davsclaus@apache.org.