| // |
| // ======================================================================== |
| // 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 static org.junit.Assert.assertTrue; |
| |
| import java.io.IOException; |
| |
| import javax.servlet.ServletException; |
| import javax.servlet.http.HttpServletRequest; |
| import javax.servlet.http.HttpServletResponse; |
| |
| import org.eclipse.jetty.server.Request; |
| import org.eclipse.jetty.server.handler.AbstractHandler; |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| public class RewriteHandlerTest extends AbstractRuleTestCase |
| { |
| private RewriteHandler _handler; |
| private RewritePatternRule _rule1; |
| private RewritePatternRule _rule2; |
| private RewritePatternRule _rule3; |
| private RewriteRegexRule _rule4; |
| |
| @Before |
| public void init() throws Exception |
| { |
| _handler=new RewriteHandler(); |
| _handler.setServer(_server); |
| _handler.setHandler(new AbstractHandler() |
| { |
| @Override |
| public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException |
| { |
| response.setStatus(201); |
| request.setAttribute("target",target); |
| request.setAttribute("URI",request.getRequestURI()); |
| request.setAttribute("info",request.getPathInfo()); |
| } |
| |
| }); |
| _handler.start(); |
| |
| _rule1 = new RewritePatternRule(); |
| _rule1.setPattern("/aaa/*"); |
| _rule1.setReplacement("/bbb"); |
| _rule2 = new RewritePatternRule(); |
| _rule2.setPattern("/bbb/*"); |
| _rule2.setReplacement("/ccc"); |
| _rule3 = new RewritePatternRule(); |
| _rule3.setPattern("/ccc/*"); |
| _rule3.setReplacement("/ddd"); |
| _rule4 = new RewriteRegexRule(); |
| _rule4.setRegex("/xxx/(.*)"); |
| _rule4.setReplacement("/$1/zzz"); |
| |
| _handler.setRules(new Rule[]{_rule1,_rule2,_rule3,_rule4}); |
| |
| start(false); |
| } |
| |
| @Test |
| public void test() throws Exception |
| { |
| _response.setStatus(200); |
| _request.setHandled(false); |
| _handler.setOriginalPathAttribute("/before"); |
| _handler.setRewriteRequestURI(true); |
| _handler.setRewritePathInfo(true); |
| _request.setRequestURI("/xxx/bar"); |
| _request.setPathInfo("/xxx/bar"); |
| _handler.handle("/xxx/bar",_request,_request, _response); |
| assertEquals(201,_response.getStatus()); |
| assertEquals("/bar/zzz",_request.getAttribute("target")); |
| assertEquals("/bar/zzz",_request.getAttribute("URI")); |
| assertEquals("/bar/zzz",_request.getAttribute("info")); |
| assertEquals(null,_request.getAttribute("before")); |
| |
| _response.setStatus(200); |
| _request.setHandled(false); |
| _handler.setOriginalPathAttribute("/before"); |
| _handler.setRewriteRequestURI(false); |
| _handler.setRewritePathInfo(false); |
| _request.setRequestURI("/foo/bar"); |
| _request.setPathInfo("/foo/bar"); |
| |
| _handler.handle("/foo/bar",_request,_request, _response); |
| assertEquals(201,_response.getStatus()); |
| assertEquals("/foo/bar",_request.getAttribute("target")); |
| assertEquals("/foo/bar",_request.getAttribute("URI")); |
| assertEquals("/foo/bar",_request.getAttribute("info")); |
| assertEquals(null,_request.getAttribute("before")); |
| |
| _response.setStatus(200); |
| _request.setHandled(false); |
| _handler.setOriginalPathAttribute(null); |
| _request.setRequestURI("/aaa/bar"); |
| _request.setPathInfo("/aaa/bar"); |
| _handler.handle("/aaa/bar",_request,_request, _response); |
| assertEquals(201,_response.getStatus()); |
| assertEquals("/ddd/bar",_request.getAttribute("target")); |
| assertEquals("/aaa/bar",_request.getAttribute("URI")); |
| assertEquals("/aaa/bar",_request.getAttribute("info")); |
| assertEquals(null,_request.getAttribute("before")); |
| |
| _response.setStatus(200); |
| _request.setHandled(false); |
| _handler.setOriginalPathAttribute("before"); |
| _handler.setRewriteRequestURI(true); |
| _handler.setRewritePathInfo(true); |
| _request.setRequestURI("/aaa/bar"); |
| _request.setPathInfo("/aaa/bar"); |
| _handler.handle("/aaa/bar",_request,_request, _response); |
| assertEquals(201,_response.getStatus()); |
| assertEquals("/ddd/bar",_request.getAttribute("target")); |
| assertEquals("/ddd/bar",_request.getAttribute("URI")); |
| assertEquals("/ddd/bar",_request.getAttribute("info")); |
| assertEquals("/aaa/bar",_request.getAttribute("before")); |
| |
| _response.setStatus(200); |
| _request.setHandled(false); |
| _rule2.setTerminating(true); |
| _request.setRequestURI("/aaa/bar"); |
| _request.setPathInfo("/aaa/bar"); |
| _handler.handle("/aaa/bar",_request,_request, _response); |
| assertEquals(201,_response.getStatus()); |
| assertEquals("/ccc/bar",_request.getAttribute("target")); |
| assertEquals("/ccc/bar",_request.getAttribute("URI")); |
| assertEquals("/ccc/bar",_request.getAttribute("info")); |
| assertEquals("/aaa/bar",_request.getAttribute("before")); |
| |
| _response.setStatus(200); |
| _request.setHandled(false); |
| _rule2.setHandling(true); |
| _request.setAttribute("before",null); |
| _request.setAttribute("target",null); |
| _request.setAttribute("URI",null); |
| _request.setAttribute("info",null); |
| _request.setRequestURI("/aaa/bar"); |
| _request.setPathInfo("/aaa/bar"); |
| _handler.handle("/aaa/bar",_request,_request, _response); |
| assertEquals(200,_response.getStatus()); |
| assertEquals(null,_request.getAttribute("target")); |
| assertEquals(null,_request.getAttribute("URI")); |
| assertEquals(null,_request.getAttribute("info")); |
| assertEquals("/aaa/bar",_request.getAttribute("before")); |
| assertTrue(_request.isHandled()); |
| } |
| |
| |
| @Test |
| public void testEncodedPattern() throws Exception |
| { |
| _response.setStatus(200); |
| _request.setHandled(false); |
| _handler.setOriginalPathAttribute("/before"); |
| _handler.setRewriteRequestURI(true); |
| _handler.setRewritePathInfo(false); |
| _request.setRequestURI("/ccc/x%20y"); |
| _request.setPathInfo("/ccc/x y"); |
| _handler.handle("/ccc/x y",_request,_request, _response); |
| assertEquals(201,_response.getStatus()); |
| assertEquals("/ddd/x y",_request.getAttribute("target")); |
| assertEquals("/ddd/x%20y",_request.getAttribute("URI")); |
| assertEquals("/ccc/x y",_request.getAttribute("info")); |
| |
| } |
| |
| |
| @Test |
| public void testEncodedRegex() throws Exception |
| { |
| _response.setStatus(200); |
| _request.setHandled(false); |
| _handler.setOriginalPathAttribute("/before"); |
| _handler.setRewriteRequestURI(true); |
| _handler.setRewritePathInfo(false); |
| _request.setRequestURI("/xxx/x%20y"); |
| _request.setPathInfo("/xxx/x y"); |
| _handler.handle("/xxx/x y",_request,_request, _response); |
| assertEquals(201,_response.getStatus()); |
| assertEquals("/x y/zzz",_request.getAttribute("target")); |
| assertEquals("/x%20y/zzz",_request.getAttribute("URI")); |
| assertEquals("/xxx/x y",_request.getAttribute("info")); |
| |
| } |
| } |