/* (c) 2016 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.params.extractor;
import org.geoserver.config.GeoServerDataDirectory;
import org.geoserver.ows.Dispatcher;
import org.geoserver.ows.Request;
import org.geoserver.ows.URLMangler;
import org.geoserver.ows.util.KvpMap;
import org.geoserver.ows.util.KvpUtils;
import org.geoserver.platform.resource.Resource;
import org.geoserver.platform.resource.ResourceStore;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class UrlMangler implements URLMangler {
private static final Pattern URI_PATTERN = Pattern.compile("^((?:/)[^/]+/)(.*)$");
private List<EchoParameter> echoParameters;
public UrlMangler(GeoServerDataDirectory dataDirectory) {
Resource resource = dataDirectory.get(EchoParametersDao.getEchoParametersPath());
echoParameters = EchoParametersDao.getEchoParameters(resource.in());
resource.addListener(notify -> echoParameters = EchoParametersDao.getEchoParameters(resource.in()));
}
@Override
public void mangleURL(StringBuilder baseURL, StringBuilder path, Map<String, String> kvp, URLType type) {
Request request = Dispatcher.REQUEST.get();
if (request == null || !"GetCapabilities".equalsIgnoreCase(request.getRequest())) {
return;
}
forwardOriginalUri(request, path);
Map requestRawKvp = request.getRawKvp();
if (request.getHttpRequest() instanceof RequestWrapper) {
RequestWrapper requestWrapper = (RequestWrapper) request.getHttpRequest();
Map parameters = requestWrapper.getOriginalParameters();
requestRawKvp = new KvpMap(KvpUtils.normalize(parameters));
}
forwardParameters(requestRawKvp, kvp);
}
private void forwardOriginalUri(Request request, StringBuilder path) {
String requestUri = request.getHttpRequest().getRequestURI();
if (request.getHttpRequest() instanceof RequestWrapper) {
requestUri = ((RequestWrapper) request.getHttpRequest()).getOriginalRequestURI();
}
Matcher matcher = URI_PATTERN.matcher(requestUri);
if (!matcher.matches()) {
return;
}
path.delete(0, path.length());
path.append(matcher.group(2));
}
private void forwardParameters(Map requestRawKvp, Map<String, String> kvp) {
for (EchoParameter echoParameter : echoParameters) {
if (!echoParameter.getActivated()) {
continue;
}
Map.Entry rawParameter = Utils.caseInsensitiveSearch(echoParameter.getParameter(), requestRawKvp);
if (rawParameter != null && Utils.caseInsensitiveSearch(echoParameter.getParameter(), kvp) == null) {
if (rawParameter.getValue() instanceof String) {
kvp.put((String) rawParameter.getKey(), (String) rawParameter.getValue());
}
}
}
}
}