This is an automated email from the ASF dual-hosted git repository. gnodet pushed a commit to branch fix/as2-issues in repository https://gitbox.apache.org/repos/asf/camel.git
commit 12b8d724906980def7d34ad28c8a0fe390471d94 Author: Guillaume Nodet <[email protected]> AuthorDate: Mon Mar 9 11:04:53 2026 +0100 CAMEL-23071: Add expectContinue endpoint parameter for AS2 client Add boolean expectContinue parameter to AS2Configuration. When enabled, the client sends Expect: 100-continue header before transmitting the request body, allowing the server to reject the request early. Co-Authored-By: Claude Opus 4.6 <[email protected]> --- .../component/as2/api/AS2ClientConnection.java | 18 +++++++++-- ...rverManagerEndpointConfigurationConfigurer.java | 7 +++++ ...ientManagerEndpointConfigurationConfigurer.java | 7 +++++ .../component/as2/AS2ConfigurationConfigurer.java | 7 +++++ .../camel/component/as2/AS2EndpointConfigurer.java | 7 +++++ .../camel/component/as2/AS2EndpointUriFactory.java | 3 +- ...rverManagerEndpointConfigurationConfigurer.java | 7 +++++ .../org/apache/camel/component/as2/as2.json | 35 +++++++++++----------- .../camel/component/as2/AS2Configuration.java | 16 ++++++++++ .../as2/internal/AS2ConnectionHelper.java | 2 +- 10 files changed, 88 insertions(+), 21 deletions(-) diff --git a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientConnection.java b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientConnection.java index 75c3bf78f5eb..2d2d4bc8f8f5 100644 --- a/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientConnection.java +++ b/components/camel-as2/camel-as2-api/src/main/java/org/apache/camel/component/as2/api/AS2ClientConnection.java @@ -57,6 +57,7 @@ import org.apache.hc.core5.http.protocol.HttpProcessorBuilder; import org.apache.hc.core5.http.protocol.RequestConnControl; import org.apache.hc.core5.http.protocol.RequestContent; import org.apache.hc.core5.http.protocol.RequestDate; +import org.apache.hc.core5.http.protocol.RequestExpectContinue; import org.apache.hc.core5.http.protocol.RequestTargetHost; import org.apache.hc.core5.http.protocol.RequestUserAgent; import org.apache.hc.core5.net.URIAuthority; @@ -80,6 +81,15 @@ public class AS2ClientConnection { Integer targetPortNumber, Duration socketTimeout, Duration connectionTimeout, Integer connectionPoolMaxSize, Duration connectionPoolTtl, SSLContext sslContext, HostnameVerifier hostnameVerifier) throws IOException { + this(as2Version, userAgent, clientFqdn, targetHostName, targetPortNumber, socketTimeout, connectionTimeout, + connectionPoolMaxSize, connectionPoolTtl, sslContext, hostnameVerifier, false); + } + + public AS2ClientConnection(String as2Version, String userAgent, String clientFqdn, String targetHostName, + Integer targetPortNumber, Duration socketTimeout, Duration connectionTimeout, + Integer connectionPoolMaxSize, Duration connectionPoolTtl, + SSLContext sslContext, HostnameVerifier hostnameVerifier, + boolean expectContinue) throws IOException { this.as2Version = ObjectHelper.notNull(as2Version, "as2Version"); this.userAgent = ObjectHelper.notNull(userAgent, "userAgent"); @@ -94,14 +104,18 @@ public class AS2ClientConnection { ObjectHelper.notNull(connectionPoolTtl, "connectionPoolTtl"); // Build Processor - httpProcessor = HttpProcessorBuilder.create() + HttpProcessorBuilder processorBuilder = HttpProcessorBuilder.create() .add(new RequestAS2(as2Version, clientFqdn)) .add(new RequestMDN()) .add(new RequestTargetHost()) .add(new RequestUserAgent(this.userAgent)) .add(new RequestDate()) .add(new RequestContent(true)) - .add(new RequestConnControl()).build(); + .add(new RequestConnControl()); + if (expectContinue) { + processorBuilder.add(new RequestExpectContinue()); + } + httpProcessor = processorBuilder.build(); final Http1Config h1Config = Http1Config.custom().setBufferSize(8 * 1024).build(); diff --git a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2AsyncMDNServerManagerEndpointConfigurationConfigurer.java b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2AsyncMDNServerManagerEndpointConfigurationConfigurer.java index 214852589959..9db61f44f424 100644 --- a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2AsyncMDNServerManagerEndpointConfigurationConfigurer.java +++ b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2AsyncMDNServerManagerEndpointConfigurationConfigurer.java @@ -39,6 +39,7 @@ public class AS2AsyncMDNServerManagerEndpointConfigurationConfigurer extends org map.put("EdiMessageType", java.lang.String.class); map.put("EncryptingAlgorithm", org.apache.camel.component.as2.api.AS2EncryptionAlgorithm.class); map.put("EncryptingCertificateChain", java.security.cert.Certificate[].class); + map.put("ExpectContinue", boolean.class); map.put("From", java.lang.String.class); map.put("HostnameVerifier", javax.net.ssl.HostnameVerifier.class); map.put("HttpConnectionPoolSize", java.lang.Integer.class); @@ -109,6 +110,8 @@ public class AS2AsyncMDNServerManagerEndpointConfigurationConfigurer extends org case "encryptingAlgorithm": target.setEncryptingAlgorithm(property(camelContext, org.apache.camel.component.as2.api.AS2EncryptionAlgorithm.class, value)); return true; case "encryptingcertificatechain": case "encryptingCertificateChain": target.setEncryptingCertificateChain(property(camelContext, java.security.cert.Certificate[].class, value)); return true; + case "expectcontinue": + case "expectContinue": target.setExpectContinue(property(camelContext, boolean.class, value)); return true; case "from": target.setFrom(property(camelContext, java.lang.String.class, value)); return true; case "hostnameverifier": case "hostnameVerifier": target.setHostnameVerifier(property(camelContext, javax.net.ssl.HostnameVerifier.class, value)); return true; @@ -209,6 +212,8 @@ public class AS2AsyncMDNServerManagerEndpointConfigurationConfigurer extends org case "encryptingAlgorithm": return org.apache.camel.component.as2.api.AS2EncryptionAlgorithm.class; case "encryptingcertificatechain": case "encryptingCertificateChain": return java.security.cert.Certificate[].class; + case "expectcontinue": + case "expectContinue": return boolean.class; case "from": return java.lang.String.class; case "hostnameverifier": case "hostnameVerifier": return javax.net.ssl.HostnameVerifier.class; @@ -305,6 +310,8 @@ public class AS2AsyncMDNServerManagerEndpointConfigurationConfigurer extends org case "encryptingAlgorithm": return target.getEncryptingAlgorithm(); case "encryptingcertificatechain": case "encryptingCertificateChain": return target.getEncryptingCertificateChain(); + case "expectcontinue": + case "expectContinue": return target.isExpectContinue(); case "from": return target.getFrom(); case "hostnameverifier": case "hostnameVerifier": return target.getHostnameVerifier(); diff --git a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ClientManagerEndpointConfigurationConfigurer.java b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ClientManagerEndpointConfigurationConfigurer.java index f24e86349b8d..ac5f29f261fd 100644 --- a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ClientManagerEndpointConfigurationConfigurer.java +++ b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ClientManagerEndpointConfigurationConfigurer.java @@ -41,6 +41,7 @@ public class AS2ClientManagerEndpointConfigurationConfigurer extends org.apache. map.put("EdiMessageType", java.lang.String.class); map.put("EncryptingAlgorithm", org.apache.camel.component.as2.api.AS2EncryptionAlgorithm.class); map.put("EncryptingCertificateChain", java.security.cert.Certificate[].class); + map.put("ExpectContinue", boolean.class); map.put("From", java.lang.String.class); map.put("HostnameVerifier", javax.net.ssl.HostnameVerifier.class); map.put("HttpConnectionPoolSize", java.lang.Integer.class); @@ -114,6 +115,8 @@ public class AS2ClientManagerEndpointConfigurationConfigurer extends org.apache. case "encryptingAlgorithm": target.setEncryptingAlgorithm(property(camelContext, org.apache.camel.component.as2.api.AS2EncryptionAlgorithm.class, value)); return true; case "encryptingcertificatechain": case "encryptingCertificateChain": target.setEncryptingCertificateChain(property(camelContext, java.security.cert.Certificate[].class, value)); return true; + case "expectcontinue": + case "expectContinue": target.setExpectContinue(property(camelContext, boolean.class, value)); return true; case "from": target.setFrom(property(camelContext, java.lang.String.class, value)); return true; case "hostnameverifier": case "hostnameVerifier": target.setHostnameVerifier(property(camelContext, javax.net.ssl.HostnameVerifier.class, value)); return true; @@ -216,6 +219,8 @@ public class AS2ClientManagerEndpointConfigurationConfigurer extends org.apache. case "encryptingAlgorithm": return org.apache.camel.component.as2.api.AS2EncryptionAlgorithm.class; case "encryptingcertificatechain": case "encryptingCertificateChain": return java.security.cert.Certificate[].class; + case "expectcontinue": + case "expectContinue": return boolean.class; case "from": return java.lang.String.class; case "hostnameverifier": case "hostnameVerifier": return javax.net.ssl.HostnameVerifier.class; @@ -314,6 +319,8 @@ public class AS2ClientManagerEndpointConfigurationConfigurer extends org.apache. case "encryptingAlgorithm": return target.getEncryptingAlgorithm(); case "encryptingcertificatechain": case "encryptingCertificateChain": return target.getEncryptingCertificateChain(); + case "expectcontinue": + case "expectContinue": return target.isExpectContinue(); case "from": return target.getFrom(); case "hostnameverifier": case "hostnameVerifier": return target.getHostnameVerifier(); diff --git a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ConfigurationConfigurer.java b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ConfigurationConfigurer.java index ae58d63e5403..8e4b26428c01 100644 --- a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ConfigurationConfigurer.java +++ b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ConfigurationConfigurer.java @@ -39,6 +39,7 @@ public class AS2ConfigurationConfigurer extends org.apache.camel.support.compone map.put("EdiMessageType", java.lang.String.class); map.put("EncryptingAlgorithm", org.apache.camel.component.as2.api.AS2EncryptionAlgorithm.class); map.put("EncryptingCertificateChain", java.security.cert.Certificate[].class); + map.put("ExpectContinue", boolean.class); map.put("From", java.lang.String.class); map.put("HostnameVerifier", javax.net.ssl.HostnameVerifier.class); map.put("HttpConnectionPoolSize", java.lang.Integer.class); @@ -108,6 +109,8 @@ public class AS2ConfigurationConfigurer extends org.apache.camel.support.compone case "encryptingAlgorithm": target.setEncryptingAlgorithm(property(camelContext, org.apache.camel.component.as2.api.AS2EncryptionAlgorithm.class, value)); return true; case "encryptingcertificatechain": case "encryptingCertificateChain": target.setEncryptingCertificateChain(property(camelContext, java.security.cert.Certificate[].class, value)); return true; + case "expectcontinue": + case "expectContinue": target.setExpectContinue(property(camelContext, boolean.class, value)); return true; case "from": target.setFrom(property(camelContext, java.lang.String.class, value)); return true; case "hostnameverifier": case "hostnameVerifier": target.setHostnameVerifier(property(camelContext, javax.net.ssl.HostnameVerifier.class, value)); return true; @@ -206,6 +209,8 @@ public class AS2ConfigurationConfigurer extends org.apache.camel.support.compone case "encryptingAlgorithm": return org.apache.camel.component.as2.api.AS2EncryptionAlgorithm.class; case "encryptingcertificatechain": case "encryptingCertificateChain": return java.security.cert.Certificate[].class; + case "expectcontinue": + case "expectContinue": return boolean.class; case "from": return java.lang.String.class; case "hostnameverifier": case "hostnameVerifier": return javax.net.ssl.HostnameVerifier.class; @@ -300,6 +305,8 @@ public class AS2ConfigurationConfigurer extends org.apache.camel.support.compone case "encryptingAlgorithm": return target.getEncryptingAlgorithm(); case "encryptingcertificatechain": case "encryptingCertificateChain": return target.getEncryptingCertificateChain(); + case "expectcontinue": + case "expectContinue": return target.isExpectContinue(); case "from": return target.getFrom(); case "hostnameverifier": case "hostnameVerifier": return target.getHostnameVerifier(); diff --git a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2EndpointConfigurer.java b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2EndpointConfigurer.java index 4de2c44bd707..78c34d6a74fa 100644 --- a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2EndpointConfigurer.java +++ b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2EndpointConfigurer.java @@ -54,6 +54,7 @@ public class AS2EndpointConfigurer extends PropertyConfigurerSupport implements map.put("UserAgent", java.lang.String.class); map.put("ExceptionHandler", org.apache.camel.spi.ExceptionHandler.class); map.put("ExchangePattern", org.apache.camel.ExchangePattern.class); + map.put("ExpectContinue", boolean.class); map.put("LazyStartProducer", boolean.class); map.put("AccessToken", java.lang.String.class); map.put("DecryptingPrivateKey", java.security.PrivateKey.class); @@ -114,6 +115,8 @@ public class AS2EndpointConfigurer extends PropertyConfigurerSupport implements case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true; case "exchangepattern": case "exchangePattern": target.setExchangePattern(property(camelContext, org.apache.camel.ExchangePattern.class, value)); return true; + case "expectcontinue": + case "expectContinue": target.getConfiguration().setExpectContinue(property(camelContext, boolean.class, value)); return true; case "from": target.getConfiguration().setFrom(property(camelContext, java.lang.String.class, value)); return true; case "hostnameverifier": case "hostnameVerifier": target.getConfiguration().setHostnameVerifier(property(camelContext, javax.net.ssl.HostnameVerifier.class, value)); return true; @@ -216,6 +219,8 @@ public class AS2EndpointConfigurer extends PropertyConfigurerSupport implements case "exceptionHandler": return org.apache.camel.spi.ExceptionHandler.class; case "exchangepattern": case "exchangePattern": return org.apache.camel.ExchangePattern.class; + case "expectcontinue": + case "expectContinue": return boolean.class; case "from": return java.lang.String.class; case "hostnameverifier": case "hostnameVerifier": return javax.net.ssl.HostnameVerifier.class; @@ -314,6 +319,8 @@ public class AS2EndpointConfigurer extends PropertyConfigurerSupport implements case "exceptionHandler": return target.getExceptionHandler(); case "exchangepattern": case "exchangePattern": return target.getExchangePattern(); + case "expectcontinue": + case "expectContinue": return target.getConfiguration().isExpectContinue(); case "from": return target.getConfiguration().getFrom(); case "hostnameverifier": case "hostnameVerifier": return target.getConfiguration().getHostnameVerifier(); diff --git a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2EndpointUriFactory.java b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2EndpointUriFactory.java index 96060d107c99..8eb6d43376c4 100644 --- a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2EndpointUriFactory.java +++ b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2EndpointUriFactory.java @@ -23,7 +23,7 @@ public class AS2EndpointUriFactory extends org.apache.camel.support.component.En private static final Set<String> SECRET_PROPERTY_NAMES; private static final Map<String, String> MULTI_VALUE_PREFIXES; static { - Set<String> props = new HashSet<>(52); + Set<String> props = new HashSet<>(53); props.add("accessToken"); props.add("apiName"); props.add("as2From"); @@ -45,6 +45,7 @@ public class AS2EndpointUriFactory extends org.apache.camel.support.component.En props.add("encryptingCertificateChain"); props.add("exceptionHandler"); props.add("exchangePattern"); + props.add("expectContinue"); props.add("from"); props.add("hostnameVerifier"); props.add("httpConnectionPoolSize"); diff --git a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ServerManagerEndpointConfigurationConfigurer.java b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ServerManagerEndpointConfigurationConfigurer.java index dafc031b2986..dc5f7682a064 100644 --- a/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ServerManagerEndpointConfigurationConfigurer.java +++ b/components/camel-as2/camel-as2-component/src/generated/java/org/apache/camel/component/as2/AS2ServerManagerEndpointConfigurationConfigurer.java @@ -39,6 +39,7 @@ public class AS2ServerManagerEndpointConfigurationConfigurer extends org.apache. map.put("EdiMessageType", java.lang.String.class); map.put("EncryptingAlgorithm", org.apache.camel.component.as2.api.AS2EncryptionAlgorithm.class); map.put("EncryptingCertificateChain", java.security.cert.Certificate[].class); + map.put("ExpectContinue", boolean.class); map.put("From", java.lang.String.class); map.put("HostnameVerifier", javax.net.ssl.HostnameVerifier.class); map.put("HttpConnectionPoolSize", java.lang.Integer.class); @@ -109,6 +110,8 @@ public class AS2ServerManagerEndpointConfigurationConfigurer extends org.apache. case "encryptingAlgorithm": target.setEncryptingAlgorithm(property(camelContext, org.apache.camel.component.as2.api.AS2EncryptionAlgorithm.class, value)); return true; case "encryptingcertificatechain": case "encryptingCertificateChain": target.setEncryptingCertificateChain(property(camelContext, java.security.cert.Certificate[].class, value)); return true; + case "expectcontinue": + case "expectContinue": target.setExpectContinue(property(camelContext, boolean.class, value)); return true; case "from": target.setFrom(property(camelContext, java.lang.String.class, value)); return true; case "hostnameverifier": case "hostnameVerifier": target.setHostnameVerifier(property(camelContext, javax.net.ssl.HostnameVerifier.class, value)); return true; @@ -209,6 +212,8 @@ public class AS2ServerManagerEndpointConfigurationConfigurer extends org.apache. case "encryptingAlgorithm": return org.apache.camel.component.as2.api.AS2EncryptionAlgorithm.class; case "encryptingcertificatechain": case "encryptingCertificateChain": return java.security.cert.Certificate[].class; + case "expectcontinue": + case "expectContinue": return boolean.class; case "from": return java.lang.String.class; case "hostnameverifier": case "hostnameVerifier": return javax.net.ssl.HostnameVerifier.class; @@ -305,6 +310,8 @@ public class AS2ServerManagerEndpointConfigurationConfigurer extends org.apache. case "encryptingAlgorithm": return target.getEncryptingAlgorithm(); case "encryptingcertificatechain": case "encryptingCertificateChain": return target.getEncryptingCertificateChain(); + case "expectcontinue": + case "expectContinue": return target.isExpectContinue(); case "from": return target.getFrom(); case "hostnameverifier": case "hostnameVerifier": return target.getHostnameVerifier(); diff --git a/components/camel-as2/camel-as2-component/src/generated/resources/META-INF/org/apache/camel/component/as2/as2.json b/components/camel-as2/camel-as2-component/src/generated/resources/META-INF/org/apache/camel/component/as2/as2.json index 7caadd208337..e101116dd91f 100644 --- a/components/camel-as2/camel-as2-component/src/generated/resources/META-INF/org/apache/camel/component/as2/as2.json +++ b/components/camel-as2/camel-as2-component/src/generated/resources/META-INF/org/apache/camel/component/as2/as2.json @@ -65,23 +65,24 @@ "userAgent": { "index": 29, "kind": "parameter", "displayName": "User Agent", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "Camel AS2 Client Endpoint", "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The value included in the User-Agent message header identifying the AS2 user a [...] "exceptionHandler": { "index": 30, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By de [...] "exchangePattern": { "index": 31, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." }, - "lazyStartProducer": { "index": 32, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...] - "accessToken": { "index": 33, "kind": "parameter", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The access token that is used by the client for bearer authentication." }, - "decryptingPrivateKey": { "index": 34, "kind": "parameter", "displayName": "Decrypting Private Key", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "java.security.PrivateKey", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The key used to encrypt the EDI message." }, - "encryptingAlgorithm": { "index": 35, "kind": "parameter", "displayName": "Encrypting Algorithm", "group": "security", "label": "security", "required": false, "type": "enum", "javaType": "org.apache.camel.component.as2.api.AS2EncryptionAlgorithm", "enum": [ "AES128_CBC", "AES192_CBC", "AES256_CBC", "AES128_CCM", "AES192_CCM", "AES256_CCM", "AES128_GCM", "AES192_GCM", "AES256_GCM", "CAMELLIA128_CBC", "CAMELLIA192_CBC", "CAMELLIA256_CBC", "CAST5_CBC", "DES_CBC", "DES_EDE3_CBC", "GOST28 [...] - "encryptingCertificateChain": { "index": 36, "kind": "parameter", "displayName": "Encrypting Certificate Chain", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "java.security.cert.Certificate[]", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The chain of certificates used to encrypt EDI message." }, - "hostnameVerifier": { "index": 37, "kind": "parameter", "displayName": "Hostname Verifier", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "javax.net.ssl.HostnameVerifier", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "Set hostname verifier for SSL session." }, - "mdnAccessToken": { "index": 38, "kind": "parameter", "displayName": "Mdn Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The access token that is used by the server when it sends an async MDN." }, - "mdnPassword": { "index": 39, "kind": "parameter", "displayName": "Mdn Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The password that is used by the server for basic authentication when it sends an async MDN." }, - "mdnUserName": { "index": 40, "kind": "parameter", "displayName": "Mdn User Name", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The user-name that is used by the server for basic authentication when it sends an async MDN. If options for [...] - "password": { "index": 41, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The password that is used by the client for basic authentication." }, - "signedReceiptMicAlgorithms": { "index": 42, "kind": "parameter", "displayName": "Signed Receipt Mic Algorithms", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The list of algorithms, in order of preference, requested to generate a messa [...] - "signingAlgorithm": { "index": 43, "kind": "parameter", "displayName": "Signing Algorithm", "group": "security", "label": "security", "required": false, "type": "enum", "javaType": "org.apache.camel.component.as2.api.AS2SignatureAlgorithm", "enum": [ "SHA3_224WITHRSA", "SHA3_256WITHRSA", "SHA3_384withRSA", "SHA3_512WITHRSA", "MD5WITHRSA", "SHA1WITHRSA", "MD2WITHRSA", "SHA224WITHRSA", "SHA256WITHRSA", "SHA384WITHRSA", "SHA512WITHRSA", "RIPEMD128WITHRSA", "RIPEMD160WITHRSA", "RIPEMD256 [...] - "signingCertificateChain": { "index": 44, "kind": "parameter", "displayName": "Signing Certificate Chain", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "java.security.cert.Certificate[]", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The chain of certificates used to sign EDI message." }, - "signingPrivateKey": { "index": 45, "kind": "parameter", "displayName": "Signing Private Key", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "java.security.PrivateKey", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The key used to sign the EDI message." }, - "sslContext": { "index": 46, "kind": "parameter", "displayName": "Ssl Context", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "javax.net.ssl.SSLContext", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "Set SSL context for connection to remote server." }, - "userName": { "index": 47, "kind": "parameter", "displayName": "User Name", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The user-name that is used by the client for basic authentication. If options for basic authentication and bearer au [...] - "validateSigningCertificateChain": { "index": 48, "kind": "parameter", "displayName": "Validate Signing Certificate Chain", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "java.security.cert.Certificate[]", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "Certificates to validate the message's signature ag [...] + "expectContinue": { "index": 32, "kind": "parameter", "displayName": "Expect Continue", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "Controls whether the Expect: 100-Continue header is included in outbound AS2 messages. W [...] + "lazyStartProducer": { "index": 33, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...] + "accessToken": { "index": 34, "kind": "parameter", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The access token that is used by the client for bearer authentication." }, + "decryptingPrivateKey": { "index": 35, "kind": "parameter", "displayName": "Decrypting Private Key", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "java.security.PrivateKey", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The key used to encrypt the EDI message." }, + "encryptingAlgorithm": { "index": 36, "kind": "parameter", "displayName": "Encrypting Algorithm", "group": "security", "label": "security", "required": false, "type": "enum", "javaType": "org.apache.camel.component.as2.api.AS2EncryptionAlgorithm", "enum": [ "AES128_CBC", "AES192_CBC", "AES256_CBC", "AES128_CCM", "AES192_CCM", "AES256_CCM", "AES128_GCM", "AES192_GCM", "AES256_GCM", "CAMELLIA128_CBC", "CAMELLIA192_CBC", "CAMELLIA256_CBC", "CAST5_CBC", "DES_CBC", "DES_EDE3_CBC", "GOST28 [...] + "encryptingCertificateChain": { "index": 37, "kind": "parameter", "displayName": "Encrypting Certificate Chain", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "java.security.cert.Certificate[]", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The chain of certificates used to encrypt EDI message." }, + "hostnameVerifier": { "index": 38, "kind": "parameter", "displayName": "Hostname Verifier", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "javax.net.ssl.HostnameVerifier", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "Set hostname verifier for SSL session." }, + "mdnAccessToken": { "index": 39, "kind": "parameter", "displayName": "Mdn Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The access token that is used by the server when it sends an async MDN." }, + "mdnPassword": { "index": 40, "kind": "parameter", "displayName": "Mdn Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The password that is used by the server for basic authentication when it sends an async MDN." }, + "mdnUserName": { "index": 41, "kind": "parameter", "displayName": "Mdn User Name", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The user-name that is used by the server for basic authentication when it sends an async MDN. If options for [...] + "password": { "index": 42, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The password that is used by the client for basic authentication." }, + "signedReceiptMicAlgorithms": { "index": 43, "kind": "parameter", "displayName": "Signed Receipt Mic Algorithms", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The list of algorithms, in order of preference, requested to generate a messa [...] + "signingAlgorithm": { "index": 44, "kind": "parameter", "displayName": "Signing Algorithm", "group": "security", "label": "security", "required": false, "type": "enum", "javaType": "org.apache.camel.component.as2.api.AS2SignatureAlgorithm", "enum": [ "SHA3_224WITHRSA", "SHA3_256WITHRSA", "SHA3_384withRSA", "SHA3_512WITHRSA", "MD5WITHRSA", "SHA1WITHRSA", "MD2WITHRSA", "SHA224WITHRSA", "SHA256WITHRSA", "SHA384WITHRSA", "SHA512WITHRSA", "RIPEMD128WITHRSA", "RIPEMD160WITHRSA", "RIPEMD256 [...] + "signingCertificateChain": { "index": 45, "kind": "parameter", "displayName": "Signing Certificate Chain", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "java.security.cert.Certificate[]", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The chain of certificates used to sign EDI message." }, + "signingPrivateKey": { "index": 46, "kind": "parameter", "displayName": "Signing Private Key", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "java.security.PrivateKey", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The key used to sign the EDI message." }, + "sslContext": { "index": 47, "kind": "parameter", "displayName": "Ssl Context", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "javax.net.ssl.SSLContext", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "Set SSL context for connection to remote server." }, + "userName": { "index": 48, "kind": "parameter", "displayName": "User Name", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "The user-name that is used by the client for basic authentication. If options for basic authentication and bearer au [...] + "validateSigningCertificateChain": { "index": 49, "kind": "parameter", "displayName": "Validate Signing Certificate Chain", "group": "security", "label": "security", "required": false, "type": "object", "javaType": "java.security.cert.Certificate[]", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.as2.AS2Configuration", "configurationField": "configuration", "description": "Certificates to validate the message's signature ag [...] }, "apis": { "client": { "consumerOnly": false, "producerOnly": true, "description": "Sends EDI Messages over HTTP", "methods": { "send": { "description": "Send ediMessage to trading partner", "signatures": [ "org.apache.hc.core5.http.protocol.HttpCoreContext send(Object ediMessage, String requestUri, String subject, String from, String as2From, String as2To, org.apache.camel.component.as2.api.AS2MessageStructure as2MessageStructure, String ediMessageContentType, String ediMessageCharset, String [...] diff --git a/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Configuration.java b/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Configuration.java index 1baa79db7eda..4cb70860cca1 100644 --- a/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Configuration.java +++ b/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/AS2Configuration.java @@ -129,6 +129,8 @@ public class AS2Configuration { private String password; @UriParam(label = "security", secret = true) private String accessToken; + @UriParam(defaultValue = "false", label = "producer") + private boolean expectContinue; @UriParam(label = "security", secret = true) private String mdnUserName; @UriParam(label = "security", secret = true) @@ -620,6 +622,20 @@ public class AS2Configuration { this.accessToken = accessToken; } + public boolean isExpectContinue() { + return expectContinue; + } + + /** + * Controls whether the Expect: 100-Continue header is included in outbound AS2 messages. When enabled, the client + * sends the headers first and waits for a 100 Continue response from the server before sending the message body. + * This can improve efficiency with compatible partners but may cause 3-second delays with servers that don't + * support the protocol. Default is false for backward compatibility. + */ + public void setExpectContinue(boolean expectContinue) { + this.expectContinue = expectContinue; + } + public String getMdnUserName() { return mdnUserName; } diff --git a/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/internal/AS2ConnectionHelper.java b/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/internal/AS2ConnectionHelper.java index c8d405f9982e..e22a54588b78 100644 --- a/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/internal/AS2ConnectionHelper.java +++ b/components/camel-as2/camel-as2-component/src/main/java/org/apache/camel/component/as2/internal/AS2ConnectionHelper.java @@ -58,7 +58,7 @@ public final class AS2ConnectionHelper { configuration.getTargetHostname(), configuration.getTargetPortNumber(), configuration.getHttpSocketTimeout(), configuration.getHttpConnectionTimeout(), configuration.getHttpConnectionPoolSize(), configuration.getHttpConnectionPoolTtl(), configuration.getSslContext(), - configuration.getHostnameVerifier()); + configuration.getHostnameVerifier(), configuration.isExpectContinue()); } /**
