in src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/URIManipulationFilterExtension.java [68:109]
public Object call(RenderContext renderContext, Object... arguments) {
ExtensionUtils.checkArgumentCount(RuntimeExtension.URI_MANIPULATION, arguments, 2);
RuntimeObjectModel runtimeObjectModel = renderContext.getObjectModel();
String uriString = runtimeObjectModel.toString(arguments[0]);
Map<String, Object> options = runtimeObjectModel.toMap(arguments[1]);
try {
URI originalUri = new URI(uriString);
// read in https://docs.oracle.com/javase/7/docs/api/java/net/URI.html in section "Identities"
// which constructors to use for which use case
final URI transformedUri;
final String scheme = getOption(SCHEME, options, originalUri.getScheme(), true);
final String fragment = getOption(FRAGMENT, options, originalUri.getFragment(), false);
// first check which type of URI
if (originalUri.isOpaque()) {
// only scheme and fragment is relevant
transformedUri = new URI(scheme, originalUri.getSchemeSpecificPart(), fragment);
return transformedUri.toString();
} else {
// only server-based authorities are supported
try {
originalUri = originalUri.parseServerAuthority();
} catch (URISyntaxException e) {
LOG.warn("Only server-based authorities are supported for non-opaque URLs");
throw e;
}
final String host = getOption(DOMAIN, options, originalUri.getHost(), true);
final String path =
getPath(runtimeObjectModel, originalUri.getPath(), options, scheme != null || host != null);
final String escapedQuery = getEscapedQuery(runtimeObjectModel, originalUri.getRawQuery(), options);
// the URI constructor will escape the % in the query part again, we must revert that
transformedUri = new URI(
scheme, originalUri.getUserInfo(), host, originalUri.getPort(), path, escapedQuery, fragment);
return unescapePercentInQuery(transformedUri.toString());
}
} catch (URISyntaxException e) {
LOG.warn("Cannot manipulate invalid URI '{}'", uriString, e);
}
return uriString;
}