This is an automated email from the ASF dual-hosted git repository.
jamesnetherton pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 262d9d34ded CAMEL-22130: Add requestTimeout option to
camel-platform-http-vertx
262d9d34ded is described below
commit 262d9d34ded597d2bab9b88569122c672391b25b
Author: James Netherton <[email protected]>
AuthorDate: Tue Jun 3 11:16:15 2025 +0100
CAMEL-22130: Add requestTimeout option to camel-platform-http-vertx
---
.../camel/catalog/components/platform-http.json | 28 +++++-----
.../http/vertx/VertxPlatformHttpConsumer.java | 5 ++
.../http/vertx/VertxPlatformHttpSupport.java | 7 +++
.../http/vertx/VertxPlatformHttpEngineTest.java | 63 ++++++++++++++++++++++
.../http/PlatformHttpComponentConfigurer.java | 6 +++
.../http/PlatformHttpEndpointConfigurer.java | 6 +++
.../http/PlatformHttpEndpointUriFactory.java | 3 +-
.../component/platform/http/platform-http.json | 28 +++++-----
.../platform/http/PlatformHttpComponent.java | 12 +++++
.../platform/http/PlatformHttpEndpoint.java | 11 ++++
.../dsl/PlatformHttpComponentBuilderFactory.java | 17 ++++++
.../dsl/PlatformHttpEndpointBuilderFactory.java | 30 +++++++++++
12 files changed, 189 insertions(+), 27 deletions(-)
diff --git
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/platform-http.json
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/platform-http.json
index 2f298227ecc..462c6d0833f 100644
---
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/platform-http.json
+++
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/platform-http.json
@@ -27,9 +27,10 @@
"componentProperties": {
"bridgeErrorHandler": { "index": 0, "kind": "property", "displayName":
"Bridge Error Handler", "group": "consumer", "label": "consumer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Allows for bridging the consumer to the Camel routing Error Handler, which
mean any exceptions (if possible) occurred while the Camel consumer is trying
to pickup incoming messages, or the like [...]
"handleWriteResponseError": { "index": 1, "kind": "property",
"displayName": "Handle Write Response Error", "group": "consumer", "label":
"advanced,consumer", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "When Camel is complete processing the
message, and the HTTP server is writing response. This option controls whether
Camel should catch any failure during writing response [...]
- "autowiredEnabled": { "index": 2, "kind": "property", "displayName":
"Autowired Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether autowiring is enabled. This is used for automatic autowiring options
(the option must be marked as autowired) by looking up in the registry to find
if there is a single instance of matching t [...]
- "engine": { "index": 3, "kind": "property", "displayName": "Engine",
"group": "advanced", "label": "advanced", "required": false, "type": "object",
"javaType": "org.apache.camel.component.platform.http.spi.PlatformHttpEngine",
"deprecated": false, "autowired": false, "secret": false, "description": "An
HTTP Server engine implementation to serve the requests" },
- "headerFilterStrategy": { "index": 4, "kind": "property", "displayName":
"Header Filter Strategy", "group": "filter", "label": "filter", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom
org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel
message." }
+ "requestTimeout": { "index": 2, "kind": "property", "displayName":
"Request Timeout", "group": "consumer", "label": "advanced,consumer",
"required": false, "type": "integer", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "description": "The period in milliseconds
after which the request should be timed out." },
+ "autowiredEnabled": { "index": 3, "kind": "property", "displayName":
"Autowired Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether autowiring is enabled. This is used for automatic autowiring options
(the option must be marked as autowired) by looking up in the registry to find
if there is a single instance of matching t [...]
+ "engine": { "index": 4, "kind": "property", "displayName": "Engine",
"group": "advanced", "label": "advanced", "required": false, "type": "object",
"javaType": "org.apache.camel.component.platform.http.spi.PlatformHttpEngine",
"deprecated": false, "autowired": false, "secret": false, "description": "An
HTTP Server engine implementation to serve the requests" },
+ "headerFilterStrategy": { "index": 5, "kind": "property", "displayName":
"Header Filter Strategy", "group": "filter", "label": "filter", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom
org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel
message." }
},
"properties": {
"path": { "index": 0, "kind": "path", "displayName": "Path", "group":
"consumer", "label": "", "required": true, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired":
false, "secret": false, "description": "The path under which this endpoint
serves the HTTP requests, for proxy use 'proxy'" },
@@ -46,15 +47,16 @@
"muteException": { "index": 11, "kind": "parameter", "displayName": "Mute
Exception", "group": "consumer", "label": "consumer", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": true, "description": "If enabled and an
Exchange failed processing on the consumer side the response's body won't
contain the exception's stack trace." },
"populateBodyWithForm": { "index": 12, "kind": "parameter", "displayName":
"Populate Body With Form", "group": "consumer", "label": "advanced,consumer",
"required": false, "type": "boolean", "javaType": "boolean", "deprecated":
false, "autowired": false, "secret": false, "defaultValue": true,
"description": "Whether to populate the message Body with a Map containing
application\/x-www-form-urlencoded form properties." },
"produces": { "index": 13, "kind": "parameter", "displayName": "Produces",
"group": "consumer", "label": "consumer", "required": false, "type": "string",
"javaType": "java.lang.String", "deprecated": false, "autowired": false,
"secret": false, "description": "The content type this endpoint produces, such
as application\/xml or application\/json." },
- "returnHttpRequestHeaders": { "index": 14, "kind": "parameter",
"displayName": "Return Http Request Headers", "group": "consumer", "label":
"advanced,consumer", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether to include HTTP request headers
(Accept, User-Agent, etc.) into HTTP response produced by this endpoint." },
- "useBodyHandler": { "index": 15, "kind": "parameter", "displayName": "Use
Body Handler", "group": "consumer", "label": "advanced,consumer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether to use BodyHandler for the request. If set to false then the request
will no be read and parsed." },
- "useCookieHandler": { "index": 16, "kind": "parameter", "displayName":
"Use Cookie Handler", "group": "consumer", "label": "advanced,consumer",
"required": false, "type": "boolean", "javaType": "boolean", "deprecated":
false, "autowired": false, "secret": false, "defaultValue": false,
"description": "Whether to enable the Cookie Handler that allows Cookie
addition, expiry, and retrieval (currently only supported by
camel-platform-http-vertx)" },
- "useStreaming": { "index": 17, "kind": "parameter", "displayName": "Use
Streaming", "group": "consumer", "label": "advanced,consumer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether to use streaming for large requests and responses (currently only
supported by camel-platform-http-vertx)" },
- "bridgeErrorHandler": { "index": 18, "kind": "parameter", "displayName":
"Bridge Error Handler", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Allows for bridging the consumer to the
Camel routing Error Handler, which mean any exceptions (if possible) occurred
while the Camel consumer is trying to pickup incoming [...]
- "exceptionHandler": { "index": 19, "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": 20, "kind": "parameter", "displayName":
"Exchange Pattern", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "object", "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." },
- "fileNameExtWhitelist": { "index": 21, "kind": "parameter", "displayName":
"File Name Ext Whitelist", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "autowired": false, "secret": false,
"description": "A comma or whitespace separated list of file extensions.
Uploads having these extensions will be stored locally. Null value or asterisk
() will allow all files." },
- "headerFilterStrategy": { "index": 22, "kind": "parameter", "displayName":
"Header Filter Strategy", "group": "advanced", "label": "advanced", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom HeaderFilterStrategy to
filter headers to and from Camel message." },
- "platformHttpEngine": { "index": 23, "kind": "parameter", "displayName":
"Platform Http Engine", "group": "advanced", "label": "advanced", "required":
false, "type": "object", "javaType":
"org.apache.camel.component.platform.http.spi.PlatformHttpEngine",
"deprecated": false, "autowired": false, "secret": false, "description": "An
HTTP Server engine implementation to serve the requests of this endpoint." }
+ "requestTimeout": { "index": 14, "kind": "parameter", "displayName":
"Request Timeout", "group": "consumer", "label": "advanced,consumer",
"required": false, "type": "integer", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "description": "The period in milliseconds
after which the request should be timed out." },
+ "returnHttpRequestHeaders": { "index": 15, "kind": "parameter",
"displayName": "Return Http Request Headers", "group": "consumer", "label":
"advanced,consumer", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether to include HTTP request headers
(Accept, User-Agent, etc.) into HTTP response produced by this endpoint." },
+ "useBodyHandler": { "index": 16, "kind": "parameter", "displayName": "Use
Body Handler", "group": "consumer", "label": "advanced,consumer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether to use BodyHandler for the request. If set to false then the request
will no be read and parsed." },
+ "useCookieHandler": { "index": 17, "kind": "parameter", "displayName":
"Use Cookie Handler", "group": "consumer", "label": "advanced,consumer",
"required": false, "type": "boolean", "javaType": "boolean", "deprecated":
false, "autowired": false, "secret": false, "defaultValue": false,
"description": "Whether to enable the Cookie Handler that allows Cookie
addition, expiry, and retrieval (currently only supported by
camel-platform-http-vertx)" },
+ "useStreaming": { "index": 18, "kind": "parameter", "displayName": "Use
Streaming", "group": "consumer", "label": "advanced,consumer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether to use streaming for large requests and responses (currently only
supported by camel-platform-http-vertx)" },
+ "bridgeErrorHandler": { "index": 19, "kind": "parameter", "displayName":
"Bridge Error Handler", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Allows for bridging the consumer to the
Camel routing Error Handler, which mean any exceptions (if possible) occurred
while the Camel consumer is trying to pickup incoming [...]
+ "exceptionHandler": { "index": 20, "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": 21, "kind": "parameter", "displayName":
"Exchange Pattern", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "object", "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." },
+ "fileNameExtWhitelist": { "index": 22, "kind": "parameter", "displayName":
"File Name Ext Whitelist", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "autowired": false, "secret": false,
"description": "A comma or whitespace separated list of file extensions.
Uploads having these extensions will be stored locally. Null value or asterisk
() will allow all files." },
+ "headerFilterStrategy": { "index": 23, "kind": "parameter", "displayName":
"Header Filter Strategy", "group": "advanced", "label": "advanced", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom HeaderFilterStrategy to
filter headers to and from Camel message." },
+ "platformHttpEngine": { "index": 24, "kind": "parameter", "displayName":
"Platform Http Engine", "group": "advanced", "label": "advanced", "required":
false, "type": "object", "javaType":
"org.apache.camel.component.platform.http.spi.PlatformHttpEngine",
"deprecated": false, "autowired": false, "secret": false, "description": "An
HTTP Server engine implementation to serve the requests of this endpoint." }
}
}
diff --git
a/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpConsumer.java
b/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpConsumer.java
index 94a17da24c3..2c7b19ca6ba 100644
---
a/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpConsumer.java
+++
b/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpConsumer.java
@@ -37,6 +37,7 @@ import io.vertx.ext.auth.User;
import io.vertx.ext.web.FileUpload;
import io.vertx.ext.web.Route;
import io.vertx.ext.web.RoutingContext;
+import io.vertx.ext.web.handler.TimeoutHandler;
import io.vertx.ext.web.impl.RouteImpl;
import org.apache.camel.Exchange;
import org.apache.camel.ExchangePattern;
@@ -129,6 +130,10 @@ public class VertxPlatformHttpConsumer extends
DefaultConsumer
final Route newRoute = router.route(path);
+ if (getEndpoint().getRequestTimeout() > 0) {
+
newRoute.handler(TimeoutHandler.create(getEndpoint().getRequestTimeout()));
+ }
+
if
(getEndpoint().getCamelContext().getRestConfiguration().isEnableCORS() &&
getEndpoint().getConsumes() != null) {
((RouteImpl) newRoute).setEmptyBodyPermittedWithConsumes(true);
}
diff --git
a/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpSupport.java
b/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpSupport.java
index 7862c12185c..d084778a578 100644
---
a/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpSupport.java
+++
b/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpSupport.java
@@ -176,6 +176,13 @@ public final class VertxPlatformHttpSupport {
static Future<Void> writeResponse(
RoutingContext ctx, Exchange camelExchange, HeaderFilterStrategy
headerFilterStrategy, boolean muteExceptions) {
final Promise<Void> promise = Promise.promise();
+
+ // Nothing to do if the response is already ended due to request
timeout etc
+ if (ctx.response().ended()) {
+ promise.complete();
+ return promise.future();
+ }
+
try {
final Object body = toHttpResponse(ctx,
camelExchange.getMessage(), headerFilterStrategy, muteExceptions);
if (body == null) {
diff --git
a/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpEngineTest.java
b/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpEngineTest.java
index bb989a32874..e9d6575d42b 100644
---
a/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpEngineTest.java
+++
b/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpEngineTest.java
@@ -224,6 +224,69 @@ public class VertxPlatformHttpEngineTest {
}
}
+ @Test
+ public void testSlowConsumerWithTimeout() throws Exception {
+ final CamelContext context = createCamelContext();
+
+ try {
+ context.getRegistry().bind(
+ "vertx-options",
+ new VertxOptions()
+ .setMaxEventLoopExecuteTime(2)
+ .setMaxEventLoopExecuteTimeUnit(TimeUnit.SECONDS));
+
+ context.addRoutes(new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("platform-http:/get?requestTimeout=500")
+ .routeId("get")
+ .delay(1000)
+ .setBody().constant("get");
+ }
+ });
+
+ context.start();
+
+ given()
+ .when()
+ .get("/get")
+ .then()
+ .statusCode(503);
+
+ } finally {
+ context.stop();
+ }
+ }
+
+ @Test
+ public void testTimeoutNotExceeded() throws Exception {
+ final CamelContext context = createCamelContext();
+
+ String response = "Request did not time out";
+ try {
+ context.addRoutes(new RouteBuilder() {
+ @Override
+ public void configure() {
+ from("platform-http:/get?requestTimeout=500")
+ .routeId("get")
+ .setBody().constant(response);
+ }
+ });
+
+ context.start();
+
+ given()
+ .when()
+ .get("/get")
+ .then()
+ .statusCode(200)
+ .body(equalTo(response));
+
+ } finally {
+ context.stop();
+ }
+ }
+
@Test
public void testFailingConsumer() throws Exception {
final CamelContext context = createCamelContext();
diff --git
a/components/camel-platform-http/src/generated/java/org/apache/camel/component/platform/http/PlatformHttpComponentConfigurer.java
b/components/camel-platform-http/src/generated/java/org/apache/camel/component/platform/http/PlatformHttpComponentConfigurer.java
index 6bac3f77b8e..72a4a7d45dc 100644
---
a/components/camel-platform-http/src/generated/java/org/apache/camel/component/platform/http/PlatformHttpComponentConfigurer.java
+++
b/components/camel-platform-http/src/generated/java/org/apache/camel/component/platform/http/PlatformHttpComponentConfigurer.java
@@ -32,6 +32,8 @@ public class PlatformHttpComponentConfigurer extends
PropertyConfigurerSupport i
case "handleWriteResponseError":
target.setHandleWriteResponseError(property(camelContext, boolean.class,
value)); return true;
case "headerfilterstrategy":
case "headerFilterStrategy":
target.setHeaderFilterStrategy(property(camelContext,
org.apache.camel.spi.HeaderFilterStrategy.class, value)); return true;
+ case "requesttimeout":
+ case "requestTimeout": target.setRequestTimeout(property(camelContext,
long.class, value)); return true;
default: return false;
}
}
@@ -48,6 +50,8 @@ public class PlatformHttpComponentConfigurer extends
PropertyConfigurerSupport i
case "handleWriteResponseError": return boolean.class;
case "headerfilterstrategy":
case "headerFilterStrategy": return
org.apache.camel.spi.HeaderFilterStrategy.class;
+ case "requesttimeout":
+ case "requestTimeout": return long.class;
default: return null;
}
}
@@ -65,6 +69,8 @@ public class PlatformHttpComponentConfigurer extends
PropertyConfigurerSupport i
case "handleWriteResponseError": return
target.isHandleWriteResponseError();
case "headerfilterstrategy":
case "headerFilterStrategy": return target.getHeaderFilterStrategy();
+ case "requesttimeout":
+ case "requestTimeout": return target.getRequestTimeout();
default: return null;
}
}
diff --git
a/components/camel-platform-http/src/generated/java/org/apache/camel/component/platform/http/PlatformHttpEndpointConfigurer.java
b/components/camel-platform-http/src/generated/java/org/apache/camel/component/platform/http/PlatformHttpEndpointConfigurer.java
index 1d419ff5be5..e868a274208 100644
---
a/components/camel-platform-http/src/generated/java/org/apache/camel/component/platform/http/PlatformHttpEndpointConfigurer.java
+++
b/components/camel-platform-http/src/generated/java/org/apache/camel/component/platform/http/PlatformHttpEndpointConfigurer.java
@@ -59,6 +59,8 @@ public class PlatformHttpEndpointConfigurer extends
PropertyConfigurerSupport im
case "populatebodywithform":
case "populateBodyWithForm":
target.setPopulateBodyWithForm(property(camelContext, boolean.class, value));
return true;
case "produces": target.setProduces(property(camelContext,
java.lang.String.class, value)); return true;
+ case "requesttimeout":
+ case "requestTimeout": target.setRequestTimeout(property(camelContext,
long.class, value)); return true;
case "returnhttprequestheaders":
case "returnHttpRequestHeaders":
target.setReturnHttpRequestHeaders(property(camelContext, boolean.class,
value)); return true;
case "usebodyhandler":
@@ -110,6 +112,8 @@ public class PlatformHttpEndpointConfigurer extends
PropertyConfigurerSupport im
case "populatebodywithform":
case "populateBodyWithForm": return boolean.class;
case "produces": return java.lang.String.class;
+ case "requesttimeout":
+ case "requestTimeout": return long.class;
case "returnhttprequestheaders":
case "returnHttpRequestHeaders": return boolean.class;
case "usebodyhandler":
@@ -162,6 +166,8 @@ public class PlatformHttpEndpointConfigurer extends
PropertyConfigurerSupport im
case "populatebodywithform":
case "populateBodyWithForm": return target.isPopulateBodyWithForm();
case "produces": return target.getProduces();
+ case "requesttimeout":
+ case "requestTimeout": return target.getRequestTimeout();
case "returnhttprequestheaders":
case "returnHttpRequestHeaders": return
target.isReturnHttpRequestHeaders();
case "usebodyhandler":
diff --git
a/components/camel-platform-http/src/generated/java/org/apache/camel/component/platform/http/PlatformHttpEndpointUriFactory.java
b/components/camel-platform-http/src/generated/java/org/apache/camel/component/platform/http/PlatformHttpEndpointUriFactory.java
index feb2ab4bf49..349c9878934 100644
---
a/components/camel-platform-http/src/generated/java/org/apache/camel/component/platform/http/PlatformHttpEndpointUriFactory.java
+++
b/components/camel-platform-http/src/generated/java/org/apache/camel/component/platform/http/PlatformHttpEndpointUriFactory.java
@@ -23,7 +23,7 @@ public class PlatformHttpEndpointUriFactory extends
org.apache.camel.support.com
private static final Set<String> SECRET_PROPERTY_NAMES;
private static final Set<String> MULTI_VALUE_PREFIXES;
static {
- Set<String> props = new HashSet<>(24);
+ Set<String> props = new HashSet<>(25);
props.add("bridgeErrorHandler");
props.add("consumes");
props.add("cookieDomain");
@@ -44,6 +44,7 @@ public class PlatformHttpEndpointUriFactory extends
org.apache.camel.support.com
props.add("platformHttpEngine");
props.add("populateBodyWithForm");
props.add("produces");
+ props.add("requestTimeout");
props.add("returnHttpRequestHeaders");
props.add("useBodyHandler");
props.add("useCookieHandler");
diff --git
a/components/camel-platform-http/src/generated/resources/META-INF/org/apache/camel/component/platform/http/platform-http.json
b/components/camel-platform-http/src/generated/resources/META-INF/org/apache/camel/component/platform/http/platform-http.json
index 2f298227ecc..462c6d0833f 100644
---
a/components/camel-platform-http/src/generated/resources/META-INF/org/apache/camel/component/platform/http/platform-http.json
+++
b/components/camel-platform-http/src/generated/resources/META-INF/org/apache/camel/component/platform/http/platform-http.json
@@ -27,9 +27,10 @@
"componentProperties": {
"bridgeErrorHandler": { "index": 0, "kind": "property", "displayName":
"Bridge Error Handler", "group": "consumer", "label": "consumer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Allows for bridging the consumer to the Camel routing Error Handler, which
mean any exceptions (if possible) occurred while the Camel consumer is trying
to pickup incoming messages, or the like [...]
"handleWriteResponseError": { "index": 1, "kind": "property",
"displayName": "Handle Write Response Error", "group": "consumer", "label":
"advanced,consumer", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "When Camel is complete processing the
message, and the HTTP server is writing response. This option controls whether
Camel should catch any failure during writing response [...]
- "autowiredEnabled": { "index": 2, "kind": "property", "displayName":
"Autowired Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether autowiring is enabled. This is used for automatic autowiring options
(the option must be marked as autowired) by looking up in the registry to find
if there is a single instance of matching t [...]
- "engine": { "index": 3, "kind": "property", "displayName": "Engine",
"group": "advanced", "label": "advanced", "required": false, "type": "object",
"javaType": "org.apache.camel.component.platform.http.spi.PlatformHttpEngine",
"deprecated": false, "autowired": false, "secret": false, "description": "An
HTTP Server engine implementation to serve the requests" },
- "headerFilterStrategy": { "index": 4, "kind": "property", "displayName":
"Header Filter Strategy", "group": "filter", "label": "filter", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom
org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel
message." }
+ "requestTimeout": { "index": 2, "kind": "property", "displayName":
"Request Timeout", "group": "consumer", "label": "advanced,consumer",
"required": false, "type": "integer", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "description": "The period in milliseconds
after which the request should be timed out." },
+ "autowiredEnabled": { "index": 3, "kind": "property", "displayName":
"Autowired Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether autowiring is enabled. This is used for automatic autowiring options
(the option must be marked as autowired) by looking up in the registry to find
if there is a single instance of matching t [...]
+ "engine": { "index": 4, "kind": "property", "displayName": "Engine",
"group": "advanced", "label": "advanced", "required": false, "type": "object",
"javaType": "org.apache.camel.component.platform.http.spi.PlatformHttpEngine",
"deprecated": false, "autowired": false, "secret": false, "description": "An
HTTP Server engine implementation to serve the requests" },
+ "headerFilterStrategy": { "index": 5, "kind": "property", "displayName":
"Header Filter Strategy", "group": "filter", "label": "filter", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom
org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel
message." }
},
"properties": {
"path": { "index": 0, "kind": "path", "displayName": "Path", "group":
"consumer", "label": "", "required": true, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "deprecationNote": "", "autowired":
false, "secret": false, "description": "The path under which this endpoint
serves the HTTP requests, for proxy use 'proxy'" },
@@ -46,15 +47,16 @@
"muteException": { "index": 11, "kind": "parameter", "displayName": "Mute
Exception", "group": "consumer", "label": "consumer", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": true, "description": "If enabled and an
Exchange failed processing on the consumer side the response's body won't
contain the exception's stack trace." },
"populateBodyWithForm": { "index": 12, "kind": "parameter", "displayName":
"Populate Body With Form", "group": "consumer", "label": "advanced,consumer",
"required": false, "type": "boolean", "javaType": "boolean", "deprecated":
false, "autowired": false, "secret": false, "defaultValue": true,
"description": "Whether to populate the message Body with a Map containing
application\/x-www-form-urlencoded form properties." },
"produces": { "index": 13, "kind": "parameter", "displayName": "Produces",
"group": "consumer", "label": "consumer", "required": false, "type": "string",
"javaType": "java.lang.String", "deprecated": false, "autowired": false,
"secret": false, "description": "The content type this endpoint produces, such
as application\/xml or application\/json." },
- "returnHttpRequestHeaders": { "index": 14, "kind": "parameter",
"displayName": "Return Http Request Headers", "group": "consumer", "label":
"advanced,consumer", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether to include HTTP request headers
(Accept, User-Agent, etc.) into HTTP response produced by this endpoint." },
- "useBodyHandler": { "index": 15, "kind": "parameter", "displayName": "Use
Body Handler", "group": "consumer", "label": "advanced,consumer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether to use BodyHandler for the request. If set to false then the request
will no be read and parsed." },
- "useCookieHandler": { "index": 16, "kind": "parameter", "displayName":
"Use Cookie Handler", "group": "consumer", "label": "advanced,consumer",
"required": false, "type": "boolean", "javaType": "boolean", "deprecated":
false, "autowired": false, "secret": false, "defaultValue": false,
"description": "Whether to enable the Cookie Handler that allows Cookie
addition, expiry, and retrieval (currently only supported by
camel-platform-http-vertx)" },
- "useStreaming": { "index": 17, "kind": "parameter", "displayName": "Use
Streaming", "group": "consumer", "label": "advanced,consumer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether to use streaming for large requests and responses (currently only
supported by camel-platform-http-vertx)" },
- "bridgeErrorHandler": { "index": 18, "kind": "parameter", "displayName":
"Bridge Error Handler", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Allows for bridging the consumer to the
Camel routing Error Handler, which mean any exceptions (if possible) occurred
while the Camel consumer is trying to pickup incoming [...]
- "exceptionHandler": { "index": 19, "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": 20, "kind": "parameter", "displayName":
"Exchange Pattern", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "object", "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." },
- "fileNameExtWhitelist": { "index": 21, "kind": "parameter", "displayName":
"File Name Ext Whitelist", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "autowired": false, "secret": false,
"description": "A comma or whitespace separated list of file extensions.
Uploads having these extensions will be stored locally. Null value or asterisk
() will allow all files." },
- "headerFilterStrategy": { "index": 22, "kind": "parameter", "displayName":
"Header Filter Strategy", "group": "advanced", "label": "advanced", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom HeaderFilterStrategy to
filter headers to and from Camel message." },
- "platformHttpEngine": { "index": 23, "kind": "parameter", "displayName":
"Platform Http Engine", "group": "advanced", "label": "advanced", "required":
false, "type": "object", "javaType":
"org.apache.camel.component.platform.http.spi.PlatformHttpEngine",
"deprecated": false, "autowired": false, "secret": false, "description": "An
HTTP Server engine implementation to serve the requests of this endpoint." }
+ "requestTimeout": { "index": 14, "kind": "parameter", "displayName":
"Request Timeout", "group": "consumer", "label": "advanced,consumer",
"required": false, "type": "integer", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "description": "The period in milliseconds
after which the request should be timed out." },
+ "returnHttpRequestHeaders": { "index": 15, "kind": "parameter",
"displayName": "Return Http Request Headers", "group": "consumer", "label":
"advanced,consumer", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Whether to include HTTP request headers
(Accept, User-Agent, etc.) into HTTP response produced by this endpoint." },
+ "useBodyHandler": { "index": 16, "kind": "parameter", "displayName": "Use
Body Handler", "group": "consumer", "label": "advanced,consumer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": true, "description":
"Whether to use BodyHandler for the request. If set to false then the request
will no be read and parsed." },
+ "useCookieHandler": { "index": 17, "kind": "parameter", "displayName":
"Use Cookie Handler", "group": "consumer", "label": "advanced,consumer",
"required": false, "type": "boolean", "javaType": "boolean", "deprecated":
false, "autowired": false, "secret": false, "defaultValue": false,
"description": "Whether to enable the Cookie Handler that allows Cookie
addition, expiry, and retrieval (currently only supported by
camel-platform-http-vertx)" },
+ "useStreaming": { "index": 18, "kind": "parameter", "displayName": "Use
Streaming", "group": "consumer", "label": "advanced,consumer", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether to use streaming for large requests and responses (currently only
supported by camel-platform-http-vertx)" },
+ "bridgeErrorHandler": { "index": 19, "kind": "parameter", "displayName":
"Bridge Error Handler", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "boolean", "javaType":
"boolean", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": false, "description": "Allows for bridging the consumer to the
Camel routing Error Handler, which mean any exceptions (if possible) occurred
while the Camel consumer is trying to pickup incoming [...]
+ "exceptionHandler": { "index": 20, "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": 21, "kind": "parameter", "displayName":
"Exchange Pattern", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "object", "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." },
+ "fileNameExtWhitelist": { "index": 22, "kind": "parameter", "displayName":
"File Name Ext Whitelist", "group": "consumer (advanced)", "label":
"consumer,advanced", "required": false, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "autowired": false, "secret": false,
"description": "A comma or whitespace separated list of file extensions.
Uploads having these extensions will be stored locally. Null value or asterisk
() will allow all files." },
+ "headerFilterStrategy": { "index": 23, "kind": "parameter", "displayName":
"Header Filter Strategy", "group": "advanced", "label": "advanced", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom HeaderFilterStrategy to
filter headers to and from Camel message." },
+ "platformHttpEngine": { "index": 24, "kind": "parameter", "displayName":
"Platform Http Engine", "group": "advanced", "label": "advanced", "required":
false, "type": "object", "javaType":
"org.apache.camel.component.platform.http.spi.PlatformHttpEngine",
"deprecated": false, "autowired": false, "secret": false, "description": "An
HTTP Server engine implementation to serve the requests of this endpoint." }
}
}
diff --git
a/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/PlatformHttpComponent.java
b/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/PlatformHttpComponent.java
index ef551a891a7..00abe1cf0f4 100644
---
a/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/PlatformHttpComponent.java
+++
b/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/PlatformHttpComponent.java
@@ -61,6 +61,9 @@ public class PlatformHttpComponent extends
HeaderFilterStrategyComponent
+ " should catch any failure during writing
response and store this on the Exchange, which allows onCompletion/UnitOfWork
to"
+ " regard the Exchange as failed and have access
to the caused exception from the HTTP server.")
private boolean handleWriteResponseError;
+ @Metadata(label = "advanced,consumer",
+ description = "The period in milliseconds after which the
request should be timed out.")
+ private long requestTimeout;
private final Set<HttpEndpointModel> httpEndpoints = new TreeSet<>();
private final Set<HttpEndpointModel> httpManagementEndpoints = new
TreeSet<>();
@@ -80,6 +83,7 @@ public class PlatformHttpComponent extends
HeaderFilterStrategyComponent
PlatformHttpEndpoint endpoint = new PlatformHttpEndpoint(uri,
remaining, this);
endpoint.setPlatformHttpEngine(engine);
endpoint.setHandleWriteResponseError(handleWriteResponseError);
+ endpoint.setRequestTimeout(requestTimeout);
setEndpointHeaderFilterStrategy(endpoint);
setProperties(endpoint, parameters);
return endpoint;
@@ -236,6 +240,14 @@ public class PlatformHttpComponent extends
HeaderFilterStrategyComponent
this.handleWriteResponseError = handleWriteResponseError;
}
+ public long getRequestTimeout() {
+ return requestTimeout;
+ }
+
+ public void setRequestTimeout(long requestTimeout) {
+ this.requestTimeout = requestTimeout;
+ }
+
private Consumer doCreateConsumer(
CamelContext camelContext, Processor processor, String verb,
String basePath,
String uriTemplate,
diff --git
a/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/PlatformHttpEndpoint.java
b/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/PlatformHttpEndpoint.java
index 529154fc37b..c2b729e1eaa 100644
---
a/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/PlatformHttpEndpoint.java
+++
b/components/camel-platform-http/src/main/java/org/apache/camel/component/platform/http/PlatformHttpEndpoint.java
@@ -133,6 +133,9 @@ public class PlatformHttpEndpoint extends DefaultEndpoint
@UriParam(label = "advanced,consumer", defaultValue = "true",
description = "Whether to use BodyHandler for the request. If
set to false then the request will no be read and parsed.")
private boolean useBodyHandler = true;
+ @UriParam(label = "advanced,consumer",
+ description = "The period in milliseconds after which the
request should be timed out.")
+ private long requestTimeout;
public PlatformHttpEndpoint(String uri, String remaining, Component
component) {
super(uri, component);
@@ -333,4 +336,12 @@ public class PlatformHttpEndpoint extends DefaultEndpoint
public void setUseBodyHandler(final boolean useBodyHandler) {
this.useBodyHandler = useBodyHandler;
}
+
+ public long getRequestTimeout() {
+ return requestTimeout;
+ }
+
+ public void setRequestTimeout(long requestTimeout) {
+ this.requestTimeout = requestTimeout;
+ }
}
diff --git
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/PlatformHttpComponentBuilderFactory.java
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/PlatformHttpComponentBuilderFactory.java
index 518054d750a..0bbda8aae1a 100644
---
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/PlatformHttpComponentBuilderFactory.java
+++
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/PlatformHttpComponentBuilderFactory.java
@@ -101,6 +101,22 @@ public interface PlatformHttpComponentBuilderFactory {
return this;
}
+ /**
+ * The period in milliseconds after which the request should be timed
+ * out.
+ *
+ * The option is a: <code>long</code> type.
+ *
+ * Group: consumer
+ *
+ * @param requestTimeout the value to set
+ * @return the dsl builder
+ */
+ default PlatformHttpComponentBuilder requestTimeout(long
requestTimeout) {
+ doSetProperty("requestTimeout", requestTimeout);
+ return this;
+ }
+
/**
* Whether autowiring is enabled. This is used for automatic autowiring
@@ -173,6 +189,7 @@ public interface PlatformHttpComponentBuilderFactory {
switch (name) {
case "bridgeErrorHandler": ((PlatformHttpComponent)
component).setBridgeErrorHandler((boolean) value); return true;
case "handleWriteResponseError": ((PlatformHttpComponent)
component).setHandleWriteResponseError((boolean) value); return true;
+ case "requestTimeout": ((PlatformHttpComponent)
component).setRequestTimeout((long) value); return true;
case "autowiredEnabled": ((PlatformHttpComponent)
component).setAutowiredEnabled((boolean) value); return true;
case "engine": ((PlatformHttpComponent)
component).setEngine((org.apache.camel.component.platform.http.spi.PlatformHttpEngine)
value); return true;
case "headerFilterStrategy": ((PlatformHttpComponent)
component).setHeaderFilterStrategy((org.apache.camel.spi.HeaderFilterStrategy)
value); return true;
diff --git
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/PlatformHttpEndpointBuilderFactory.java
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/PlatformHttpEndpointBuilderFactory.java
index dc1633ce15e..4e6fac70e66 100644
---
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/PlatformHttpEndpointBuilderFactory.java
+++
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/PlatformHttpEndpointBuilderFactory.java
@@ -393,6 +393,36 @@ public interface PlatformHttpEndpointBuilderFactory {
doSetProperty("populateBodyWithForm", populateBodyWithForm);
return this;
}
+ /**
+ * The period in milliseconds after which the request should be timed
+ * out.
+ *
+ * The option is a: <code>long</code> type.
+ *
+ * Group: consumer
+ *
+ * @param requestTimeout the value to set
+ * @return the dsl builder
+ */
+ default AdvancedPlatformHttpEndpointBuilder requestTimeout(long
requestTimeout) {
+ doSetProperty("requestTimeout", requestTimeout);
+ return this;
+ }
+ /**
+ * The period in milliseconds after which the request should be timed
+ * out.
+ *
+ * The option will be converted to a <code>long</code> type.
+ *
+ * Group: consumer
+ *
+ * @param requestTimeout the value to set
+ * @return the dsl builder
+ */
+ default AdvancedPlatformHttpEndpointBuilder requestTimeout(String
requestTimeout) {
+ doSetProperty("requestTimeout", requestTimeout);
+ return this;
+ }
/**
* Whether to include HTTP request headers (Accept, User-Agent, etc.)
* into HTTP response produced by this endpoint.