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

davsclaus 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 4ec7639bc8cf CAMEL-24184: Fix 19 medium-severity findings from 
camel-cxf code review
4ec7639bc8cf is described below

commit 4ec7639bc8cf84fd5f3bf8074c5da20a3ba5f963
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Jul 20 15:17:38 2026 +0200

    CAMEL-24184: Fix 19 medium-severity findings from camel-cxf code review
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
---
 .../cxf/common/header/CxfHeaderHelper.java         | 11 ++--
 .../camel/component/cxf/jaxrs/CxfConverter.java    |  4 ++
 .../camel/component/cxf/jaxrs/CxfRsInvoker.java    |  2 +-
 .../camel/component/cxf/jaxrs/CxfRsProducer.java   | 18 ++++++-
 .../component/cxf/jaxrs/DefaultCxfRsBinding.java   | 11 ++--
 .../jaxrs/SubResourceClassInvocationHandler.java   |  2 +-
 .../component/cxf/jaxws/CxfClientCallback.java     |  4 +-
 .../camel/component/cxf/jaxws/CxfEndpoint.java     |  2 +-
 .../component/cxf/jaxws/DefaultCxfBinding.java     | 12 +++--
 .../cxf/spring/jaxrs/CxfRsSpringEndpoint.java      | 18 +++++--
 .../spring/jaxrs/SpringJAXRSServerFactoryBean.java | 10 ++++
 .../cxf/spring/jaxws/CxfSpringEndpoint.java        | 58 +++++++++++-----------
 .../component/cxf/transport/CamelConduit.java      |  7 ++-
 .../component/cxf/transport/CamelOutputStream.java | 16 ++++--
 .../transport/message/DefaultCxfMessageMapper.java |  3 +-
 15 files changed, 123 insertions(+), 55 deletions(-)

diff --git 
a/components/camel-cxf/camel-cxf-common/src/main/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelper.java
 
b/components/camel-cxf/camel-cxf-common/src/main/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelper.java
index 5daf623add20..8552309c5810 100644
--- 
a/components/camel-cxf/camel-cxf-common/src/main/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelper.java
+++ 
b/components/camel-cxf/camel-cxf-common/src/main/java/org/apache/camel/component/cxf/common/header/CxfHeaderHelper.java
@@ -104,7 +104,12 @@ public final class CxfHeaderHelper {
 
             LOG.trace("Propagate Camel header: {}={} as {}", entry.getKey(), 
entry.getValue(), cxfHeaderName);
 
-            requestHeaders.put(cxfHeaderName, 
Arrays.asList(entry.getValue().toString()));
+            Object values = entry.getValue();
+            if (values instanceof List<?>) {
+                requestHeaders.put(cxfHeaderName, CastUtils.cast((List<?>) 
values, String.class));
+            } else {
+                requestHeaders.put(cxfHeaderName, 
Arrays.asList(values.toString()));
+            }
         });
     }
 
@@ -191,8 +196,8 @@ public final class CxfHeaderHelper {
 
             LOG.trace("Populate external header: {}={} as {}", entry.getKey(), 
entry.getValue(), camelHeaderName);
             if (!camelHeaderName.startsWith(":")) {
-                ///* Ignore HTTP/2 pseudo headers such as :status */
-                camelHeaders.put(camelHeaderName, entry.getValue().get(0));
+                List<Object> values = entry.getValue();
+                camelHeaders.put(camelHeaderName, values.size() == 1 ? 
values.get(0) : values);
             }
         });
     }
diff --git 
a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfConverter.java
 
b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfConverter.java
index da90d9c89264..f1ed549fcde5 100644
--- 
a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfConverter.java
+++ 
b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfConverter.java
@@ -223,6 +223,10 @@ public final class CxfConverter {
             Response response = (Response) value;
             Object entity = response.getEntity();
 
+            if (entity == null) {
+                return (T) MISS_VALUE;
+            }
+
             TypeConverter tc = registry.lookup(type, entity.getClass());
             if (tc != null) {
                 return tc.convertTo(type, exchange, entity);
diff --git 
a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsInvoker.java
 
b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsInvoker.java
index daa83b583355..768d01be35c1 100644
--- 
a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsInvoker.java
+++ 
b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsInvoker.java
@@ -182,7 +182,7 @@ public class CxfRsInvoker extends JAXRSInvoker {
             Exchange cxfExchange, Method method,
             Object[] paramArray, Object response) {
         ExchangePattern ep = ExchangePattern.InOut;
-        if (method.getReturnType() == Void.class) {
+        if (method.getReturnType() == Void.TYPE || method.getReturnType() == 
Void.class) {
             ep = ExchangePattern.InOnly;
         }
         final org.apache.camel.Exchange camelExchange = 
endpoint.createExchange(ep);
diff --git 
a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java
 
b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java
index 6f527c05708e..829fccecd1e4 100644
--- 
a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java
+++ 
b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java
@@ -647,7 +647,19 @@ public class CxfRsProducer extends DefaultAsyncProducer {
 
             for (Map.Entry<String, List<Object>> entry : 
resp.getMetadata().entrySet()) {
                 LOG.trace("Parse external header {}={}", entry.getKey(), 
entry.getValue());
-                answer.put(entry.getKey(), entry.getValue().get(0).toString());
+                List<Object> values = entry.getValue();
+                if (values.size() == 1) {
+                    answer.put(entry.getKey(), values.get(0).toString());
+                } else {
+                    StringBuilder sb = new StringBuilder();
+                    for (int i = 0; i < values.size(); i++) {
+                        if (i > 0) {
+                            sb.append(", ");
+                        }
+                        sb.append(values.get(i));
+                    }
+                    answer.put(entry.getKey(), sb.toString());
+                }
             }
         }
 
@@ -701,6 +713,7 @@ public class CxfRsProducer extends DefaultAsyncProducer {
                 // handle cookies
                 saveCookies(exchange, client, 
cxfRsEndpoint.getCookieHandler());
                 if (!exchange.getPattern().isOutCapable()) {
+                    response.close();
                     return;
                 }
 
@@ -806,6 +819,9 @@ public class CxfRsProducer extends DefaultAsyncProducer {
                     return;
                 }
                 if (!exchange.getPattern().isOutCapable()) {
+                    if (response != null) {
+                        response.close();
+                    }
                     return;
                 }
 
diff --git 
a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java
 
b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java
index a100f55fa0c7..39043bd8aad8 100644
--- 
a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java
+++ 
b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java
@@ -123,10 +123,11 @@ public class DefaultCxfRsBinding implements CxfRsBinding, 
HeaderFilterStrategyAw
     private static void setProtocolHeaders(org.apache.cxf.message.Exchange 
cxfExchange, Message response) {
         Map<String, Object> headers
                 = CastUtils.cast((Map<?, ?>) 
response.getHeader(CxfConstants.PROTOCOL_HEADERS));
-        if (!ObjectHelper.isEmpty(cxfExchange) && 
!ObjectHelper.isEmpty(cxfExchange.getOutMessage())) {
-            
cxfExchange.getOutMessage().putIfAbsent(CxfConstants.PROTOCOL_HEADERS,
-                    new TreeMap<>(String.CASE_INSENSITIVE_ORDER));
+        if (cxfExchange == null || cxfExchange.getOutMessage() == null) {
+            return;
         }
+        cxfExchange.getOutMessage().putIfAbsent(CxfConstants.PROTOCOL_HEADERS,
+                new TreeMap<>(String.CASE_INSENSITIVE_ORDER));
         final Map<String, List<String>> cxfHeaders = CastUtils
                 .cast((Map<?, ?>) 
cxfExchange.getOutMessage().get(CxfConstants.PROTOCOL_HEADERS));
 
@@ -310,8 +311,8 @@ public class DefaultCxfRsBinding implements CxfRsBinding, 
HeaderFilterStrategyAw
                 /* Ignore HTTP/2 pseudo headers such as :status */
                 continue;
             } else {
-                // just put the first String element, as the complex one is 
filtered
-                camelMessage.setHeader(entry.getKey(), 
entry.getValue().get(0));
+                List<String> values = entry.getValue();
+                camelMessage.setHeader(entry.getKey(), values.size() == 1 ? 
values.get(0) : values);
             }
             continue;
         }
diff --git 
a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/SubResourceClassInvocationHandler.java
 
b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/SubResourceClassInvocationHandler.java
index c2c986f9414c..b57f54f473c2 100644
--- 
a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/SubResourceClassInvocationHandler.java
+++ 
b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/SubResourceClassInvocationHandler.java
@@ -30,7 +30,7 @@ public class SubResourceClassInvocationHandler implements 
InvocationHandler {
     public Object invoke(Object proxy, Method method, Object[] parameters) 
throws Throwable {
         Object result = null;
         Class<?> returnType = method.getReturnType();
-        if (!returnType.isAssignableFrom(Void.class)) {
+        if (returnType != Void.TYPE && returnType != Void.class) {
             // create a instance to return
             if (returnType.isInterface()) {
                 // create a new proxy for it
diff --git 
a/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/CxfClientCallback.java
 
b/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/CxfClientCallback.java
index 98f2e4362337..ad655051c868 100644
--- 
a/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/CxfClientCallback.java
+++ 
b/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/CxfClientCallback.java
@@ -88,7 +88,9 @@ public class CxfClientCallback extends ClientCallback {
             ConduitSelector conduitSelector = 
cxfExchange.get(ConduitSelector.class);
             if (conduitSelector != null) {
                 conduitSelector.complete(cxfExchange);
-                ex = cxfExchange.getOutMessage().getContent(Exception.class);
+                if (cxfExchange.getOutMessage() != null) {
+                    ex = 
cxfExchange.getOutMessage().getContent(Exception.class);
+                }
                 if (ex == null && cxfExchange.getInMessage() != null) {
                     ex = 
cxfExchange.getInMessage().getContent(Exception.class);
                 }
diff --git 
a/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/CxfEndpoint.java
 
b/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/CxfEndpoint.java
index faa19fabf403..3c68352c8dd7 100644
--- 
a/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/CxfEndpoint.java
+++ 
b/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/CxfEndpoint.java
@@ -137,7 +137,7 @@ public class CxfEndpoint extends DefaultEndpoint implements 
AsyncEndpoint, Heade
     private static final Logger LOG = 
LoggerFactory.getLogger(CxfEndpoint.class);
 
     @UriParam(label = "advanced")
-    protected Bus bus;
+    protected volatile Bus bus;
     @UriParam(label = "advanced")
     protected boolean defaultBus;
     protected volatile boolean createBus;
diff --git 
a/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/DefaultCxfBinding.java
 
b/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/DefaultCxfBinding.java
index cbe2af5c8d90..e07f9976bb50 100644
--- 
a/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/DefaultCxfBinding.java
+++ 
b/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/DefaultCxfBinding.java
@@ -473,8 +473,14 @@ public class DefaultCxfBinding implements CxfBinding, 
HeaderFilterStrategyAware
 
         propagateHeadersFromCamelToCxf(camelExchange, camelHeaders, 
cxfExchange,
                 responseContext);
-        if (cxfExchange.getOutMessage() != null) {
-            cxfExchange.getOutMessage().put(CxfConstants.PROTOCOL_HEADERS, 
responseContext.get(CxfConstants.PROTOCOL_HEADERS));
+        Object protocolHeaders = 
responseContext.get(CxfConstants.PROTOCOL_HEADERS);
+        if (protocolHeaders != null) {
+            // Store on the CXF exchange so headers survive into the fault path
+            // (the out message does not exist yet at this point)
+            cxfExchange.put(CxfConstants.PROTOCOL_HEADERS, protocolHeaders);
+            if (cxfExchange.getOutMessage() != null) {
+                cxfExchange.getOutMessage().put(CxfConstants.PROTOCOL_HEADERS, 
protocolHeaders);
+            }
         }
     }
 
@@ -866,7 +872,7 @@ public class DefaultCxfBinding implements CxfBinding, 
HeaderFilterStrategyAware
                 if (part.charAt(0) == '\"') {
                     result = part.substring(1, part.length() - 1);
                 } else {
-                    result = part.substring(5);
+                    result = part;
                 }
                 break;
             }
diff --git 
a/components/camel-cxf/camel-cxf-spring-rest/src/main/java/org/apache/camel/component/cxf/spring/jaxrs/CxfRsSpringEndpoint.java
 
b/components/camel-cxf/camel-cxf-spring-rest/src/main/java/org/apache/camel/component/cxf/spring/jaxrs/CxfRsSpringEndpoint.java
index 993cb1790a7a..a2f564abff43 100644
--- 
a/components/camel-cxf/camel-cxf-spring-rest/src/main/java/org/apache/camel/component/cxf/spring/jaxrs/CxfRsSpringEndpoint.java
+++ 
b/components/camel-cxf/camel-cxf-spring-rest/src/main/java/org/apache/camel/component/cxf/spring/jaxrs/CxfRsSpringEndpoint.java
@@ -48,8 +48,10 @@ public class CxfRsSpringEndpoint extends CxfRsEndpoint 
implements BeanIdAware {
             setBeanId(beanIdAware.getBeanId());
         }
 
-        ApplicationContext applicationContext = ((SpringCamelContext) 
getCamelContext()).getApplicationContext();
-        configurer = new ConfigurerImpl(applicationContext);
+        if (getCamelContext() instanceof SpringCamelContext 
springCamelContext) {
+            ApplicationContext applicationContext = 
springCamelContext.getApplicationContext();
+            configurer = new ConfigurerImpl(applicationContext);
+        }
     }
 
     @Override
@@ -58,6 +60,14 @@ public class CxfRsSpringEndpoint extends CxfRsEndpoint 
implements BeanIdAware {
         return (JAXRSServerFactoryBean) bean;
     }
 
+    @Override
+    protected void setupJAXRSServerFactoryBean(JAXRSServerFactoryBean sfb) {
+        if (sfb instanceof SpringJAXRSServerFactoryBean springBean) {
+            springBean.setPerformInvocation(isPerformInvocation());
+        }
+        super.setupJAXRSServerFactoryBean(sfb);
+    }
+
     @Override
     protected JAXRSClientFactoryBean newJAXRSClientFactoryBean() {
         checkBeanType(bean, JAXRSClientFactoryBean.class);
@@ -67,7 +77,9 @@ public class CxfRsSpringEndpoint extends CxfRsEndpoint 
implements BeanIdAware {
     @Override
     protected void setupJAXRSClientFactoryBean(JAXRSClientFactoryBean cfb, 
String address) {
         // apply Spring bean config first so URI options can override
-        configurer.configureBean(beanId, cfb);
+        if (configurer != null) {
+            configurer.configureBean(beanId, cfb);
+        }
         if (getModelRef() != null) {
             cfb.setModelRef(getModelRef());
         }
diff --git 
a/components/camel-cxf/camel-cxf-spring-rest/src/main/java/org/apache/camel/component/cxf/spring/jaxrs/SpringJAXRSServerFactoryBean.java
 
b/components/camel-cxf/camel-cxf-spring-rest/src/main/java/org/apache/camel/component/cxf/spring/jaxrs/SpringJAXRSServerFactoryBean.java
index e9dc801dd907..0a1e5f986fd7 100644
--- 
a/components/camel-cxf/camel-cxf-spring-rest/src/main/java/org/apache/camel/component/cxf/spring/jaxrs/SpringJAXRSServerFactoryBean.java
+++ 
b/components/camel-cxf/camel-cxf-spring-rest/src/main/java/org/apache/camel/component/cxf/spring/jaxrs/SpringJAXRSServerFactoryBean.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.cxf.spring.jaxrs;
 
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.camel.component.cxf.common.NullFaultListener;
 import org.apache.camel.component.cxf.jaxrs.BeanIdAware;
@@ -107,6 +108,15 @@ public class SpringJAXRSServerFactoryBean extends 
JAXRSServerFactoryBean
         }
     }
 
+    @Override
+    public void setProperties(Map<String, Object> properties) {
+        if (this.getProperties() != null && properties != null) {
+            this.getProperties().putAll(properties);
+        } else {
+            super.setProperties(properties);
+        }
+    }
+
     public void setSkipFaultLogging(boolean skipFaultLogging) {
         if (skipFaultLogging) {
             if (this.getProperties() == null) {
diff --git 
a/components/camel-cxf/camel-cxf-spring-soap/src/main/java/org/apache/camel/component/cxf/spring/jaxws/CxfSpringEndpoint.java
 
b/components/camel-cxf/camel-cxf-spring-soap/src/main/java/org/apache/camel/component/cxf/spring/jaxws/CxfSpringEndpoint.java
index fa792b1abff8..8d25753bbe2a 100644
--- 
a/components/camel-cxf/camel-cxf-spring-soap/src/main/java/org/apache/camel/component/cxf/spring/jaxws/CxfSpringEndpoint.java
+++ 
b/components/camel-cxf/camel-cxf-spring-soap/src/main/java/org/apache/camel/component/cxf/spring/jaxws/CxfSpringEndpoint.java
@@ -274,6 +274,7 @@ public class CxfSpringEndpoint extends CxfEndpoint 
implements ApplicationContext
 
         if (bus == null) {
             bus = BusWiringBeanFactoryPostProcessor.addDefaultBus(ctx);
+            enableSpringBusShutdownGracefully(bus);
         }
     }
 
@@ -312,46 +313,47 @@ public class CxfSpringEndpoint extends CxfEndpoint 
implements ApplicationContext
                 && applicationContext instanceof AbstractApplicationContext 
abstractApplicationContext) {
             ApplicationListener cxfSpringBusListener = null;
             for (ApplicationListener listener : 
abstractApplicationContext.getApplicationListeners()) {
-
-                if 
(listener.getClass().getName().indexOf("org.apache.cxf.bus.spring.SpringBus") 
>= 0) {
+                // match by identity to ensure we remove the listener for this 
specific bus
+                if (listener == springBus) {
                     cxfSpringBusListener = listener;
+                    break;
                 }
             }
+            if (cxfSpringBusListener == null) {
+                return;
+            }
             ApplicationEventMulticaster aem = applicationContext
                     
.getBean(AbstractApplicationContext.APPLICATION_EVENT_MULTICASTER_BEAN_NAME,
                             ApplicationEventMulticaster.class);
             aem.removeApplicationListener(cxfSpringBusListener);
 
             abstractApplicationContext.addApplicationListener((final 
ApplicationEvent event) -> {
-                new Thread() {
-                    @Override
-                    public void run() {
-                        if (event instanceof ContextClosedEvent && 
bus.getState() == BusState.RUNNING) {
-
-                            try {
-                                boolean done = false;
-                                ShutdownStrategy shutdownStrategy = 
((DefaultCamelContext) getCamelContext())
-                                        .getShutdownStrategy();
-                                while (!done && 
!shutdownStrategy.hasTimeoutOccurred()) {
-                                    int inflight = 
getCamelContext().getInflightRepository().size();
-                                    if (inflight != 0) {
-                                        Thread.sleep(1000);
-                                    } else {
-                                        done = true;
-                                    }
+                if (event instanceof ContextClosedEvent && bus.getState() == 
BusState.RUNNING) {
+                    // only spawn a thread for shutdown to wait for in-flight 
exchanges
+                    new Thread(() -> {
+                        try {
+                            boolean done = false;
+                            ShutdownStrategy shutdownStrategy = 
((DefaultCamelContext) getCamelContext())
+                                    .getShutdownStrategy();
+                            while (!done && 
!shutdownStrategy.hasTimeoutOccurred()) {
+                                int inflight = 
getCamelContext().getInflightRepository().size();
+                                if (inflight != 0) {
+                                    Thread.sleep(1000);
+                                } else {
+                                    done = true;
                                 }
-                            } catch (InterruptedException e) {
-                                LOG.info("Interrupted while enabling graceful 
SpringBus shutdown");
-                                Thread.currentThread().interrupt();
-                            } catch (Exception e) {
-                                LOG.debug("Error when enabling SpringBus 
shutdown gracefully", e);
                             }
-                            springBus.onApplicationEvent(event);
-                        } else {
-                            springBus.onApplicationEvent(event);
+                        } catch (InterruptedException e) {
+                            LOG.info("Interrupted while enabling graceful 
SpringBus shutdown");
+                            Thread.currentThread().interrupt();
+                        } catch (Exception e) {
+                            LOG.debug("Error when enabling SpringBus shutdown 
gracefully", e);
                         }
-                    }
-                }.start();
+                        springBus.onApplicationEvent(event);
+                    }).start();
+                } else {
+                    springBus.onApplicationEvent(event);
+                }
             });
         }
 
diff --git 
a/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/CamelConduit.java
 
b/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/CamelConduit.java
index 013d63514828..2c705116b170 100644
--- 
a/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/CamelConduit.java
+++ 
b/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/CamelConduit.java
@@ -47,6 +47,7 @@ public class CamelConduit extends AbstractConduit implements 
Configurable {
     private final EndpointInfo endpointInfo;
     private String targetCamelEndpointUri;
     private final Producer producer;
+    private volatile boolean closed;
     private ProducerTemplate camelTemplate;
     private final Bus bus;
     private final HeaderFilterStrategy headerFilterStrategy;
@@ -92,9 +93,11 @@ public class CamelConduit extends AbstractConduit implements 
Configurable {
         return camelContext;
     }
 
-    // prepare the message for send out , not actually send out the message
     @Override
     public void prepare(Message message) throws IOException {
+        if (closed) {
+            throw new IOException("CamelConduit is already closed");
+        }
         LOG.trace("CamelConduit send message");
         CamelOutputStream os = new CamelOutputStream(
                 this.targetCamelEndpointUri,
@@ -107,8 +110,8 @@ public class CamelConduit extends AbstractConduit 
implements Configurable {
 
     @Override
     public void close() {
+        closed = true;
         LOG.trace("CamelConduit closed ");
-        // shutdown the producer
         try {
             producer.stop();
         } catch (Exception e) {
diff --git 
a/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/CamelOutputStream.java
 
b/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/CamelOutputStream.java
index fb6c9434e448..73ecea12a069 100644
--- 
a/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/CamelOutputStream.java
+++ 
b/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/CamelOutputStream.java
@@ -130,14 +130,22 @@ class CamelOutputStream extends CachedOutputStream {
             try {
                 syncInvoke(exchange);
             } catch (Exception e) {
-                ((PhaseInterceptorChain) 
outMessage.getInterceptorChain()).abort();
                 outMessage.setContent(Exception.class, e);
-                ((PhaseInterceptorChain) 
outMessage.getInterceptorChain()).unwind(outMessage);
-                MessageObserver mo = 
outMessage.getInterceptorChain().getFaultObserver();
+                if (outMessage.getInterceptorChain() instanceof 
PhaseInterceptorChain chain) {
+                    chain.abort();
+                    chain.unwind(outMessage);
+                }
+                MessageObserver mo = outMessage.getInterceptorChain() != null
+                        ? outMessage.getInterceptorChain().getFaultObserver()
+                        : null;
                 if (mo == null) {
                     mo = outMessage.getExchange().get(MessageObserver.class);
                 }
-                mo.onMessage(outMessage);
+                if (mo != null) {
+                    mo.onMessage(outMessage);
+                } else {
+                    LOG.error("No fault observer available to handle transport 
error", e);
+                }
             }
         };
 
diff --git 
a/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/message/DefaultCxfMessageMapper.java
 
b/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/message/DefaultCxfMessageMapper.java
index bdbd28262338..e1f361aa3dfe 100644
--- 
a/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/message/DefaultCxfMessageMapper.java
+++ 
b/components/camel-cxf/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/transport/message/DefaultCxfMessageMapper.java
@@ -152,8 +152,7 @@ public class DefaultCxfMessageMapper implements 
CxfMessageMapper {
         if (answer == null) {
             answer = camelExchange.getFromEndpoint().getEndpointUri();
             // remove leading scheme before the http(s) transport so we build 
a correct base path
-            answer = answer.replaceFirst("^\\w+:http", "http");
-            answer = answer.replaceFirst("^\\w+:https", "https");
+            answer = answer.replaceFirst("^\\w+:(https?)", "$1");
         }
 
         return answer;

Reply via email to