Skip to content

Commit

Permalink
HLRC: fix uri encode bug when url path starts with '/' (#34436)
Browse files Browse the repository at this point in the history
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
  • Loading branch information
roycarser authored and hub-cap committed Apr 4, 2019
1 parent cd8dd04 commit 629d2ea
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down

0 comments on commit 629d2ea

Please sign in to comment.