forked from elastic/elasticsearch
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Restore support for escaped '/' as part of document id
With elastic#13691 we introduced some custom logic to make sure that date math expressions like <logstash-{now/D}> don't get broken up into two where the slash appears in the expression. That said the only correct way to provide such a date math expression as part of the uri would be to properly escape the '/' instead. This fix also introduced a regression, as it would make sure that unescaped '/' are handled only in the case of date math expressions, but it removed support for properly escaped slashes anywhere else. The solution is to keep supporting escaped slashes only and require client libraries to properly escape them. This commit reverts 93ad696 and makes sure that our REST tests runner supports escaping of path parts, which was more involving than expected as each single part of the path needs to be properly escaped. I am not too happy with the current solution but it's the best I could do for now, maybe not that concerning anyway given that it's just test code. I do find uri encoding quite frustrating in java. Relates to elastic#13691 Relates to elastic#13665 Closes elastic#14177 Closes elastic#14216
- Loading branch information
Showing
7 changed files
with
176 additions
and
157 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
97 changes: 97 additions & 0 deletions
97
core/src/test/java/org/elasticsearch/test/rest/client/RestPath.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
/* | ||
* Licensed to Elasticsearch under one or more contributor | ||
* license agreements. See the NOTICE file distributed with | ||
* this work for additional information regarding copyright | ||
* ownership. Elasticsearch licenses this file to you under | ||
* the Apache License, Version 2.0 (the "License"); you may | ||
* not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, | ||
* software distributed under the License is distributed on an | ||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
* KIND, either express or implied. See the License for the | ||
* specific language governing permissions and limitations | ||
* under the License. | ||
*/ | ||
|
||
package org.elasticsearch.test.rest.client; | ||
|
||
import java.util.*; | ||
|
||
public class RestPath { | ||
private final List<PathPart> parts; | ||
private final List<String> placeholders; | ||
|
||
public RestPath(List<String> parts) { | ||
List<PathPart> pathParts = new ArrayList<>(parts.size()); | ||
for (String part : parts) { | ||
pathParts.add(new PathPart(part, false)); | ||
} | ||
this.parts = pathParts; | ||
this.placeholders = Collections.emptyList(); | ||
} | ||
|
||
public RestPath(String path) { | ||
String[] pathParts = path.split("/"); | ||
List<String> placeholders = new ArrayList<>(); | ||
List<PathPart> parts = new ArrayList<>(); | ||
for (String pathPart : pathParts) { | ||
if (pathPart.length() > 0) { | ||
if (pathPart.startsWith("{")) { | ||
if (pathPart.indexOf('}') != pathPart.length() - 1) { | ||
throw new IllegalArgumentException("more than one parameter found in the same path part: [" + pathPart + "]"); | ||
} | ||
String placeholder = pathPart.substring(1, pathPart.length() - 1); | ||
parts.add(new PathPart(placeholder, true)); | ||
placeholders.add(placeholder); | ||
} else { | ||
parts.add(new PathPart(pathPart, false)); | ||
} | ||
} | ||
} | ||
this.placeholders = placeholders; | ||
this.parts = parts; | ||
} | ||
|
||
public String[] getPathParts() { | ||
String[] parts = new String[this.parts.size()]; | ||
int i = 0; | ||
for (PathPart part : this.parts) { | ||
parts[i++] = part.pathPart; | ||
} | ||
return parts; | ||
} | ||
|
||
public boolean matches(Set<String> params) { | ||
return placeholders.size() == params.size() && placeholders.containsAll(params); | ||
} | ||
|
||
public RestPath replacePlaceholders(Map<String,String> params) { | ||
List<String> finalPathParts = new ArrayList<>(parts.size()); | ||
for (PathPart pathPart : parts) { | ||
if (pathPart.isPlaceholder) { | ||
String value = params.get(pathPart.pathPart); | ||
if (value == null) { | ||
throw new IllegalArgumentException("parameter [" + pathPart.pathPart + "] missing"); | ||
} | ||
finalPathParts.add(value); | ||
} else { | ||
finalPathParts.add(pathPart.pathPart); | ||
} | ||
} | ||
return new RestPath(finalPathParts); | ||
} | ||
|
||
private static class PathPart { | ||
private final boolean isPlaceholder; | ||
private final String pathPart; | ||
|
||
private PathPart(String pathPart, boolean isPlaceholder) { | ||
this.isPlaceholder = isPlaceholder; | ||
this.pathPart = pathPart; | ||
} | ||
} | ||
} |
Oops, something went wrong.