From ebfa3b97ba069c55b2205b104230635f1494f13b Mon Sep 17 00:00:00 2001 From: Thomas Becker Date: Fri, 19 Jul 2013 14:01:14 +0200 Subject: 410800 Make RewritePatternRule queryString aware --- .../jetty/rewrite/handler/RewritePatternRule.java | 54 +++++++++++++++++----- 1 file changed, 43 insertions(+), 11 deletions(-) (limited to 'jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewritePatternRule.java') diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewritePatternRule.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewritePatternRule.java index 48047b8647..d6bd65d15e 100644 --- a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewritePatternRule.java +++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RewritePatternRule.java @@ -19,20 +19,21 @@ package org.eclipse.jetty.rewrite.handler; import java.io.IOException; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jetty.http.HttpURI; import org.eclipse.jetty.http.PathMap; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.util.URIUtil; /** - * Rewrite the URI by replacing the matched {@link PathMap} path with a fixed string. + * Rewrite the URI by replacing the matched {@link PathMap} path with a fixed string. */ public class RewritePatternRule extends PatternRule implements Rule.ApplyURI { private String _replacement; + private String _query; /* ------------------------------------------------------------ */ public RewritePatternRule() @@ -44,32 +45,63 @@ public class RewritePatternRule extends PatternRule implements Rule.ApplyURI /* ------------------------------------------------------------ */ /** * Whenever a match is found, it replaces with this value. - * - * @param value the replacement string. + * + * @param replacement the replacement string. */ - public void setReplacement(String value) + public void setReplacement(String replacement) { - _replacement = value; + String[] split = replacement.split("\\?", 2); + _replacement = split[0]; + _query = split.length == 2 ? split[1] : null; } /* ------------------------------------------------------------ */ /* * (non-Javadoc) - * @see org.eclipse.jetty.server.handler.rules.RuleBase#apply(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) + * + * @see org.eclipse.jetty.server.handler.rules.RuleBase#apply(javax.servlet.http.HttpServletRequest, + * javax.servlet.http.HttpServletResponse) */ @Override public String apply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException { - target = URIUtil.addPaths(_replacement, PathMap.pathInfo(_pattern,target)); + target = URIUtil.addPaths(_replacement, PathMap.pathInfo(_pattern, target)); return target; } /* ------------------------------------------------------------ */ + + /** + * This method will add _query to the requests's queryString and also combine it with existing queryStrings in + * the request. However it won't take care for duplicate. E.g. if request.getQueryString contains a parameter + * "param1 = true" and _query will contain "param1=false" the result will be param1=true¶m1=false. + * To cover this use case some more complex pattern matching is necessary. We can implement this if there's use + * cases. + * + * @param request + * @param oldTarget + * @param newTarget + * @throws IOException + */ @Override - public void applyURI(Request request, String oldTarget, String newTarget) throws IOException + public void applyURI(Request request, String oldTarget, String newTarget) throws IOException { - String uri = URIUtil.addPaths(_replacement, PathMap.pathInfo(_pattern,request.getRequestURI())); - request.setRequestURI(uri); + if (_query == null) + { + request.setRequestURI(newTarget); + } + else + { + String queryString = request.getQueryString(); + if (queryString != null) + queryString = queryString + "&" + _query; + else + queryString = _query; + HttpURI uri = new HttpURI(newTarget + "?" + queryString); + request.setUri(uri); + request.setRequestURI(newTarget); + request.setQueryString(queryString); + } } /* ------------------------------------------------------------ */ -- cgit v1.2.3