[
https://issues.apache.org/jira/browse/CAMEL-23071?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen updated CAMEL-23071:
--------------------------------
Priority: Minor (was: Major)
> AS2 client should provide endpoint parameter to optionally enable Expect:
> 100-continue
> --------------------------------------------------------------------------------------
>
> Key: CAMEL-23071
> URL: https://issues.apache.org/jira/browse/CAMEL-23071
> Project: Camel
> Issue Type: Improvement
> Components: camel-as2
> Affects Versions: 4.18.0
> Reporter: Reto Peter
> Priority: Minor
>
> h3. Summary
> The Camel AS2 client component has no endpoint parameter to control the
> \{{Expect: 100-continue}} HTTP header behavior. In Camel versions 4.10–4.17,
> \{{RequestExpectContinue}} was hardcoded in the \{{HttpProcessor}} chain with
> no way to disable it, causing a
> 3-second delay per message when the remote server didn't support
> 100-continue. In Camel 4.18.0, the interceptor was silently removed — now
> there is no way to *enable* it either.
> The \{{Expect: 100-continue}} protocol is useful in certain scenarios
> (large payloads, servers that may reject based on headers alone), so this
> should be a configurable option rather than hardcoded on or off.
> h3. History
> || Camel Version || Behavior ||
> | 4.10.x – 4.17.x | \{{RequestExpectContinue}} hardcoded in
> \{{AS2ClientConnection}} HttpProcessor chain — always ON, no option to
> disable |
> | 4.18.0 | \{{RequestExpectContinue}} removed from chain — always OFF, no
> option to enable |
> h3. Problem (Camel 4.10–4.17)
> \{{AS2ClientConnection}} builds its \{{HttpProcessor}} with a hardcoded
> \{{RequestExpectContinue}} interceptor:
> \{code:java|title=AS2ClientConnection.java (Camel 4.17.0)}
> httpProcessor = 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 RequestExpectContinue()) // <-- hardcoded, no option to
> disable
> .add(new RequestConnControl()).build();
> \{code}
> This causes every outbound AS2 message to include the \{{Expect:
> 100-continue}} header. When the remote AS2 server (e.g., OpenAS2) does not
> implement the 100-continue protocol, HttpCore5's \{{HttpRequestExecutor}}
> waits for a \{{100 Continue}} response that never
> comes, timing out after *3 seconds* (\{{DEFAULT_WAIT_FOR_CONTINUE}})
> before sending the message body.
> For high-volume AS2 systems this adds significant latency — e.g., sending
> 100 messages per day wastes 5 minutes just on expect-continue timeouts.
> h3. Current State (Camel 4.18.0)
> \{{RequestExpectContinue}} was removed from the chain entirely:
> \{code:java|title=AS2ClientConnection.java (Camel 4.18.0)}
> httpProcessor = 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();
> // RequestExpectContinue removed — no option to enable
> \{code}
> This fixes the 3-second delay problem but removes the ability to use
> 100-continue for partners that do support it.
> h3. Proposed Fix
> Add a new AS2 endpoint parameter \{{expectContinue}} (default: \{{false}}
> to maintain 4.18.0 behavior):
> \{code:java|title=AS2ClientConnection.java (proposed)}
> HttpProcessorBuilder builder = 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());
> if (expectContinue) {
> builder.add(new RequestExpectContinue());
> }
> httpProcessor = builder.build();
> \{code}
> The parameter should be exposed on the AS2 endpoint configuration so users
> can set it per route:
> \{code}
> as2://client/send?...&expectContinue=true
> \{code}
> h3. Impact
> - *No breaking change* — default \{{false}} preserves current 4.18.0
> behavior
> - Partners that support 100-continue can benefit from it (early rejection,
> bandwidth savings on large payloads)
> - Partners that don't support it (OpenAS2 and others) continue to work
> without the 3-second delay
--
This message was sent by Atlassian Jira
(v8.20.10#820010)