From 075078e7e05125f5e5de9e0e54c51d50998f58fe Mon Sep 17 00:00:00 2001 From: roy Date: Fri, 5 Apr 2019 01:58:41 +0800 Subject: [PATCH] HLRC: fix uri encode bug when url path starts with '/' (#34436) This commit sets the authority of a URI to blank such that it does not misinterpret slashes in the path as the authority. Closes #34433 --- .../client/RequestConverters.java | 4 ++- .../client/RequestConvertersTests.java | 32 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) 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 860788e0157..023bd1fe637 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 @@ final class RequestConverters { //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 e3807b60679..6be59b687d3 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 class RequestConvertersTests extends ESTestCase { .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() {