package org.apache.catalina.valves.rewrite; import java.nio.charset.StandardCharsets; import org.junit.Assert; import org.junit.Test; import org.apache.catalina.Context; import org.apache.catalina.servlets.DefaultServlet; import org.apache.catalina.startup.Tomcat; import org.apache.catalina.startup.TomcatBaseTest; import org.apache.tomcat.util.buf.ByteChunk; public class TestRedirect extends TomcatBaseTest { @Test public void testNonAsciiQueryString() throws Exception { doTestRewrite("RewriteRule ^/b/(.*)/(.*) /c?filename=$1&$2 [B]", "/b/file01/id=%E5%9C%A8%E7%BA%BF%E6%B5%8B%E8%AF%95", "/c", "filename=file01&id=%E5%9C%A8%E7%BA%BF%E6%B5%8B%E8%AF%95"); } @Test public void testNonAsciiQueryStringAndRedirectPath() throws Exception { doTestRewrite("RewriteRule ^/b/(.*)/(.*)/(.*) /c/$1?filename=$2&$3 [B,R]", "/b/%E5%9C%A8%E7%BA%BF/file01/id=%E6%B5%8B%E8%AF%95", "/c/%E5%9C%A8%E7%BA%BF", "filename=file01&id=%E6%B5%8B%E8%AF%95"); } @SuppressWarnings("deprecation") private void doTestRewrite(String config, String request, String expectedURI, String expectedQueryString) throws Exception { Tomcat tomcat = getTomcatInstance(); // No file system docBase required Context ctx = tomcat.addContext("", null); RewriteValve rewriteValve = new RewriteValve(); ctx.getPipeline().addValve(rewriteValve); rewriteValve.setConfiguration(config); Tomcat.addServlet(ctx, "snoop", new SnoopServlet()); ctx.addServletMappingDecoded("/a/%5A", "snoop"); ctx.addServletMappingDecoded("/c/*", "snoop"); Tomcat.addServlet(ctx, "default", new DefaultServlet()); ctx.addServletMappingDecoded("/", "default"); tomcat.start(); ByteChunk res = getUrl("http://localhost:" + getPort() + request); res.setCharset(StandardCharsets.UTF_8); String body = res.toString(); RequestDescriptor requestDesc = SnoopResult.parse(body); //System.out.println(request+" "+ body); String requestURI = requestDesc.getRequestInfo("REQUEST-URI"); Assert.assertEquals(expectedURI, requestURI); if (expectedQueryString != null) { String queryString = requestDesc.getRequestInfo("REQUEST-QUERY-STRING"); Assert.assertEquals(expectedQueryString, queryString); } } }