in dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/util/PathUtils.java [96:153]
public static String combine(@Nonnull String path1, @Nonnull String path2) {
if (path1.isEmpty()) {
return path2.isEmpty() ? StringUtils.EMPTY_STRING : path2;
}
if (path2.isEmpty()) {
return path1;
}
int len1 = path1.length();
char last1 = path1.charAt(len1 - 1);
if (len1 == 1) {
if (last1 == '/' || last1 == '*') {
return path2;
}
} else if (path1.indexOf('{') == -1) {
if (path1.indexOf('*') != -1) {
if (PathExpression.parse(path1).match(path2) != null) {
return path2;
}
}
int starDotPos1 = path1.lastIndexOf("*.");
if (starDotPos1 > -1) {
String ext1 = path1.substring(starDotPos1 + 1);
int dotPos2 = path2.lastIndexOf('.');
String file2, ext2;
if (dotPos2 == -1) {
file2 = path2;
ext2 = StringUtils.EMPTY_STRING;
} else {
file2 = path2.substring(0, dotPos2);
ext2 = path2.substring(dotPos2);
}
boolean ext1All = ext1.equals(".*") || ext1.isEmpty();
boolean ext2All = ext2.equals(".*") || ext2.isEmpty();
if (!ext1All && !ext2All) {
throw new PathParserException(Messages.CANNOT_COMBINE_PATHS, path1, path2);
}
return file2 + (ext1All ? ext2 : ext1);
}
}
if (last1 == '*' && path1.charAt(len1 - 2) == '/') {
path1 = path1.substring(0, len1 - 2);
}
boolean slash1 = last1 == '/';
boolean slash2 = path2.charAt(0) == '/';
if (slash2 && path2.length() > 1 && path2.charAt(1) == '/') {
return path2.substring(1);
}
if (slash1) {
return slash2 ? path1 + path2.substring(1) : path1 + path2;
}
if (slash2) {
return path1 + path2;
}
return path1 + '/' + path2;
}