This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 64f050bc294174e680f4f3f32beedf1d75bc62bd
Author: William Collins <punkhor...@gmail.com>
AuthorDate: Thu Sep 20 13:45:59 2018 -0400

    [CAMEL-12605] Fixed parsing issue with MultipartSignedEntityBody
---
 .../component/as2/api/entity/EntityParser.java     | 34 +++++++++++++++-------
 .../component/as2/api/util/AS2HeaderUtils.java     |  4 +--
 .../component/as2/api/util/HttpMessageUtils.java   |  5 ++--
 3 files changed, 29 insertions(+), 14 deletions(-)

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 b2c3f46..60cee06 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
@@ -40,11 +40,13 @@ import org.apache.http.Header;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpException;
 import org.apache.http.HttpMessage;
+import org.apache.http.NameValuePair;
 import org.apache.http.ParseException;
 import org.apache.http.entity.ContentType;
 import org.apache.http.impl.io.AbstractMessageParser;
 import org.apache.http.impl.io.HttpTransportMetricsImpl;
 import org.apache.http.message.BasicLineParser;
+import org.apache.http.message.BasicNameValuePair;
 import org.apache.http.message.LineParser;
 import org.apache.http.message.ParserCursor;
 import org.apache.http.util.Args;
@@ -276,12 +278,18 @@ public final class EntityParser {
             inbuffer.bind(entity.getContent());
 
             // Get Boundary Value
-            String boundary = 
HttpMessageUtils.getBoundaryParameterValue(message, AS2Header.CONTENT_TYPE);
+            String boundary = HttpMessageUtils.getParameterValue(message, 
AS2Header.CONTENT_TYPE, "boundary");
             if (boundary == null) {
-                throw new HttpException("Failed to retrive boundary value");
+                throw new HttpException("Failed to retrieve 'boundary' 
parameter from content type header");
+            }
+            
+            // Get Micalg Value
+            String micalg = HttpMessageUtils.getParameterValue(message, 
AS2Header.CONTENT_TYPE, "micalg");
+            if (micalg == null) {
+                throw new HttpException("Failed to retrieve 'micalg' parameter 
from content type header");
             }
 
-            multipartSignedEntity = parseMultipartSignedEntityBody(inbuffer, 
boundary, charsetName, contentTransferEncoding);
+            multipartSignedEntity = parseMultipartSignedEntityBody(inbuffer, 
boundary, micalg, charsetName, contentTransferEncoding);
             multipartSignedEntity.setMainBody(true);
 
             EntityUtils.setMessageEntity(message, multipartSignedEntity);
@@ -370,7 +378,7 @@ public final class EntityParser {
             inbuffer.bind(entity.getContent());
 
             // Get Boundary Value
-            String boundary = 
HttpMessageUtils.getBoundaryParameterValue(message, AS2Header.CONTENT_TYPE);
+            String boundary = HttpMessageUtils.getParameterValue(message, 
AS2Header.CONTENT_TYPE, "boundary");
             if (boundary == null) {
                 throw new HttpException("Failed to retrive boundary value");
             }
@@ -420,6 +428,7 @@ public final class EntityParser {
 
     public static MultipartSignedEntity 
parseMultipartSignedEntityBody(AS2SessionInputBuffer inbuffer,
                                                                        String 
boundary,
+                                                                       String 
micalg,
                                                                        String 
charsetName,
                                                                        String 
contentTransferEncoding)
             throws ParseException {
@@ -514,7 +523,11 @@ public final class EntityParser {
             //
             // End Signature Body Part
 
-            ContentType contentType = 
ContentType.create(AS2MimeType.MULTIPART_SIGNED, charset);
+            NameValuePair[] parameters = new NameValuePair[] {
+                    new BasicNameValuePair("protocol", 
AS2MimeType.APPLICATION_PKCS7_SIGNATURE),
+                    new BasicNameValuePair("boundary", boundary), new 
BasicNameValuePair("micalg", micalg),
+                    new BasicNameValuePair("charset", charsetName)};
+            ContentType contentType = 
ContentType.create(AS2MimeType.MULTIPART_SIGNED, parameters);
             multipartSignedEntity.setContentType(contentType);
             
multipartSignedEntity.setContentTransferEncoding(contentTransferEncoding);
             return multipartSignedEntity;
@@ -731,9 +744,10 @@ public final class EntityParser {
                 entity = parseEDIEntityBody(inbuffer, boundary, 
entityContentType, contentTransferEncoding);
                 break;
             case AS2MimeType.MULTIPART_SIGNED:
-                String multipartSignedBoundary = 
AS2HeaderUtils.getBoundaryParameterValue(headers,
-                        AS2Header.CONTENT_TYPE);
-                entity = parseMultipartSignedEntityBody(inbuffer, 
multipartSignedBoundary, charset.name(),
+                String multipartSignedBoundary = 
AS2HeaderUtils.getParameterValue(headers,
+                        AS2Header.CONTENT_TYPE, "boundary");
+                String micalg = AS2HeaderUtils.getParameterValue(headers, 
AS2Header.CONTENT_TYPE, "micalg");
+                entity = parseMultipartSignedEntityBody(inbuffer, 
multipartSignedBoundary, micalg, charset.name(),
                         contentTransferEncoding);
                 skipToBoundary(inbuffer, boundary);
                 break;
@@ -742,8 +756,8 @@ public final class EntityParser {
                         contentTransferEncoding);
                 break;
             case AS2MimeType.MULTIPART_REPORT:
-                String multipartReportBoundary = 
AS2HeaderUtils.getBoundaryParameterValue(headers,
-                        AS2Header.CONTENT_TYPE);
+                String multipartReportBoundary = 
AS2HeaderUtils.getParameterValue(headers,
+                        AS2Header.CONTENT_TYPE, "boundary");
                 entity = parseMultipartReportEntityBody(inbuffer, 
multipartReportBoundary, charset.name(),
                         contentTransferEncoding);
                 skipToBoundary(inbuffer, boundary);
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/AS2HeaderUtils.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/AS2HeaderUtils.java
index 213183b..db589d5 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/AS2HeaderUtils.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/AS2HeaderUtils.java
@@ -145,14 +145,14 @@ public final class AS2HeaderUtils {
         return new Parameter(name, importance, values.toArray(new 
String[values.size()]));
     }
 
-    public static String getBoundaryParameterValue(Header[] headers, String 
headerName) {
+    public static String getParameterValue(Header[] headers, String 
headerName, String parameterName) {
         Args.notNull(headers, "headers");
         Args.notNull(headerName, "headerName");
         for (Header header : headers) {
             if (header.getName().equalsIgnoreCase(headerName)) {
                 for (HeaderElement headerElement : header.getElements()) {
                     for (NameValuePair nameValuePair : 
headerElement.getParameters()) {
-                        if 
(nameValuePair.getName().equalsIgnoreCase("boundary")) {
+                        if 
(nameValuePair.getName().equalsIgnoreCase(parameterName)) {
                             return nameValuePair.getValue();
                         }
                     }
diff --git 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/HttpMessageUtils.java
 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/HttpMessageUtils.java
index 1563c7a..0bf4962 100644
--- 
a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/HttpMessageUtils.java
+++ 
b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/util/HttpMessageUtils.java
@@ -96,16 +96,17 @@ public final class HttpMessageUtils {
         }
     }
 
-    public static String getBoundaryParameterValue(HttpMessage message, String 
headerName) {
+    public static String getParameterValue(HttpMessage message, String 
headerName, String parameterName) {
         Args.notNull(message, "message");
         Args.notNull(headerName, "headerName");
+        Args.notNull(parameterName, "parameterName");
         Header header = message.getFirstHeader(headerName);
         if (header == null) {
             return null;
         }
         for (HeaderElement headerElement : header.getElements()) {
             for (NameValuePair nameValuePair : headerElement.getParameters()) {
-                if (nameValuePair.getName().equalsIgnoreCase("boundary")) {
+                if (nameValuePair.getName().equalsIgnoreCase(parameterName)) {
                     return nameValuePair.getValue();
                 }
             }

Reply via email to