diff --git a/jersey/connector/src/main/java/io/helidon/jersey/connector/HelidonConnector.java b/jersey/connector/src/main/java/io/helidon/jersey/connector/HelidonConnector.java index 5ed9b6030ae..ae407b707ff 100644 --- a/jersey/connector/src/main/java/io/helidon/jersey/connector/HelidonConnector.java +++ b/jersey/connector/src/main/java/io/helidon/jersey/connector/HelidonConnector.java @@ -151,7 +151,6 @@ private HttpClientRequest mapRequest(ClientRequest request) { HttpClientRequest httpRequest = webClient .method(Method.create(request.getMethod())) .proxy(requestProxy) - .skipUriEncoding(true) // already encoded by Jersey .uri(uri); // map request headers diff --git a/webclient/api/src/main/java/io/helidon/webclient/api/ClientUri.java b/webclient/api/src/main/java/io/helidon/webclient/api/ClientUri.java index ba5191da302..51b86de818a 100644 --- a/webclient/api/src/main/java/io/helidon/webclient/api/ClientUri.java +++ b/webclient/api/src/main/java/io/helidon/webclient/api/ClientUri.java @@ -18,6 +18,7 @@ import java.net.URI; +import io.helidon.common.uri.UriEncoding; import io.helidon.common.uri.UriFragment; import io.helidon.common.uri.UriInfo; import io.helidon.common.uri.UriPath; @@ -194,8 +195,11 @@ public ClientUri resolve(URI uri) { uriBuilder.path(resolvePath(uriBuilder.path().path(), uri.getPath())); - if (uri.getQuery() != null) { - query.fromQueryString(uri.getQuery()); + String queryString = uri.getQuery(); + if (queryString != null) { + // class URI does not decode +'s so we do it + query.fromQueryString(queryString.indexOf('+') >= 0 ? + UriEncoding.decodeUri(queryString) : queryString); } if (uri.getRawFragment() != null) { diff --git a/webclient/api/src/test/java/io/helidon/webclient/api/ClientUriTest.java b/webclient/api/src/test/java/io/helidon/webclient/api/ClientUriTest.java index 173abf830df..e7b404343ba 100644 --- a/webclient/api/src/test/java/io/helidon/webclient/api/ClientUriTest.java +++ b/webclient/api/src/test/java/io/helidon/webclient/api/ClientUriTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023 Oracle and/or its affiliates. + * Copyright (c) 2022, 2024 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,6 @@ import io.helidon.common.uri.UriPath; import io.helidon.common.uri.UriQueryWriteable; - import org.junit.jupiter.api.Test; import static org.hamcrest.CoreMatchers.is; @@ -105,4 +104,23 @@ void testResolveAll() { assertThat(helper.port(), is(80)); assertThat(helper.scheme(), is("https")); } + + @Test + void testResolveQuery() { + URI uri = URI.create("http://localhost:8080/greet?filter=a+b+c"); + ClientUri clientUri = ClientUri.create(); + clientUri.resolve(uri); + assertThat(clientUri.query().get("filter"), is("a b c")); + assertThat(clientUri.query().getRaw("filter"), is("a%20b%20c")); + } + + @Test + void testToUriWithSkipEncoding() { + URI uri = URI.create("http://localhost:8080/greet?filter=%20a%20"); + ClientUri clientUri = ClientUri.create(); + clientUri.skipUriEncoding(true); + clientUri.resolve(uri); + URI newUri = clientUri.toUri(); + assertThat(uri, is(newUri)); + } } \ No newline at end of file