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;
     }