You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2025/03/06 16:24:47 UTC
(camel) 01/02: CAMEL-21840: camel-http producer fix issue with HTTP_QUERY and non ascii chars
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
commit 8f710391f6423bfde8b3680359cda586ca6f30bc
Author: Dennis Bohnstedt <mi...@gmail.com>
AuthorDate: Thu Mar 6 17:21:29 2025 +0100
CAMEL-21840: camel-http producer fix issue with HTTP_QUERY and non ascii chars
* Added unit-test, showing problem in camel-http path encoding, when using Exchange.HTTP_QUERY
* Fixed problem in camel-http path encoding, by using Ascii encoded url instead of uri when creating HttpUriRequest
* Changed testcase representation of danish characters to unicode encoded hex
---
.../apache/camel/component/http/HttpProducer.java | 2 +-
.../apache/camel/component/http/HttpQueryTest.java | 43 ++++++++++++++++++++++
.../http/handler/BasicValidationHandler.java | 16 ++++++++
3 files changed, 60 insertions(+), 1 deletion(-)
diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java
index 32fe2d15727..5e8b6fa0386 100644
--- a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java
+++ b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java
@@ -644,7 +644,7 @@ public class HttpProducer extends DefaultProducer implements LineNumberAware {
// create http holder objects for the request
HttpMethods methodToUse = HttpMethodHelper.createMethod(exchange, getEndpoint());
- HttpUriRequest method = methodToUse.createMethod(uri);
+ HttpUriRequest method = methodToUse.createMethod(url);
// special for HTTP DELETE/GET if the message body should be included
if (getEndpoint().isDeleteWithBody() && "DELETE".equals(method.getMethod())
diff --git a/components/camel-http/src/test/java/org/apache/camel/component/http/HttpQueryTest.java b/components/camel-http/src/test/java/org/apache/camel/component/http/HttpQueryTest.java
index c4804311ba1..7e4a5a49039 100644
--- a/components/camel-http/src/test/java/org/apache/camel/component/http/HttpQueryTest.java
+++ b/components/camel-http/src/test/java/org/apache/camel/component/http/HttpQueryTest.java
@@ -29,6 +29,8 @@ public class HttpQueryTest extends BaseHttpTest {
private HttpServer localServer;
private String baseUrl;
+
+ private final String DANISH_CHARACTERS_UNICODE = "\u00e6\u00f8\u00e5\u00C6\u00D8\u00C5";
@Override
public void setupResources() throws Exception {
@@ -40,6 +42,12 @@ public class HttpQueryTest extends BaseHttpTest {
.register("/test/", new BasicValidationHandler(GET.name(), "my=@+camel", null, getExpectedContent()))
.register("/user/pass",
new BasicValidationHandler(GET.name(), "password=baa&username=foo", null, getExpectedContent()))
+ .register("/user/passwd",
+ new BasicValidationHandler(
+ GET.name(), "password='PasswordWithCharsThatNeedEscaping!≥≤!'&username=NotFromTheUSofA", null,
+ getExpectedContent()))
+ .register("/danish-accepted",
+ new BasicValidationHandler(GET.name(), "characters='"+ DANISH_CHARACTERS_UNICODE +"'", null, getExpectedContent()))
.create();
localServer.start();
@@ -85,4 +93,39 @@ public class HttpQueryTest extends BaseHttpTest {
assertExchange(exchange);
}
+
+ @Test
+ public void httpQueryWithPasswordContainingNonAsciiCharacter() {
+ Exchange exchange = template.request(
+ baseUrl + "/user/passwd?password='PasswordWithCharsThatNeedEscaping!≥≤!'&username=NotFromTheUSofA",
+ exchange1 -> {
+ });
+
+ assertExchange(exchange);
+ }
+
+ @Test
+ public void httpQueryWithPasswordContainingNonAsciiCharacterAsQueryParams() {
+ Exchange exchange = template.request(baseUrl + "/user/passwd",
+ exchange1 -> exchange1.getIn().setHeader(Exchange.HTTP_QUERY,
+ "password='PasswordWithCharsThatNeedEscaping!≥≤!'&username=NotFromTheUSofA"));
+
+ assertExchange(exchange);
+ }
+
+ @Test
+ public void httpDanishCharactersAcceptedInBaseURL() {
+ Exchange exchange = template.request(baseUrl + "/danish-accepted?characters='"+ DANISH_CHARACTERS_UNICODE +"'", exchange1 -> {
+ });
+
+ assertExchange(exchange);
+ }
+
+ @Test
+ public void httpDanishCharactersAcceptedAsQueryParams() {
+ Exchange exchange = template.request(baseUrl + "/danish-accepted",
+ exchange1 -> exchange1.getIn().setHeader(Exchange.HTTP_QUERY, "characters='"+ DANISH_CHARACTERS_UNICODE +"'"));
+
+ assertExchange(exchange);
+ }
}
diff --git a/components/camel-http/src/test/java/org/apache/camel/component/http/handler/BasicValidationHandler.java b/components/camel-http/src/test/java/org/apache/camel/component/http/handler/BasicValidationHandler.java
index 680cffa7d5f..2974f793f47 100644
--- a/components/camel-http/src/test/java/org/apache/camel/component/http/handler/BasicValidationHandler.java
+++ b/components/camel-http/src/test/java/org/apache/camel/component/http/handler/BasicValidationHandler.java
@@ -17,6 +17,7 @@
package org.apache.camel.component.http.handler;
import java.io.IOException;
+import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
@@ -76,6 +77,12 @@ public class BasicValidationHandler implements HttpRequestHandler {
return;
}
+ if (!validateRequestEncoding(request)) {
+ response.setCode(HttpStatus.SC_BAD_REQUEST);
+ response.setReasonPhrase("Request URI not encoded correctly!");
+ return;
+ }
+
if (expectedContent != null) {
HttpEntity entity = request.getEntity();
String content = EntityUtils.toString(entity);
@@ -105,6 +112,15 @@ public class BasicValidationHandler implements HttpRequestHandler {
return true;
}
+ protected boolean validateRequestEncoding(ClassicHttpRequest request) throws IOException {
+ try {
+ String encodedRequestPath = new URI(request.getPath()).toASCIIString();
+ return request.getPath().equals(encodedRequestPath); // Did request.path contain un-encoded characters?
+ } catch (URISyntaxException e) {
+ throw new IOException(e);
+ }
+ }
+
protected String buildResponse(ClassicHttpRequest request) {
return responseContent;
}