// // ======================================================================== // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // // You may elect to redistribute this code under either of these licenses. // ======================================================================== // package org.eclipse.jetty.rewrite.handler; import static org.junit.Assert.assertEquals; import java.io.IOException; import java.nio.charset.StandardCharsets; import org.eclipse.jetty.util.MultiMap; import org.eclipse.jetty.util.URIUtil; import org.eclipse.jetty.util.UrlEncoded; import org.junit.Before; import org.junit.Test; public class RewriteRegexRuleTest extends AbstractRuleTestCase { private String[][] _tests= { {"/foo0/bar",null,".*","/replace","/replace",null}, {"/foo1/bar","n=v",".*","/replace","/replace","n=v"}, {"/foo2/bar",null,"/xxx.*","/replace",null,null}, {"/foo3/bar",null,"/(.*)/(.*)","/$2/$1/xxx","/bar/foo3/xxx",null}, {"/f%20o3/bar",null,"/(.*)/(.*)","/$2/$1/xxx","/bar/f%20o3/xxx",null}, {"/foo4/bar",null,"/(.*)/(.*)","/test?p2=$2&p1=$1","/test","p2=bar&p1=foo4"}, {"/foo5/bar","n=v","/(.*)/(.*)","/test?p2=$2&p1=$1","/test","n=v&p2=bar&p1=foo5"}, {"/foo6/bar",null,"/(.*)/(.*)","/foo6/bar?p2=$2&p1=$1","/foo6/bar","p2=bar&p1=foo6"}, {"/foo7/bar","n=v","/(.*)/(.*)","/foo7/bar?p2=$2&p1=$1","/foo7/bar","n=v&p2=bar&p1=foo7"}, {"/foo8/bar",null,"/(foo8)/(.*)(bar)","/$3/$1/xxx$2","/bar/foo8/xxx",null}, {"/foo9/$bar",null,".*","/$replace","/$replace",null}, {"/fooA/$bar",null,"/fooA/(.*)","/$1/replace","/$bar/replace",null}, {"/fooB/bar/info",null,"/fooB/(NotHere)?([^/]*)/(.*)","/$3/other?p1=$2","/info/other","p1=bar"}, {"/fooC/bar/info",null,"/fooC/(NotHere)?([^/]*)/(.*)","/$3/other?p1=$2&$Q","/info/other","p1=bar&"}, {"/fooD/bar/info","n=v","/fooD/(NotHere)?([^/]*)/(.*)","/$3/other?p1=$2&$Q","/info/other","p1=bar&n=v"}, {"/fooE/bar/info","n=v","/fooE/(NotHere)?([^/]*)/(.*)","/$3/other?p1=$2","/info/other","n=v&p1=bar"}, }; private RewriteRegexRule _rule; @Before public void init() throws Exception { start(false); _rule=new RewriteRegexRule(); } @Test public void testRequestUriEnabled() throws IOException { for (String[] test : _tests) { reset(); _request.setURIPathQuery(null); String t=test[0]+"?"+test[1]+">"+test[2]+"|"+test[3]; _rule.setRegex(test[2]); _rule.setReplacement(test[3]); _request.setURIPathQuery(test[0]+(test[1]==null?"":("?"+test[1]))); String result = _rule.matchAndApply(test[0], _request, _response); assertEquals(t, test[4], result); _rule.applyURI(_request,test[0],result); if (result!=null) { assertEquals(t,test[4], _request.getRequestURI()); assertEquals(t,test[5], _request.getQueryString()); } if (test[5]!=null) { MultiMap<String> params=new MultiMap<String>(); UrlEncoded.decodeTo(test[5],params, StandardCharsets.UTF_8); for (String n:params.keySet()) assertEquals(params.getString(n),_request.getParameter(n)); } } } @Test public void testContainedRequestUriEnabled() throws IOException { RuleContainer container = new RuleContainer(); container.setRewriteRequestURI(true); container.addRule(_rule); for (String[] test : _tests) { reset(); String t=test[0]+"?"+test[1]+">"+test[2]+"|"+test[3]; _rule.setRegex(test[2]); _rule.setReplacement(test[3]); _request.setURIPathQuery(test[0]); _request.setQueryString(test[1]); _request.getAttributes().clearAttributes(); String result = container.apply(URIUtil.decodePath(test[0]),_request,_response); assertEquals(t,URIUtil.decodePath(test[4]==null?test[0]:test[4]), result); assertEquals(t,test[4]==null?test[0]:test[4], _request.getRequestURI()); assertEquals(t,test[5], _request.getQueryString()); } } }