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

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


The following commit(s) were added to refs/heads/camel-4.10.x by this push:
     new ec469a42028 CAMEL-22020: camel-platform-http/camel-rest: Plus sign in 
consumes/producers option should keep plus sign after URL encoded.
ec469a42028 is described below

commit ec469a42028370b31d3e956bc5ab2c0775a231c3
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed Apr 30 07:51:35 2025 +0200

    CAMEL-22020: camel-platform-http/camel-rest: Plus sign in 
consumes/producers option should keep plus sign after URL encoded.
---
 .../component/platform/http/PlatformHttpEndpoint.java | 13 +++----------
 .../http/PlatformHttpConsumesPlusSignTest.java        |  5 ++++-
 .../camel/component/rest/openapi/HttpsV3Test.java     |  2 +-
 .../rest/openapi/RestOpenApiComponentV3Test.java      | 12 ++++++------
 .../rest/openapi/RestOpenApiComponentV3YamlTest.java  | 12 ++++++------
 .../org/apache/camel/component/rest/RestEndpoint.java | 13 +++----------
 .../java/org/apache/camel/util/MimeTypeHelper.java    | 19 +++++++++++++++++++
 .../org/apache/camel/util/MimeTypeHelperTest.java     |  9 +++++++++
 8 files changed, 51 insertions(+), 34 deletions(-)

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 84b067f650a..529154fc37b 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
@@ -36,6 +36,7 @@ import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
 import org.apache.camel.support.DefaultEndpoint;
+import org.apache.camel.util.MimeTypeHelper;
 
 /**
  * Expose HTTP endpoints using the HTTP server available in the current 
platform.
@@ -248,11 +249,7 @@ public class PlatformHttpEndpoint extends DefaultEndpoint
     }
 
     public void setConsumes(String consumes) {
-        // url encoding turns + into space
-        if (consumes != null) {
-            consumes = consumes.replace(' ', '+');
-        }
-        this.consumes = consumes;
+        this.consumes = MimeTypeHelper.sanitizeMimeType(consumes);
     }
 
     public String getProduces() {
@@ -260,11 +257,7 @@ public class PlatformHttpEndpoint extends DefaultEndpoint
     }
 
     public void setProduces(String produces) {
-        // url encoding turns + into space
-        if (produces != null) {
-            produces = produces.replace(' ', '+');
-        }
-        this.produces = produces;
+        this.produces = MimeTypeHelper.sanitizeMimeType(produces);
     }
 
     public boolean isMuteException() {
diff --git 
a/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/PlatformHttpConsumesPlusSignTest.java
 
b/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/PlatformHttpConsumesPlusSignTest.java
index 3f64af08f7a..f59f45577e8 100644
--- 
a/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/PlatformHttpConsumesPlusSignTest.java
+++ 
b/components/camel-platform-http/src/test/java/org/apache/camel/component/platform/http/PlatformHttpConsumesPlusSignTest.java
@@ -37,6 +37,9 @@ public class PlatformHttpConsumesPlusSignTest extends 
AbstractPlatformHttpTest {
                 .header("User-Agent", (String) null)
                 .when()
                 .get("/get");
+
+        PlatformHttpEndpoint phe = (PlatformHttpEndpoint) 
getContext().getEndpoints().iterator().next();
+        Assertions.assertEquals("application/fhir+json,text/plain", 
phe.getConsumes());
     }
 
     @Override
@@ -44,7 +47,7 @@ public class PlatformHttpConsumesPlusSignTest extends 
AbstractPlatformHttpTest {
         return new RouteBuilder() {
             @Override
             public void configure() {
-                from("platform-http:/get?consumes=application/fhir+json")
+                from("platform-http:/get?consumes=application/fhir+json, 
text/plain")
                         .process(e -> {
                             Assertions.assertEquals("application/fhir+json", 
e.getMessage().getHeader("Accept"));
                             Assertions.assertEquals("User-Agent-Camel", 
e.getMessage().getHeader("User-Agent"));
diff --git 
a/components/camel-rest-openapi/src/test/java/org/apache/camel/component/rest/openapi/HttpsV3Test.java
 
b/components/camel-rest-openapi/src/test/java/org/apache/camel/component/rest/openapi/HttpsV3Test.java
index 06d5b57c714..9c489621f5f 100644
--- 
a/components/camel-rest-openapi/src/test/java/org/apache/camel/component/rest/openapi/HttpsV3Test.java
+++ 
b/components/camel-rest-openapi/src/test/java/org/apache/camel/component/rest/openapi/HttpsV3Test.java
@@ -101,7 +101,7 @@ public abstract class HttpsV3Test extends 
ManagedCamelTestSupport {
         assertEquals("Olafur Eliason Arnalds", pet.getName());
 
         
petstore.verify(getRequestedFor(urlEqualTo("/api/v3/pet/14")).withHeader("Accept",
-                equalTo("application/xml, application/json")));
+                equalTo("application/xml,application/json")));
     }
 
     @Override
diff --git 
a/components/camel-rest-openapi/src/test/java/org/apache/camel/component/rest/openapi/RestOpenApiComponentV3Test.java
 
b/components/camel-rest-openapi/src/test/java/org/apache/camel/component/rest/openapi/RestOpenApiComponentV3Test.java
index dcc2dc25d10..691a006e7ac 100644
--- 
a/components/camel-rest-openapi/src/test/java/org/apache/camel/component/rest/openapi/RestOpenApiComponentV3Test.java
+++ 
b/components/camel-rest-openapi/src/test/java/org/apache/camel/component/rest/openapi/RestOpenApiComponentV3Test.java
@@ -91,7 +91,7 @@ public class RestOpenApiComponentV3Test extends 
ManagedCamelTestSupport {
         assertEquals(14, created.getId());
 
         petstore.verify(
-                
postRequestedFor(urlEqualTo("/api/v3/pet")).withHeader("Accept", 
equalTo("application/xml, application/json"))
+                
postRequestedFor(urlEqualTo("/api/v3/pet")).withHeader("Accept", 
equalTo("application/xml,application/json"))
                         .withHeader("Content-Type", 
equalTo("application/xml")));
     }
 
@@ -108,7 +108,7 @@ public class RestOpenApiComponentV3Test extends 
ManagedCamelTestSupport {
         assertEquals("Olafur Eliason Arnalds", pet.getName());
 
         
petstore.verify(getRequestedFor(urlEqualTo("/api/v3/pet/14")).withHeader("Accept",
-                equalTo("application/xml, application/json")));
+                equalTo("application/xml,application/json")));
     }
 
     @ParameterizedTest
@@ -124,7 +124,7 @@ public class RestOpenApiComponentV3Test extends 
ManagedCamelTestSupport {
         assertEquals("Olafur Eliason Arnalds", pet.getName());
 
         
petstore.verify(getRequestedFor(urlEqualTo("/api/v3/pet/14")).withHeader("Accept",
-                equalTo("application/xml, application/json")));
+                equalTo("application/xml,application/json")));
     }
 
     @ParameterizedTest
@@ -143,7 +143,7 @@ public class RestOpenApiComponentV3Test extends 
ManagedCamelTestSupport {
         assertEquals("Olafur Eliason Arnalds", pet.getName());
 
         petstore.verify(
-                
getRequestedFor(urlEqualTo("/api/v3/pet/14")).withHeader("Accept", 
equalTo("application/xml, application/json"))
+                
getRequestedFor(urlEqualTo("/api/v3/pet/14")).withHeader("Accept", 
equalTo("application/xml,application/json"))
                         .withHeader("api_key", equalTo("dolphins")));
     }
 
@@ -163,7 +163,7 @@ public class RestOpenApiComponentV3Test extends 
ManagedCamelTestSupport {
         assertEquals("Olafur Eliason Arnalds", pet.getName());
 
         
petstore.verify(getRequestedFor(urlEqualTo("/api/v3/pet/14?api_key=dolphins")).withHeader("Accept",
-                equalTo("application/xml, application/json")));
+                equalTo("application/xml,application/json")));
     }
 
     @ParameterizedTest
@@ -180,7 +180,7 @@ public class RestOpenApiComponentV3Test extends 
ManagedCamelTestSupport {
 
         petstore.verify(
                 
getRequestedFor(urlPathEqualTo("/api/v3/pet/findByStatus")).withQueryParam("status",
 equalTo("available"))
-                        .withHeader("Accept", equalTo("application/xml, 
application/json")));
+                        .withHeader("Accept", 
equalTo("application/xml,application/json")));
     }
 
     @Override
diff --git 
a/components/camel-rest-openapi/src/test/java/org/apache/camel/component/rest/openapi/RestOpenApiComponentV3YamlTest.java
 
b/components/camel-rest-openapi/src/test/java/org/apache/camel/component/rest/openapi/RestOpenApiComponentV3YamlTest.java
index f81710dde5e..7f3503fa3bf 100644
--- 
a/components/camel-rest-openapi/src/test/java/org/apache/camel/component/rest/openapi/RestOpenApiComponentV3YamlTest.java
+++ 
b/components/camel-rest-openapi/src/test/java/org/apache/camel/component/rest/openapi/RestOpenApiComponentV3YamlTest.java
@@ -91,7 +91,7 @@ public class RestOpenApiComponentV3YamlTest extends 
ManagedCamelTestSupport {
         assertEquals(14, created.getId());
 
         petstore.verify(
-                
postRequestedFor(urlEqualTo("/api/v3/pet")).withHeader("Accept", 
equalTo("application/xml, application/json"))
+                
postRequestedFor(urlEqualTo("/api/v3/pet")).withHeader("Accept", 
equalTo("application/xml,application/json"))
                         .withHeader("Content-Type", 
equalTo("application/xml")));
     }
 
@@ -108,7 +108,7 @@ public class RestOpenApiComponentV3YamlTest extends 
ManagedCamelTestSupport {
         assertEquals("Olafur Eliason Arnalds", pet.getName());
 
         
petstore.verify(getRequestedFor(urlEqualTo("/api/v3/pet/14")).withHeader("Accept",
-                equalTo("application/xml, application/json")));
+                equalTo("application/xml,application/json")));
     }
 
     @ParameterizedTest
@@ -124,7 +124,7 @@ public class RestOpenApiComponentV3YamlTest extends 
ManagedCamelTestSupport {
         assertEquals("Olafur Eliason Arnalds", pet.getName());
 
         
petstore.verify(getRequestedFor(urlEqualTo("/api/v3/pet/14")).withHeader("Accept",
-                equalTo("application/xml, application/json")));
+                equalTo("application/xml,application/json")));
     }
 
     @ParameterizedTest
@@ -143,7 +143,7 @@ public class RestOpenApiComponentV3YamlTest extends 
ManagedCamelTestSupport {
         assertEquals("Olafur Eliason Arnalds", pet.getName());
 
         petstore.verify(
-                
getRequestedFor(urlEqualTo("/api/v3/pet/14")).withHeader("Accept", 
equalTo("application/xml, application/json"))
+                
getRequestedFor(urlEqualTo("/api/v3/pet/14")).withHeader("Accept", 
equalTo("application/xml,application/json"))
                         .withHeader("api_key", equalTo("dolphins")));
     }
 
@@ -163,7 +163,7 @@ public class RestOpenApiComponentV3YamlTest extends 
ManagedCamelTestSupport {
         assertEquals("Olafur Eliason Arnalds", pet.getName());
 
         
petstore.verify(getRequestedFor(urlEqualTo("/api/v3/pet/14?api_key=dolphins")).withHeader("Accept",
-                equalTo("application/xml, application/json")));
+                equalTo("application/xml,application/json")));
     }
 
     @ParameterizedTest
@@ -180,7 +180,7 @@ public class RestOpenApiComponentV3YamlTest extends 
ManagedCamelTestSupport {
 
         petstore.verify(
                 
getRequestedFor(urlPathEqualTo("/api/v3/pet/findByStatus")).withQueryParam("status",
 equalTo("available"))
-                        .withHeader("Accept", equalTo("application/xml, 
application/json")));
+                        .withHeader("Accept", 
equalTo("application/xml,application/json")));
     }
 
     @Override
diff --git 
a/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java
 
b/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java
index 9e20cc05924..86a6ff3cf26 100644
--- 
a/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java
+++ 
b/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java
@@ -39,6 +39,7 @@ import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.support.DefaultEndpoint;
 import org.apache.camel.support.component.PropertyConfigurerSupport;
 import org.apache.camel.util.HostUtils;
+import org.apache.camel.util.MimeTypeHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -160,11 +161,7 @@ public class RestEndpoint extends DefaultEndpoint {
      * of types.
      */
     public void setConsumes(String consumes) {
-        // url encoding turns + into space
-        if (consumes != null) {
-            consumes = consumes.replace(' ', '+');
-        }
-        this.consumes = consumes;
+        this.consumes = MimeTypeHelper.sanitizeMimeType(consumes);
     }
 
     public String getProduces() {
@@ -175,11 +172,7 @@ public class RestEndpoint extends DefaultEndpoint {
      * Media type such as: 'text/xml', or 'application/json' this REST service 
returns.
      */
     public void setProduces(String produces) {
-        // url encoding turns + into space
-        if (produces != null) {
-            produces = produces.replace(' ', '+');
-        }
-        this.produces = produces;
+        this.produces = MimeTypeHelper.sanitizeMimeType(produces);
     }
 
     public String getProducerComponentName() {
diff --git 
a/core/camel-util/src/main/java/org/apache/camel/util/MimeTypeHelper.java 
b/core/camel-util/src/main/java/org/apache/camel/util/MimeTypeHelper.java
index 8620aee89c6..a663e4b85ba 100644
--- a/core/camel-util/src/main/java/org/apache/camel/util/MimeTypeHelper.java
+++ b/core/camel-util/src/main/java/org/apache/camel/util/MimeTypeHelper.java
@@ -16,8 +16,27 @@
  */
 package org.apache.camel.util;
 
+import java.util.StringJoiner;
+
 public class MimeTypeHelper {
 
+    /**
+     * Sanitizes the mime types after URL encoding to convert space into plus 
sign.
+     *
+     * @param  types mime types such as from HTTP Accept header
+     * @return       the sanitized mime types
+     */
+    public static String sanitizeMimeType(String types) {
+        if (types != null) {
+            StringJoiner sj = new StringJoiner(",");
+            for (String part : types.split(",")) {
+                sj.add(part.trim().replace(' ', '+'));
+            }
+            types = sj.toString();
+        }
+        return types;
+    }
+
     /**
      * Probes the file name to determine the mime type (such as 
application/xml, text/plain).
      *
diff --git 
a/core/camel-util/src/test/java/org/apache/camel/util/MimeTypeHelperTest.java 
b/core/camel-util/src/test/java/org/apache/camel/util/MimeTypeHelperTest.java
index ed37f6db9ef..f0eaac382ea 100644
--- 
a/core/camel-util/src/test/java/org/apache/camel/util/MimeTypeHelperTest.java
+++ 
b/core/camel-util/src/test/java/org/apache/camel/util/MimeTypeHelperTest.java
@@ -23,6 +23,15 @@ import static org.junit.jupiter.api.Assertions.assertNull;
 
 class MimeTypeHelperTest {
 
+    @Test
+    void testSanitizeMimeTypes() {
+        assertNull(MimeTypeHelper.sanitizeMimeType(null));
+        assertEquals("application/json", 
MimeTypeHelper.sanitizeMimeType("application/json"));
+        assertEquals("application/xslt+xml", 
MimeTypeHelper.sanitizeMimeType("application/xslt xml"));
+        assertEquals("application/xslt+xml,application/xml",
+                MimeTypeHelper.sanitizeMimeType("application/xslt xml , 
application/xml"));
+    }
+
     @Test
     void testMimeType() {
         assertEquals("application/xslt+xml", 
MimeTypeHelper.probeMimeType("xslt"));

Reply via email to