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
This commit is contained in:
roy 2019-04-05 01:58:41 +08:00 committed by Michael Basnight
parent 5347dec55e
commit 075078e7e0
2 changed files with 35 additions and 1 deletions

View File

@ -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) {

View File

@ -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() {