/* (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 javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public final class RequestWrapper extends HttpServletRequestWrapper { private final UrlTransform urlTransform; private final Map originalParameters; private final Pattern pathInfoPattern; private final Pattern servletPathPattern; private final String pathInfo; private final String servletPath; private final Map<String, String[]> parameters; public RequestWrapper(UrlTransform urlTransform, HttpServletRequest request) { super(request); this.urlTransform = urlTransform; originalParameters = request.getParameterMap(); pathInfoPattern = Pattern.compile("^" + request.getContextPath() + "([^/]+?).*$"); servletPathPattern = Pattern.compile("^" + request.getContextPath() + "[^/]+?/([^/]+?).*$"); pathInfo = extractPathInfo(urlTransform.getOriginalRequestUri()); servletPath = extractServletPath(urlTransform.getOriginalRequestUri()); parameters = new HashMap<>(super.getParameterMap()); parameters.putAll(urlTransform.getParameters()); } public Map getOriginalParameters() { return originalParameters; } @Override public String getPathInfo() { return pathInfo; } @Override public String getServletPath() { return servletPath; } public String getOriginalRequestURI() { return urlTransform.getOriginalRequestUri(); } @Override public String getRequestURI() { return urlTransform.getRequestUri(); } @Override public String getQueryString() { return urlTransform.getQueryString(); } @Override public String getParameter(String name) { String[] value = parameters.get(name); if (value != null) { return value[0]; } return null; } @Override public Map<String, String[]> getParameterMap() { return parameters; } @Override public Enumeration<String> getParameterNames() { return Collections.enumeration(parameters.keySet()); } @Override public String[] getParameterValues(final String name) { return getParameterMap().get(name); } private String extractPathInfo(String requestUri) { Matcher matcher = pathInfoPattern.matcher(requestUri); if (matcher.matches()) { return matcher.group(1); } return ""; } private String extractServletPath(String requestUri) { Matcher matcher = servletPathPattern.matcher(requestUri); if (matcher.matches()) { return matcher.group(1); } return ""; } }