diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java index 860788e0157a5..023bd1fe63786 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java @@ -1126,7 +1126,9 @@ private static String encodePart(String pathPart) { //encode each part (e.g. index, type and id) separately before merging them into the path //we prepend "/" to the path part to make this path absolute, otherwise there can be issues with //paths that start with `-` or contain `:` - URI uri = new URI(null, null, null, -1, "/" + pathPart, null, null); + //the authority must be an empty string and not null, else paths that being with slashes could have them + //misinterpreted as part of the authority. + URI uri = new URI(null, "", "/" + pathPart, null, null); //manually encode any slash that each part may contain return uri.getRawPath().substring(1).replaceAll("/", "%2F"); } catch (URISyntaxException e) { diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java index e3807b6067960..6be59b687d31d 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java @@ -1772,6 +1772,38 @@ public void testEndpointBuilderEncodeParts() { .addPathPartAsIs("cache/clear"); assertEquals("/index1,index2/cache/clear", endpointBuilder.build()); } + { + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("/foo"); + assertEquals("/%2Ffoo", endpointBuilder.build()); + } + { + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("//foo"); + assertEquals("/%2F%2Ffoo", endpointBuilder.build()); + } + { + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("///foo"); + assertEquals("/%2F%2F%2Ffoo", endpointBuilder.build()); + } + { + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("/foo/bar"); + assertEquals("/%2Ffoo%2Fbar", endpointBuilder.build()); + } + { + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("//foo/bar"); + assertEquals("/%2F%2Ffoo%2Fbar", endpointBuilder.build()); + } + { + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("/foo@bar"); + assertEquals("/%2Ffoo@bar", endpointBuilder.build()); + } + { + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("//foo@bar"); + assertEquals("/%2F%2Ffoo@bar", endpointBuilder.build()); + } + { + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("/part1").addPathPart("//part2").addPathPart("///part3"); + assertEquals("/%2Fpart1/%2F%2Fpart2/%2F%2F%2Fpart3", endpointBuilder.build()); + } } public void testEndpoint() {