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());
     }
 
     /**


Reply via email to