This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch sandbox/camel-3.x in repository https://gitbox.apache.org/repos/asf/camel.git
commit a463f55f9754cbd128f9a875665124be9d13becc Author: William Collins <punkhor...@gmail.com> AuthorDate: Fri Nov 30 14:27:50 2018 -0500 [CAMEL-12605] Added tests and fixes for compression --- .../camel/component/as2/api/AS2ClientManager.java | 4 +- .../camel/component/as2/api/AS2MediaType.java | 8 +- .../ApplicationPkcs7MimeCompressedDataEntity.java | 2 +- .../ApplicationPkcs7MimeEnvelopedDataEntity.java | 2 +- .../component/as2/api/entity/EntityParser.java | 50 +++++- .../camel/component/as2/api/AS2MessageTest.java | 195 +++++++++++++++++++++ 6 files changed, 254 insertions(+), 7 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 8e1905c..915d210 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 @@ -315,7 +315,7 @@ public class AS2ClientManager { CMSCompressedDataGenerator compressedDataGenerator = createCompressorGenerator(httpContext); OutputCompressor compressor = createCompressor(httpContext); ApplicationPkcs7MimeCompressedDataEntity pkcs7MimeCompressedDataEntity = new ApplicationPkcs7MimeCompressedDataEntity( - applicationEDIEntity, compressedDataGenerator, compressor, AS2TransferEncoding.BASE64, false); + applicationEDIEntity, compressedDataGenerator, compressor, AS2TransferEncoding.BASE64, true); // Add Compressed Entity to main body of request. EntityUtils.setMessageEntity(request, pkcs7MimeCompressedDataEntity); @@ -331,7 +331,7 @@ public class AS2ClientManager { CMSCompressedDataGenerator compressedDataGenerator = createCompressorGenerator(httpContext); OutputCompressor compressor = createCompressor(httpContext); ApplicationPkcs7MimeCompressedDataEntity pkcs7MimeCompressedDataEntity = new ApplicationPkcs7MimeCompressedDataEntity( - multipartSignedEntity, compressedDataGenerator, compressor, AS2TransferEncoding.BASE64, false); + multipartSignedEntity, compressedDataGenerator, compressor, AS2TransferEncoding.BASE64, true); // Add Compressed Entity to main body of request. EntityUtils.setMessageEntity(request, pkcs7MimeCompressedDataEntity); diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2MediaType.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2MediaType.java index d6c4934..1aa3816 100644 --- a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2MediaType.java +++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2MediaType.java @@ -27,9 +27,13 @@ public interface AS2MediaType { */ public static final String APPLICATION_PKCS7_SIGNATURE = "application/pkcs7-signature; name=smime.p7s; smime-type=signed-data"; /** - * Media Type for Application PKCS7 Signature + * Media Type for Application PKCS7 Enveloped Data + */ + public static final String APPLICATION_PKCS7_MIME_ENVELOPED = "application/pkcs7-mime; smime-type=enveloped-data; name=smime.p7m"; + /** + * Media Type for Application PKCS7 Compressed Data */ - public static final String APPLICATION_PKCS7_MIME = "application/pkcs7-mime; name=smime.p7m; smime-type=enveloped-data; name=smime.p7m"; + public static final String APPLICATION_PKCS7_MIME_COMPRESSED = "application/pkcs7-mime; smime-type=compressed-data; name=smime.p7z"; /** * Media Type for Text/Plain Data */ diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeCompressedDataEntity.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeCompressedDataEntity.java index 7a88761..16402e4 100644 --- a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeCompressedDataEntity.java +++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeCompressedDataEntity.java @@ -64,7 +64,7 @@ public class ApplicationPkcs7MimeCompressedDataEntity extends MimeEntity { public ApplicationPkcs7MimeCompressedDataEntity(byte[] compressedData, String compressedContentTransferEncoding, boolean isMainBody) { this.compressedData = Args.notNull(compressedData, "encryptedData"); - setContentType(ContentType.create("application/pkcs7-mime", new BasicNameValuePair("smime-type", "compressed-datat"), + setContentType(ContentType.create("application/pkcs7-mime", new BasicNameValuePair("smime-type", "compressed-data"), new BasicNameValuePair("name", "smime.p7z"))); setContentTransferEncoding(compressedContentTransferEncoding); addHeader(AS2Header.CONTENT_DISPOSITION, CONTENT_DISPOSITION); diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeEnvelopedDataEntity.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeEnvelopedDataEntity.java index 4bb9866..d6a9be6 100644 --- a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeEnvelopedDataEntity.java +++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/entity/ApplicationPkcs7MimeEnvelopedDataEntity.java @@ -64,7 +64,7 @@ public class ApplicationPkcs7MimeEnvelopedDataEntity extends MimeEntity { public ApplicationPkcs7MimeEnvelopedDataEntity(byte[] encryptedData, String encryptedContentTransferEncoding, boolean isMainBody) { this.encryptedData = Args.notNull(encryptedData, "encryptedData"); - setContentType(ContentType.create("application/pkcs7-mime", new BasicNameValuePair("smime-type", "enveloped-datat"), + setContentType(ContentType.create("application/pkcs7-mime", new BasicNameValuePair("smime-type", "enveloped-data"), new BasicNameValuePair("name", "smime.p7m"))); setContentTransferEncoding(encryptedContentTransferEncoding); addHeader(AS2Header.CONTENT_DISPOSITION, CONTENT_DISPOSITION); 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 5fb23f4..42a4b1b 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 @@ -800,6 +800,20 @@ public final class EntityParser { entity = parseApplicationPkcs7SignatureEntityBody(inbuffer, boundary, entityContentType, contentTransferEncoding); break; + case AS2MimeType.APPLICATION_PKCS7_MIME: + switch(entityContentType.getParameter("smime-type")) { + case "compressed-data": + entity = parseApplicationPkcs7MimeCompressedDataEntityBody(inbuffer, boundary, entityContentType, + contentTransferEncoding); + break; + case "enveloped-data": + entity = parseApplicationPkcs7MimeEnvelopedDataEntityBody(inbuffer, boundary, entityContentType, + contentTransferEncoding); + break; + default: + break; + } + break; default: break; } @@ -882,7 +896,7 @@ public final class EntityParser { } } - public static ApplicationPkcs7MimeEnvelopedDataEntity parseApplicationPkcs7MimeEntityBody(AS2SessionInputBuffer inbuffer, + public static ApplicationPkcs7MimeEnvelopedDataEntity parseApplicationPkcs7MimeEnvelopedDataEntityBody(AS2SessionInputBuffer inbuffer, String boundary, ContentType contentType, String contentTransferEncoding) @@ -915,6 +929,40 @@ public final class EntityParser { } } + public static ApplicationPkcs7MimeCompressedDataEntity parseApplicationPkcs7MimeCompressedDataEntityBody(AS2SessionInputBuffer inbuffer, + String boundary, + ContentType contentType, + String contentTransferEncoding) + throws ParseException { + + CharsetDecoder previousDecoder = inbuffer.getCharsetDecoder(); + + try { + Charset charset = contentType.getCharset(); + if (charset == null) { + charset = Charset.forName(AS2Charset.US_ASCII); + } + CharsetDecoder charsetDecoder = charset.newDecoder(); + + inbuffer.setCharsetDecoder(charsetDecoder); + + String pkcs7CompressedBodyContent = parseBodyPartText(inbuffer, boundary); + + byte[] compressedContent = EntityUtils.decode(pkcs7CompressedBodyContent.getBytes(charset), + contentTransferEncoding); + + ApplicationPkcs7MimeCompressedDataEntity applicationPkcs7MimeEntity = new ApplicationPkcs7MimeCompressedDataEntity( + compressedContent, contentTransferEncoding, false); + return applicationPkcs7MimeEntity; + } catch (Exception e) { + ParseException parseException = new ParseException("failed to parse PKCS7 Mime entity"); + parseException.initCause(e); + throw parseException; + } finally { + inbuffer.setCharsetDecoder(previousDecoder); + } + } + public static String parseBodyPartText(final AS2SessionInputBuffer inbuffer, final String boundary) throws IOException { diff --git a/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/AS2MessageTest.java b/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/AS2MessageTest.java index 9a43f10..5b9dc3e 100644 --- a/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/AS2MessageTest.java +++ b/components/camel-as2/camel-as2-api/src/test/java/org/apache/camel/component/as2/api/AS2MessageTest.java @@ -32,6 +32,7 @@ import org.apache.camel.component.as2.api.entity.AS2DispositionType; import org.apache.camel.component.as2.api.entity.AS2MessageDispositionNotificationEntity; import org.apache.camel.component.as2.api.entity.ApplicationEDIEntity; import org.apache.camel.component.as2.api.entity.ApplicationEDIFACTEntity; +import org.apache.camel.component.as2.api.entity.ApplicationPkcs7MimeCompressedDataEntity; import org.apache.camel.component.as2.api.entity.ApplicationPkcs7MimeEnvelopedDataEntity; import org.apache.camel.component.as2.api.entity.ApplicationPkcs7SignatureEntity; import org.apache.camel.component.as2.api.entity.DispositionMode; @@ -70,6 +71,7 @@ import org.bouncycastle.asn1.smime.SMIMEEncryptionKeyPreferenceAttribute; import org.bouncycastle.asn1.x500.X500Name; import org.bouncycastle.cert.jcajce.JcaCertStore; import org.bouncycastle.cms.jcajce.JcaSimpleSignerInfoGeneratorBuilder; +import org.bouncycastle.cms.jcajce.ZlibExpanderProvider; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.junit.AfterClass; import org.junit.Before; @@ -735,5 +737,198 @@ public class AS2MessageTest { mdnMic.getEncodedMessageDigest()); LOG.debug("\r\n" + AS2Utils.printMessage(mndRequest)); } + + @Test + public void compressedMessageTest() throws Exception { + AS2ClientConnection clientConnection = new AS2ClientConnection(AS2_VERSION, USER_AGENT, CLIENT_FQDN, + TARGET_HOST, TARGET_PORT); + AS2ClientManager clientManager = new AS2ClientManager(clientConnection); + + LOG.info("Key Algoritm: " + signingKP.getPrivate().getAlgorithm()); + + HttpCoreContext httpContext = clientManager.send(EDI_MESSAGE, REQUEST_URI, SUBJECT, FROM, AS2_NAME, AS2_NAME, + AS2MessageStructure.PLAIN_COMPRESSED, + ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII), null, + null, null, null, AS2CompressionAlgorithm.ZLIB, + DISPOSITION_NOTIFICATION_TO, SIGNED_RECEIPT_MIC_ALGORITHMS, null, + null, null); + + HttpRequest request = httpContext.getRequest(); + assertEquals("Unexpected method value", METHOD, request.getRequestLine().getMethod()); + assertEquals("Unexpected request URI value", REQUEST_URI, request.getRequestLine().getUri()); + assertEquals("Unexpected HTTP version value", HttpVersion.HTTP_1_1, + request.getRequestLine().getProtocolVersion()); + + assertEquals("Unexpected subject value", SUBJECT, request.getFirstHeader(AS2Header.SUBJECT).getValue()); + assertEquals("Unexpected from value", FROM, request.getFirstHeader(AS2Header.FROM).getValue()); + assertEquals("Unexpected AS2 version value", AS2_VERSION, + request.getFirstHeader(AS2Header.AS2_VERSION).getValue()); + assertEquals("Unexpected AS2 from value", AS2_NAME, request.getFirstHeader(AS2Header.AS2_FROM).getValue()); + assertEquals("Unexpected AS2 to value", AS2_NAME, request.getFirstHeader(AS2Header.AS2_TO).getValue()); + assertTrue("Unexpected message id value", + request.getFirstHeader(AS2Header.MESSAGE_ID).getValue().endsWith(CLIENT_FQDN + ">")); + assertEquals("Unexpected target host value", TARGET_HOST + ":" + TARGET_PORT, + request.getFirstHeader(AS2Header.TARGET_HOST).getValue()); + assertEquals("Unexpected user agent value", USER_AGENT, + request.getFirstHeader(AS2Header.USER_AGENT).getValue()); + assertNotNull("Date value missing", request.getFirstHeader(AS2Header.DATE)); + assertNotNull("Content length value missing", request.getFirstHeader(AS2Header.CONTENT_LENGTH)); + assertTrue("Unexpected content type for message", + request.getFirstHeader(AS2Header.CONTENT_TYPE).getValue().startsWith(AS2MimeType.APPLICATION_PKCS7_MIME)); + + assertTrue("Request does not contain entity", request instanceof BasicHttpEntityEnclosingRequest); + HttpEntity entity = ((BasicHttpEntityEnclosingRequest) request).getEntity(); + assertNotNull("Request does not contain entity", entity); + assertTrue("Unexpected request entity type", entity instanceof ApplicationPkcs7MimeCompressedDataEntity); + ApplicationPkcs7MimeCompressedDataEntity compressedDataEntity = (ApplicationPkcs7MimeCompressedDataEntity) entity; + assertTrue("Entity not set as main body of request", compressedDataEntity.isMainBody()); + + // Validated compessed part. + MimeEntity compressedEntity = compressedDataEntity.getCompressedEntity(new ZlibExpanderProvider()); + assertTrue("Enveloped mime part incorrect type ", compressedEntity instanceof ApplicationEDIFACTEntity); + ApplicationEDIFACTEntity ediEntity = (ApplicationEDIFACTEntity) compressedEntity; + assertTrue("Unexpected content type for compressed entity", + ediEntity.getContentType().getValue().startsWith(AS2MediaType.APPLICATION_EDIFACT)); + assertFalse("Compressed entity set as main body of request", ediEntity.isMainBody()); + + } + + + @Test + public void compressedAndSignedMessageTest() throws Exception { + AS2ClientConnection clientConnection = new AS2ClientConnection(AS2_VERSION, USER_AGENT, CLIENT_FQDN, + TARGET_HOST, TARGET_PORT); + AS2ClientManager clientManager = new AS2ClientManager(clientConnection); + + LOG.info("Key Algoritm: " + signingKP.getPrivate().getAlgorithm()); + + HttpCoreContext httpContext = clientManager.send(EDI_MESSAGE, REQUEST_URI, SUBJECT, FROM, AS2_NAME, AS2_NAME, + AS2MessageStructure.SIGNED_COMPRESSED, + ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII), null, + AS2SignatureAlgorithm.SHA256WITHRSA, certList.toArray(new Certificate[0]), signingKP.getPrivate(), AS2CompressionAlgorithm.ZLIB, + DISPOSITION_NOTIFICATION_TO, SIGNED_RECEIPT_MIC_ALGORITHMS, null, + null, null); + + HttpRequest request = httpContext.getRequest(); + assertEquals("Unexpected method value", METHOD, request.getRequestLine().getMethod()); + assertEquals("Unexpected request URI value", REQUEST_URI, request.getRequestLine().getUri()); + assertEquals("Unexpected HTTP version value", HttpVersion.HTTP_1_1, + request.getRequestLine().getProtocolVersion()); + + assertEquals("Unexpected subject value", SUBJECT, request.getFirstHeader(AS2Header.SUBJECT).getValue()); + assertEquals("Unexpected from value", FROM, request.getFirstHeader(AS2Header.FROM).getValue()); + assertEquals("Unexpected AS2 version value", AS2_VERSION, + request.getFirstHeader(AS2Header.AS2_VERSION).getValue()); + assertEquals("Unexpected AS2 from value", AS2_NAME, request.getFirstHeader(AS2Header.AS2_FROM).getValue()); + assertEquals("Unexpected AS2 to value", AS2_NAME, request.getFirstHeader(AS2Header.AS2_TO).getValue()); + assertTrue("Unexpected message id value", + request.getFirstHeader(AS2Header.MESSAGE_ID).getValue().endsWith(CLIENT_FQDN + ">")); + assertEquals("Unexpected target host value", TARGET_HOST + ":" + TARGET_PORT, + request.getFirstHeader(AS2Header.TARGET_HOST).getValue()); + assertEquals("Unexpected user agent value", USER_AGENT, + request.getFirstHeader(AS2Header.USER_AGENT).getValue()); + assertNotNull("Date value missing", request.getFirstHeader(AS2Header.DATE)); + assertNotNull("Content length value missing", request.getFirstHeader(AS2Header.CONTENT_LENGTH)); + assertTrue("Unexpected content type for message", + request.getFirstHeader(AS2Header.CONTENT_TYPE).getValue().startsWith(AS2MimeType.APPLICATION_PKCS7_MIME)); + + assertTrue("Request does not contain entity", request instanceof BasicHttpEntityEnclosingRequest); + HttpEntity entity = ((BasicHttpEntityEnclosingRequest) request).getEntity(); + assertNotNull("Request does not contain entity", entity); + assertTrue("Unexpected request entity type", entity instanceof ApplicationPkcs7MimeCompressedDataEntity); + ApplicationPkcs7MimeCompressedDataEntity compressedDataEntity = (ApplicationPkcs7MimeCompressedDataEntity) entity; + assertTrue("Entity not set as main body of request", compressedDataEntity.isMainBody()); + + // Validated compressed part. + MimeEntity compressedEntity = compressedDataEntity.getCompressedEntity(new ZlibExpanderProvider()); + assertTrue("Enveloped mime part incorrect type ", compressedEntity instanceof MultipartSignedEntity); + MultipartSignedEntity multipartSignedEntity = (MultipartSignedEntity) compressedEntity; + assertTrue("Unexpected content type for compressed entity", + multipartSignedEntity.getContentType().getValue().startsWith(AS2MediaType.MULTIPART_SIGNED)); + assertFalse("Multipart signed entity set as main body of request", multipartSignedEntity.isMainBody()); + assertTrue("Multipart signed entity contains invalid number of mime parts", + multipartSignedEntity.getPartCount() == 2); + + // Validated first mime part. + assertTrue("First mime part incorrect type ", multipartSignedEntity.getPart(0) instanceof ApplicationEDIFACTEntity); + ApplicationEDIFACTEntity ediEntity = (ApplicationEDIFACTEntity) multipartSignedEntity.getPart(0); + assertTrue("Unexpected content type for first mime part", + ediEntity.getContentType().getValue().startsWith(AS2MediaType.APPLICATION_EDIFACT)); + assertFalse("First mime type set as main body of request", ediEntity.isMainBody()); + + // Validate second mime part. + assertTrue("Second mime part incorrect type ", + multipartSignedEntity.getPart(1) instanceof ApplicationPkcs7SignatureEntity); + ApplicationPkcs7SignatureEntity signatureEntity = (ApplicationPkcs7SignatureEntity) multipartSignedEntity.getPart(1); + assertTrue("Unexpected content type for second mime part", + signatureEntity.getContentType().getValue().startsWith(AS2MediaType.APPLICATION_PKCS7_SIGNATURE)); + assertFalse("First mime type set as main body of request", signatureEntity.isMainBody()); + } + + @Test + public void envelopedAndCompressedMessageTest() throws Exception { + AS2ClientConnection clientConnection = new AS2ClientConnection(AS2_VERSION, USER_AGENT, CLIENT_FQDN, + TARGET_HOST, TARGET_PORT); + AS2ClientManager clientManager = new AS2ClientManager(clientConnection); + + LOG.info("Key Algoritm: " + signingKP.getPrivate().getAlgorithm()); + + HttpCoreContext httpContext = clientManager.send(EDI_MESSAGE, REQUEST_URI, SUBJECT, FROM, AS2_NAME, AS2_NAME, + AS2MessageStructure.ENCRYPTED_COMPRESSED, + ContentType.create(AS2MediaType.APPLICATION_EDIFACT, AS2Charset.US_ASCII), null, + null, null, null, AS2CompressionAlgorithm.ZLIB, + DISPOSITION_NOTIFICATION_TO, SIGNED_RECEIPT_MIC_ALGORITHMS, AS2EncryptionAlgorithm.AES128_CBC, + certList.toArray(new Certificate[0]), signingKP.getPrivate()); + + HttpRequest request = httpContext.getRequest(); + assertEquals("Unexpected method value", METHOD, request.getRequestLine().getMethod()); + assertEquals("Unexpected request URI value", REQUEST_URI, request.getRequestLine().getUri()); + assertEquals("Unexpected HTTP version value", HttpVersion.HTTP_1_1, + request.getRequestLine().getProtocolVersion()); + + assertEquals("Unexpected subject value", SUBJECT, request.getFirstHeader(AS2Header.SUBJECT).getValue()); + assertEquals("Unexpected from value", FROM, request.getFirstHeader(AS2Header.FROM).getValue()); + assertEquals("Unexpected AS2 version value", AS2_VERSION, + request.getFirstHeader(AS2Header.AS2_VERSION).getValue()); + assertEquals("Unexpected AS2 from value", AS2_NAME, request.getFirstHeader(AS2Header.AS2_FROM).getValue()); + assertEquals("Unexpected AS2 to value", AS2_NAME, request.getFirstHeader(AS2Header.AS2_TO).getValue()); + assertTrue("Unexpected message id value", + request.getFirstHeader(AS2Header.MESSAGE_ID).getValue().endsWith(CLIENT_FQDN + ">")); + assertEquals("Unexpected target host value", TARGET_HOST + ":" + TARGET_PORT, + request.getFirstHeader(AS2Header.TARGET_HOST).getValue()); + assertEquals("Unexpected user agent value", USER_AGENT, + request.getFirstHeader(AS2Header.USER_AGENT).getValue()); + assertNotNull("Date value missing", request.getFirstHeader(AS2Header.DATE)); + assertNotNull("Content length value missing", request.getFirstHeader(AS2Header.CONTENT_LENGTH)); + assertTrue("Unexpected content type for message", + request.getFirstHeader(AS2Header.CONTENT_TYPE).getValue().startsWith(AS2MimeType.APPLICATION_PKCS7_MIME)); + + assertTrue("Request does not contain entity", request instanceof BasicHttpEntityEnclosingRequest); + HttpEntity entity = ((BasicHttpEntityEnclosingRequest) request).getEntity(); + assertNotNull("Request does not contain entity", entity); + assertTrue("Unexpected request entity type", entity instanceof ApplicationPkcs7MimeEnvelopedDataEntity); + ApplicationPkcs7MimeEnvelopedDataEntity envelopedEntity = (ApplicationPkcs7MimeEnvelopedDataEntity) entity; + assertTrue("Entity not set as main body of request", envelopedEntity.isMainBody()); + + // Validated enveloped part. + MimeEntity encryptedEntity = envelopedEntity.getEncryptedEntity(signingKP.getPrivate()); + assertTrue("Enveloped mime part incorrect type ", encryptedEntity instanceof ApplicationPkcs7MimeCompressedDataEntity); + ApplicationPkcs7MimeCompressedDataEntity compressedDataEntity = (ApplicationPkcs7MimeCompressedDataEntity) encryptedEntity; + assertTrue("Unexpected content type for compressed mime part", + compressedDataEntity.getContentType().getValue().startsWith(AS2MimeType.APPLICATION_PKCS7_MIME)); + assertFalse("Enveloped mime type set as main body of request", compressedDataEntity.isMainBody()); + + // Validated compressed part. + MimeEntity compressedEntity = compressedDataEntity.getCompressedEntity(new ZlibExpanderProvider()); + assertTrue("Enveloped mime part incorrect type ", compressedEntity instanceof ApplicationEDIFACTEntity); + ApplicationEDIFACTEntity ediEntity = (ApplicationEDIFACTEntity) compressedEntity; + assertTrue("Unexpected content type for compressed entity", + ediEntity.getContentType().getValue().startsWith(AS2MediaType.APPLICATION_EDIFACT)); + assertFalse("Compressed entity set as main body of request", ediEntity.isMainBody()); + assertEquals("Unexpected content for enveloped mime part", EDI_MESSAGE.replaceAll("[\n\r]", ""), + ediEntity.getEdiMessage().replaceAll("[\n\r]", "")); + } + + }