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"));