This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch camel-4.4.x
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 2c83de2ef5126b2530c6ab820089ec1883080cf9
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Wed Oct 2 12:36:11 2024 +0200

    CAMEL-21300: camel-platform-http - Consumer should have option to control 
if writing response failing should cause Exchange to fail (#15802)
    
    * CAMEL-21300: camel-platform-http - Consumer should have option to control 
if writing response failing should cause Exchange to fail
---
 .../camel/catalog/components/platform-http.json    | 28 ++++++++-------
 .../http/vertx/VertxPlatformHttpConsumer.java      | 10 ++++++
 .../http/PlatformHttpComponentConfigurer.java      |  6 ++++
 .../http/PlatformHttpEndpointConfigurer.java       |  6 ++++
 .../http/PlatformHttpEndpointUriFactory.java       |  3 +-
 .../component/platform/http/platform-http.json     | 28 ++++++++-------
 .../platform/http/PlatformHttpComponent.java       | 17 +++++++--
 .../platform/http/PlatformHttpEndpoint.java        | 13 +++++++
 .../dsl/PlatformHttpComponentBuilderFactory.java   | 21 +++++++++++
 .../dsl/PlatformHttpEndpointBuilderFactory.java    | 41 ++++++++++++++++++++++
 10 files changed, 143 insertions(+), 30 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 2fc0284f5ba..3a6df1fac5c 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
@@ -24,22 +24,24 @@
   },
   "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 [...]
-    "autowiredEnabled": { "index": 1, "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": 2, "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" }
+    "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" }
   },
   "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'" },
     "consumes": { "index": 1, "kind": "parameter", "displayName": "Consumes", 
"group": "consumer", "label": "consumer", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "The content type this endpoint accepts as an 
input, such as application\/xml or application\/json. null or &#42;\/&#42; mean 
no restriction." },
-    "httpMethodRestrict": { "index": 2, "kind": "parameter", "displayName": 
"Http Method Restrict", "group": "consumer", "label": "consumer", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "A comma separated list of 
HTTP methods to serve, e.g. GET,POST . If no methods are specified, all methods 
will be served." },
-    "matchOnUriPrefix": { "index": 3, "kind": "parameter", "displayName": 
"Match On Uri Prefix", "group": "consumer", "label": "consumer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether or not the consumer should try to find a target consumer by matching 
the URI prefix if no exact match is found." },
-    "muteException": { "index": 4, "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." },
-    "produces": { "index": 5, "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." },
-    "useStreaming": { "index": 6, "kind": "parameter", "displayName": "Use 
Streaming", "group": "consumer", "label": "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": 7, "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": 8, "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 def [...]
-    "exchangePattern": { "index": 9, "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": 10, "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": 11, "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": 12, "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." }
+    "handleWriteResponseError": { "index": 2, "kind": "parameter", 
"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 respons [...]
+    "httpMethodRestrict": { "index": 3, "kind": "parameter", "displayName": 
"Http Method Restrict", "group": "consumer", "label": "consumer", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "A comma separated list of 
HTTP methods to serve, e.g. GET,POST . If no methods are specified, all methods 
will be served." },
+    "matchOnUriPrefix": { "index": 4, "kind": "parameter", "displayName": 
"Match On Uri Prefix", "group": "consumer", "label": "consumer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether or not the consumer should try to find a target consumer by matching 
the URI prefix if no exact match is found." },
+    "muteException": { "index": 5, "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." },
+    "produces": { "index": 6, "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." },
+    "useStreaming": { "index": 7, "kind": "parameter", "displayName": "Use 
Streaming", "group": "consumer", "label": "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": 8, "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": 9, "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 def [...]
+    "exchangePattern": { "index": 10, "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": 11, "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": 12, "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": 13, "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 446811ae9ca..3b433071b3e 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
@@ -70,6 +70,7 @@ public class VertxPlatformHttpConsumer extends 
DefaultConsumer implements Suspen
     private final List<Handler<RoutingContext>> handlers;
     private final String fileNameExtWhitelist;
     private final boolean muteExceptions;
+    private final boolean handleWriteResponseError;
     private Set<Method> methods;
     private String path;
     private Route route;
@@ -85,6 +86,7 @@ public class VertxPlatformHttpConsumer extends 
DefaultConsumer implements Suspen
         this.fileNameExtWhitelist
                 = endpoint.getFileNameExtWhitelist() == null ? null : 
endpoint.getFileNameExtWhitelist().toLowerCase(Locale.US);
         this.muteExceptions = endpoint.isMuteException();
+        this.handleWriteResponseError = endpoint.isHandleWriteResponseError();
     }
 
     @Override
@@ -228,6 +230,14 @@ public class VertxPlatformHttpConsumer extends 
DefaultConsumer implements Suspen
                 "Failed handling platform-http endpoint " + 
getEndpoint().getPath(),
                 failure);
         ctx.fail(failure);
+        if (handleWriteResponseError && failure != null) {
+            Exception existing = exchange.getException();
+            if (existing != null) {
+                failure.addSuppressed(existing);
+            }
+            exchange.setProperty(Exchange.EXCEPTION_CAUGHT, failure);
+            exchange.setException(failure);
+        }
         handleExchangeComplete(exchange);
     }
 
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 18801fe02e8..6c5568838fa 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
@@ -26,6 +26,8 @@ public class PlatformHttpComponentConfigurer extends 
PropertyConfigurerSupport i
         case "bridgeerrorhandler":
         case "bridgeErrorHandler": 
target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); 
return true;
         case "engine": target.setEngine(property(camelContext, 
org.apache.camel.component.platform.http.spi.PlatformHttpEngine.class, value)); 
return true;
+        case "handlewriteresponseerror":
+        case "handleWriteResponseError": 
target.setHandleWriteResponseError(property(camelContext, boolean.class, 
value)); return true;
         default: return false;
         }
     }
@@ -38,6 +40,8 @@ public class PlatformHttpComponentConfigurer extends 
PropertyConfigurerSupport i
         case "bridgeerrorhandler":
         case "bridgeErrorHandler": return boolean.class;
         case "engine": return 
org.apache.camel.component.platform.http.spi.PlatformHttpEngine.class;
+        case "handlewriteresponseerror":
+        case "handleWriteResponseError": return boolean.class;
         default: return null;
         }
     }
@@ -51,6 +55,8 @@ public class PlatformHttpComponentConfigurer extends 
PropertyConfigurerSupport i
         case "bridgeerrorhandler":
         case "bridgeErrorHandler": return target.isBridgeErrorHandler();
         case "engine": return target.getEngine();
+        case "handlewriteresponseerror":
+        case "handleWriteResponseError": return 
target.isHandleWriteResponseError();
         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 6223fdd295b..6ed3f5f9319 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
@@ -30,6 +30,8 @@ public class PlatformHttpEndpointConfigurer extends 
PropertyConfigurerSupport im
         case "exchangePattern": 
target.setExchangePattern(property(camelContext, 
org.apache.camel.ExchangePattern.class, value)); return true;
         case "filenameextwhitelist":
         case "fileNameExtWhitelist": 
target.setFileNameExtWhitelist(property(camelContext, java.lang.String.class, 
value)); return true;
+        case "handlewriteresponseerror":
+        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 "httpmethodrestrict":
@@ -59,6 +61,8 @@ public class PlatformHttpEndpointConfigurer extends 
PropertyConfigurerSupport im
         case "exchangePattern": return org.apache.camel.ExchangePattern.class;
         case "filenameextwhitelist":
         case "fileNameExtWhitelist": return java.lang.String.class;
+        case "handlewriteresponseerror":
+        case "handleWriteResponseError": return boolean.class;
         case "headerfilterstrategy":
         case "headerFilterStrategy": return 
org.apache.camel.spi.HeaderFilterStrategy.class;
         case "httpmethodrestrict":
@@ -89,6 +93,8 @@ public class PlatformHttpEndpointConfigurer extends 
PropertyConfigurerSupport im
         case "exchangePattern": return target.getExchangePattern();
         case "filenameextwhitelist":
         case "fileNameExtWhitelist": return target.getFileNameExtWhitelist();
+        case "handlewriteresponseerror":
+        case "handleWriteResponseError": return 
target.isHandleWriteResponseError();
         case "headerfilterstrategy":
         case "headerFilterStrategy": return target.getHeaderFilterStrategy();
         case "httpmethodrestrict":
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 78a658d5a8a..317998cf804 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
@@ -21,12 +21,13 @@ 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<>(13);
+        Set<String> props = new HashSet<>(14);
         props.add("bridgeErrorHandler");
         props.add("consumes");
         props.add("exceptionHandler");
         props.add("exchangePattern");
         props.add("fileNameExtWhitelist");
+        props.add("handleWriteResponseError");
         props.add("headerFilterStrategy");
         props.add("httpMethodRestrict");
         props.add("matchOnUriPrefix");
diff --git 
a/components/camel-platform-http/src/generated/resources/org/apache/camel/component/platform/http/platform-http.json
 
b/components/camel-platform-http/src/generated/resources/org/apache/camel/component/platform/http/platform-http.json
index 2fc0284f5ba..3a6df1fac5c 100644
--- 
a/components/camel-platform-http/src/generated/resources/org/apache/camel/component/platform/http/platform-http.json
+++ 
b/components/camel-platform-http/src/generated/resources/org/apache/camel/component/platform/http/platform-http.json
@@ -24,22 +24,24 @@
   },
   "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 [...]
-    "autowiredEnabled": { "index": 1, "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": 2, "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" }
+    "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" }
   },
   "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'" },
     "consumes": { "index": 1, "kind": "parameter", "displayName": "Consumes", 
"group": "consumer", "label": "consumer", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "The content type this endpoint accepts as an 
input, such as application\/xml or application\/json. null or &#42;\/&#42; mean 
no restriction." },
-    "httpMethodRestrict": { "index": 2, "kind": "parameter", "displayName": 
"Http Method Restrict", "group": "consumer", "label": "consumer", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "A comma separated list of 
HTTP methods to serve, e.g. GET,POST . If no methods are specified, all methods 
will be served." },
-    "matchOnUriPrefix": { "index": 3, "kind": "parameter", "displayName": 
"Match On Uri Prefix", "group": "consumer", "label": "consumer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether or not the consumer should try to find a target consumer by matching 
the URI prefix if no exact match is found." },
-    "muteException": { "index": 4, "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." },
-    "produces": { "index": 5, "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." },
-    "useStreaming": { "index": 6, "kind": "parameter", "displayName": "Use 
Streaming", "group": "consumer", "label": "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": 7, "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": 8, "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 def [...]
-    "exchangePattern": { "index": 9, "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": 10, "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": 11, "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": 12, "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." }
+    "handleWriteResponseError": { "index": 2, "kind": "parameter", 
"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 respons [...]
+    "httpMethodRestrict": { "index": 3, "kind": "parameter", "displayName": 
"Http Method Restrict", "group": "consumer", "label": "consumer", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "A comma separated list of 
HTTP methods to serve, e.g. GET,POST . If no methods are specified, all methods 
will be served." },
+    "matchOnUriPrefix": { "index": 4, "kind": "parameter", "displayName": 
"Match On Uri Prefix", "group": "consumer", "label": "consumer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether or not the consumer should try to find a target consumer by matching 
the URI prefix if no exact match is found." },
+    "muteException": { "index": 5, "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." },
+    "produces": { "index": 6, "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." },
+    "useStreaming": { "index": 7, "kind": "parameter", "displayName": "Use 
Streaming", "group": "consumer", "label": "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": 8, "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": 9, "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 def [...]
+    "exchangePattern": { "index": 10, "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": 11, "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": 12, "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": 13, "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 72bbd3f91e8..6f1c8bf9c53 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
@@ -54,13 +54,15 @@ public class PlatformHttpComponent extends DefaultComponent 
implements RestConsu
 
     @Metadata(label = "advanced", description = "An HTTP Server engine 
implementation to serve the requests")
     private volatile PlatformHttpEngine engine;
+    @Metadata(label = "advanced,consumer", 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 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;
 
     private final Set<HttpEndpointModel> httpEndpoints = new TreeSet<>();
-
     private final List<PlatformHttpListener> listeners = new ArrayList<>();
-
     private volatile boolean localEngine;
-
     private final Object lock = new Object();
 
     public PlatformHttpComponent() {
@@ -75,6 +77,7 @@ public class PlatformHttpComponent extends DefaultComponent 
implements RestConsu
     protected Endpoint createEndpoint(String uri, String remaining, 
Map<String, Object> parameters) throws Exception {
         PlatformHttpEndpoint endpoint = new PlatformHttpEndpoint(uri, 
remaining, this);
         endpoint.setPlatformHttpEngine(engine);
+        endpoint.setHandleWriteResponseError(handleWriteResponseError);
         setProperties(endpoint, parameters);
         return endpoint;
     }
@@ -181,6 +184,14 @@ public class PlatformHttpComponent extends 
DefaultComponent implements RestConsu
         this.engine = engine;
     }
 
+    public boolean isHandleWriteResponseError() {
+        return handleWriteResponseError;
+    }
+
+    public void setHandleWriteResponseError(boolean handleWriteResponseError) {
+        this.handleWriteResponseError = handleWriteResponseError;
+    }
+
     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 3716e0b0f1f..e2043054ee8 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
@@ -72,6 +72,11 @@ public class PlatformHttpEndpoint extends DefaultEndpoint 
implements AsyncEndpoi
     @UriParam(label = "consumer",
               description = "Whether to use streaming for large requests and 
responses (currently only supported by camel-platform-http-vertx)")
     private boolean useStreaming;
+    @UriParam(label = "advanced,consumer", 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 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;
 
     public PlatformHttpEndpoint(String uri, String remaining, Component 
component) {
         super(uri, component);
@@ -179,6 +184,14 @@ public class PlatformHttpEndpoint extends DefaultEndpoint 
implements AsyncEndpoi
         this.useStreaming = useStreaming;
     }
 
+    public boolean isHandleWriteResponseError() {
+        return handleWriteResponseError;
+    }
+
+    public void setHandleWriteResponseError(boolean handleWriteResponseError) {
+        this.handleWriteResponseError = handleWriteResponseError;
+    }
+
     PlatformHttpEngine getOrCreateEngine() {
         return platformHttpEngine != null
                 ? platformHttpEngine
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 6d13a6ee652..6914eb56d98 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
@@ -79,6 +79,26 @@ public interface PlatformHttpComponentBuilderFactory {
             doSetProperty("bridgeErrorHandler", bridgeErrorHandler);
             return this;
         }
+        /**
+         * 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 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.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: consumer
+         * 
+         * @param handleWriteResponseError the value to set
+         * @return the dsl builder
+         */
+        default PlatformHttpComponentBuilder handleWriteResponseError(
+                boolean handleWriteResponseError) {
+            doSetProperty("handleWriteResponseError", 
handleWriteResponseError);
+            return this;
+        }
         /**
          * Whether autowiring is enabled. This is used for automatic autowiring
          * options (the option must be marked as autowired) by looking up in 
the
@@ -134,6 +154,7 @@ public interface PlatformHttpComponentBuilderFactory {
                 Object value) {
             switch (name) {
             case "bridgeErrorHandler": ((PlatformHttpComponent) 
component).setBridgeErrorHandler((boolean) value); return true;
+            case "handleWriteResponseError": ((PlatformHttpComponent) 
component).setHandleWriteResponseError((boolean) 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;
             default: return false;
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 0a2c2d6e509..a62fee503c8 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
@@ -203,6 +203,47 @@ public interface PlatformHttpEndpointBuilderFactory {
         default PlatformHttpEndpointBuilder basic() {
             return (PlatformHttpEndpointBuilder) this;
         }
+        /**
+         * 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 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.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: consumer
+         * 
+         * @param handleWriteResponseError the value to set
+         * @return the dsl builder
+         */
+        default AdvancedPlatformHttpEndpointBuilder handleWriteResponseError(
+                boolean handleWriteResponseError) {
+            doSetProperty("handleWriteResponseError", 
handleWriteResponseError);
+            return this;
+        }
+        /**
+         * 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 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.
+         * 
+         * The option will be converted to a &lt;code&gt;boolean&lt;/code&gt;
+         * type.
+         * 
+         * Default: false
+         * Group: consumer
+         * 
+         * @param handleWriteResponseError the value to set
+         * @return the dsl builder
+         */
+        default AdvancedPlatformHttpEndpointBuilder handleWriteResponseError(
+                String handleWriteResponseError) {
+            doSetProperty("handleWriteResponseError", 
handleWriteResponseError);
+            return this;
+        }
         /**
          * Allows for bridging the consumer to the Camel routing Error Handler,
          * which mean any exceptions (if possible) occurred while the Camel


Reply via email to