diff --git a/src/main/java/org/mitre/dsmiley/httpproxy/URITemplateProxyServlet.java b/src/main/java/org/mitre/dsmiley/httpproxy/URITemplateProxyServlet.java index b0e9da9..e9be8ae 100644 --- a/src/main/java/org/mitre/dsmiley/httpproxy/URITemplateProxyServlet.java +++ b/src/main/java/org/mitre/dsmiley/httpproxy/URITemplateProxyServlet.java @@ -27,6 +27,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URLEncoder; +import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -100,9 +101,9 @@ protected void service(HttpServletRequest servletRequest, HttpServletResponse se } catch (URISyntaxException e) { throw new ServletException("Unexpected URI parsing error on " + queryString, e); } - LinkedHashMap params = new LinkedHashMap(); + LinkedHashMap> params = new LinkedHashMap<>(); for (NameValuePair pair : pairs) { - params.put(pair.getName(), pair.getValue()); + params.computeIfAbsent(pair.getName(), k -> new ArrayList<>()).add(pair.getValue()); } //Now rewrite the URL @@ -110,11 +111,11 @@ protected void service(HttpServletRequest servletRequest, HttpServletResponse se Matcher matcher = TEMPLATE_PATTERN.matcher(targetUriTemplate); while (matcher.find()) { String arg = matcher.group(1); - String replacement = params.remove(arg);//note we remove + List replacement = params.remove(arg);//note we remove if (replacement == null) { throw new ServletException("Missing HTTP parameter "+arg+" to fill the template"); } - matcher.appendReplacement(urlBuf, replacement); + matcher.appendReplacement(urlBuf, replacement.get(0)); } matcher.appendTail(urlBuf); String newTargetUri = urlBuf.toString(); @@ -129,12 +130,14 @@ protected void service(HttpServletRequest servletRequest, HttpServletResponse se //Determine the new query string based on removing the used names StringBuilder newQueryBuf = new StringBuilder(queryString.length()); - for (Map.Entry nameVal : params.entrySet()) { - if (newQueryBuf.length() > 0) - newQueryBuf.append('&'); - newQueryBuf.append(nameVal.getKey()).append('='); - if (nameVal.getValue() != null) - newQueryBuf.append( URLEncoder.encode(nameVal.getValue(), "UTF-8")); + for (Map.Entry> nameVal : params.entrySet()) { + for (String nameValElement : nameVal.getValue()) { + if (newQueryBuf.length() > 0) + newQueryBuf.append('&'); + newQueryBuf.append(nameVal.getKey()).append('='); + if (nameVal.getValue() != null) + newQueryBuf.append(URLEncoder.encode(nameValElement, "UTF-8")); + } } servletRequest.setAttribute(ATTR_QUERY_STRING, newQueryBuf.toString()); diff --git a/src/test/java/org/mitre/dsmiley/httpproxy/ProxyServletTest.java b/src/test/java/org/mitre/dsmiley/httpproxy/ProxyServletTest.java index d1279a4..15c2de7 100755 --- a/src/test/java/org/mitre/dsmiley/httpproxy/ProxyServletTest.java +++ b/src/test/java/org/mitre/dsmiley/httpproxy/ProxyServletTest.java @@ -129,7 +129,8 @@ public void tearDown() throws Exception { "/p?query=note%3ALeitbild", "/p?id=p%20i", "/p%20i", // encoded space in param then in path "/p?id=p+i", - "/pathwithquestionmark%3F%3F?from=1&to=10" // encoded question marks + "/pathwithquestionmark%3F%3F?from=1&to=10", // encoded question marks + "/multipleparamssamekey?duplicatedParam=value1&duplicatedParam=value&p3=v3" // multiple parameters with the same name }; //TODO add "/p//doubleslash//f.txt" however HTTPUnit gets in the way. See issue #24