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.