1 //======================================================================== 2 //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd. 3 //------------------------------------------------------------------------ 4 //Licensed under the Apache License, Version 2.0 (the "License"); 5 //you may not use this file except in compliance with the License. 6 //You may obtain a copy of the License at 7 //http://www.apache.org/licenses/LICENSE-2.0 8 //Unless required by applicable law or agreed to in writing, software 9 //distributed under the License is distributed on an "AS IS" BASIS, 10 //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 //See the License for the specific language governing permissions and 12 //limitations under the License. 13 //======================================================================== 14 15 package org.mortbay.jetty.servlet; 16 17 18 import java.io.IOException; 19 import java.util.Arrays; 20 import java.util.Collections; 21 import java.util.List; 22 23 import javax.servlet.RequestDispatcher; 24 import javax.servlet.Servlet; 25 import javax.servlet.ServletException; 26 import javax.servlet.http.HttpServlet; 27 import javax.servlet.http.HttpServletRequest; 28 import javax.servlet.http.HttpServletResponse; 29 30 import junit.framework.TestCase; 31 32 import org.mortbay.jetty.LocalConnector; 33 import org.mortbay.jetty.Server; 34 35 public class DispatcherTest extends TestCase 36 { 37 private Server _server = new Server(); 38 private LocalConnector _connector; 39 private Context _context; 40 setUp()41 protected void setUp() throws Exception 42 { 43 _server = new Server(); 44 _server.setSendServerVersion(false); 45 _connector = new LocalConnector(); 46 _context = new Context(); 47 _context.setContextPath("/context"); 48 _server.addHandler(_context); 49 _server.addConnector( _connector ); 50 51 _server.start(); 52 } 53 testForward()54 public void testForward() throws Exception 55 { 56 _context.addServlet(ForwardServlet.class, "/ForwardServlet/*"); 57 _context.addServlet(AssertForwardServlet.class, "/AssertForwardServlet/*"); 58 59 String expected= 60 "HTTP/1.1 200 OK\r\n"+ 61 "Content-Type: text/html\r\n"+ 62 "Content-Length: 0\r\n"+ 63 "\r\n"; 64 65 String responses = _connector.getResponses("GET /context/ForwardServlet?do=assertforward&do=more&test=1 HTTP/1.1\n" + "Host: localhost\n\n"); 66 67 assertEquals(expected, responses); 68 } 69 testInclude()70 public void testInclude() throws Exception 71 { 72 _context.addServlet(IncludeServlet.class, "/IncludeServlet/*"); 73 _context.addServlet(AssertIncludeServlet.class, "/AssertIncludeServlet/*"); 74 75 String expected= 76 "HTTP/1.1 200 OK\r\n"+ 77 "Content-Length: 0\r\n"+ 78 "\r\n"; 79 80 String responses = _connector.getResponses("GET /context/IncludeServlet?do=assertinclude&do=more&test=1 HTTP/1.1\n" + "Host: localhost\n\n"); 81 82 assertEquals(expected, responses); 83 } 84 testForwardThenInclude()85 public void testForwardThenInclude() throws Exception 86 { 87 _context.addServlet(ForwardServlet.class, "/ForwardServlet/*"); 88 _context.addServlet(IncludeServlet.class, "/IncludeServlet/*"); 89 _context.addServlet(AssertForwardIncludeServlet.class, "/AssertForwardIncludeServlet/*"); 90 91 String expected= 92 "HTTP/1.1 200 OK\r\n"+ 93 "Content-Length: 0\r\n"+ 94 "\r\n"; 95 96 String responses = _connector.getResponses("GET /context/ForwardServlet/forwardpath?do=include HTTP/1.1\n" + "Host: localhost\n\n"); 97 98 assertEquals(expected, responses); 99 } 100 testIncludeThenForward()101 public void testIncludeThenForward() throws Exception 102 { 103 _context.addServlet(IncludeServlet.class, "/IncludeServlet/*"); 104 _context.addServlet(ForwardServlet.class, "/ForwardServlet/*"); 105 _context.addServlet(AssertIncludeForwardServlet.class, "/AssertIncludeForwardServlet/*"); 106 107 108 String expected= 109 "HTTP/1.1 200 OK\r\n"+ 110 "Transfer-Encoding: chunked\r\n"+ 111 "\r\n"+ 112 "0\r\n"+ 113 "\r\n"; 114 115 String responses = _connector.getResponses("GET /context/IncludeServlet/includepath?do=forward HTTP/1.1\n" + "Host: localhost\n\n"); 116 117 assertEquals(expected, responses); 118 } 119 120 public static class ForwardServlet extends HttpServlet implements Servlet 121 { doGet(HttpServletRequest request, HttpServletResponse response)122 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 123 { 124 RequestDispatcher dispatcher = null; 125 126 if(request.getParameter("do").equals("include")) 127 dispatcher = getServletContext().getRequestDispatcher("/IncludeServlet/includepath?do=assertforwardinclude"); 128 else if(request.getParameter("do").equals("assertincludeforward")) 129 dispatcher = getServletContext().getRequestDispatcher("/AssertIncludeForwardServlet/assertpath?do=end"); 130 else if(request.getParameter("do").equals("assertforward")) 131 dispatcher = getServletContext().getRequestDispatcher("/AssertForwardServlet?do=end&do=the"); 132 dispatcher.forward(request, response); 133 } 134 } 135 136 public static class IncludeServlet extends HttpServlet implements Servlet 137 { doGet(HttpServletRequest request, HttpServletResponse response)138 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 139 { 140 RequestDispatcher dispatcher = null; 141 142 if(request.getParameter("do").equals("forward")) 143 dispatcher = getServletContext().getRequestDispatcher("/ForwardServlet/forwardpath?do=assertincludeforward"); 144 else if(request.getParameter("do").equals("assertforwardinclude")) 145 dispatcher = getServletContext().getRequestDispatcher("/AssertForwardIncludeServlet/assertpath?do=end"); 146 else if(request.getParameter("do").equals("assertinclude")) 147 dispatcher = getServletContext().getRequestDispatcher("/AssertIncludeServlet?do=end&do=the"); 148 dispatcher.include(request, response); 149 } 150 } 151 152 public static class AssertForwardServlet extends HttpServlet implements Servlet 153 { doGet(HttpServletRequest request, HttpServletResponse response)154 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 155 { 156 assertEquals( Boolean.TRUE, (Boolean)request.getAttribute(Dispatcher.__FORWARD_JETTY) ); 157 assertEquals( "/context/ForwardServlet", request.getAttribute(Dispatcher.__FORWARD_REQUEST_URI)); 158 assertEquals( "/context", request.getAttribute(Dispatcher.__FORWARD_CONTEXT_PATH) ); 159 assertEquals( "/ForwardServlet", request.getAttribute(Dispatcher.__FORWARD_SERVLET_PATH)); 160 assertEquals( null, request.getAttribute(Dispatcher.__FORWARD_PATH_INFO)); 161 assertEquals( "do=assertforward&do=more&test=1", request.getAttribute(Dispatcher.__FORWARD_QUERY_STRING) ); 162 163 164 List expectedAttributeNames = Arrays.asList(new String[] { 165 Dispatcher.__FORWARD_REQUEST_URI, Dispatcher.__FORWARD_CONTEXT_PATH, 166 Dispatcher.__FORWARD_SERVLET_PATH, Dispatcher.__FORWARD_QUERY_STRING 167 }); 168 List requestAttributeNames = Collections.list(request.getAttributeNames()); 169 assertTrue(requestAttributeNames.containsAll(expectedAttributeNames)); 170 171 172 assertEquals(null, request.getPathInfo()); 173 assertEquals(null, request.getPathTranslated()); 174 assertEquals("do=end&do=the&test=1", request.getQueryString()); 175 assertEquals("/context/AssertForwardServlet", request.getRequestURI()); 176 assertEquals("/context", request.getContextPath()); 177 assertEquals("/AssertForwardServlet", request.getServletPath()); 178 179 response.setContentType("text/html"); 180 response.setStatus(HttpServletResponse.SC_OK); 181 182 } 183 } 184 185 public static class AssertIncludeServlet extends HttpServlet implements Servlet 186 { doGet(HttpServletRequest request, HttpServletResponse response)187 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 188 { 189 assertEquals( Boolean.TRUE, (Boolean)request.getAttribute(Dispatcher.__INCLUDE_JETTY) ); 190 assertEquals( "/context/AssertIncludeServlet", request.getAttribute(Dispatcher.__INCLUDE_REQUEST_URI)); 191 assertEquals( "/context", request.getAttribute(Dispatcher.__INCLUDE_CONTEXT_PATH) ); 192 assertEquals( "/AssertIncludeServlet", request.getAttribute(Dispatcher.__INCLUDE_SERVLET_PATH)); 193 assertEquals( null, request.getAttribute(Dispatcher.__INCLUDE_PATH_INFO)); 194 assertEquals( "do=end&do=the", request.getAttribute(Dispatcher.__INCLUDE_QUERY_STRING)); 195 196 List expectedAttributeNames = Arrays.asList(new String[] { 197 Dispatcher.__INCLUDE_REQUEST_URI, Dispatcher.__INCLUDE_CONTEXT_PATH, 198 Dispatcher.__INCLUDE_SERVLET_PATH, Dispatcher.__INCLUDE_QUERY_STRING 199 }); 200 List requestAttributeNames = Collections.list(request.getAttributeNames()); 201 assertTrue(requestAttributeNames.containsAll(expectedAttributeNames)); 202 203 204 205 assertEquals(null, request.getPathInfo()); 206 assertEquals(null, request.getPathTranslated()); 207 assertEquals("do=assertinclude&do=more&test=1", request.getQueryString()); 208 assertEquals("/context/IncludeServlet", request.getRequestURI()); 209 assertEquals("/context", request.getContextPath()); 210 assertEquals("/IncludeServlet", request.getServletPath()); 211 212 response.setContentType("text/html"); 213 response.setStatus(HttpServletResponse.SC_OK); 214 215 } 216 } 217 218 219 public static class AssertForwardIncludeServlet extends HttpServlet implements Servlet 220 { doGet(HttpServletRequest request, HttpServletResponse response)221 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 222 { 223 // include doesn't hide forward 224 assertEquals( Boolean.TRUE, (Boolean)request.getAttribute(Dispatcher.__FORWARD_JETTY) ); 225 assertEquals( "/context/ForwardServlet/forwardpath", request.getAttribute(Dispatcher.__FORWARD_REQUEST_URI)); 226 assertEquals( "/context", request.getAttribute(Dispatcher.__FORWARD_CONTEXT_PATH) ); 227 assertEquals( "/ForwardServlet", request.getAttribute(Dispatcher.__FORWARD_SERVLET_PATH)); 228 assertEquals( "/forwardpath", request.getAttribute(Dispatcher.__FORWARD_PATH_INFO)); 229 assertEquals( "do=include", request.getAttribute(Dispatcher.__FORWARD_QUERY_STRING) ); 230 231 assertEquals( Boolean.TRUE, (Boolean)request.getAttribute(Dispatcher.__INCLUDE_JETTY) ); 232 assertEquals( "/context/AssertForwardIncludeServlet/assertpath", request.getAttribute(Dispatcher.__INCLUDE_REQUEST_URI)); 233 assertEquals( "/context", request.getAttribute(Dispatcher.__INCLUDE_CONTEXT_PATH) ); 234 assertEquals( "/AssertForwardIncludeServlet", request.getAttribute(Dispatcher.__INCLUDE_SERVLET_PATH)); 235 assertEquals( "/assertpath", request.getAttribute(Dispatcher.__INCLUDE_PATH_INFO)); 236 assertEquals( "do=end", request.getAttribute(Dispatcher.__INCLUDE_QUERY_STRING)); 237 238 239 List expectedAttributeNames = Arrays.asList(new String[] { 240 Dispatcher.__FORWARD_REQUEST_URI, Dispatcher.__FORWARD_CONTEXT_PATH, Dispatcher.__FORWARD_SERVLET_PATH, 241 Dispatcher.__FORWARD_PATH_INFO, Dispatcher.__FORWARD_QUERY_STRING, 242 Dispatcher.__INCLUDE_REQUEST_URI, Dispatcher.__INCLUDE_CONTEXT_PATH, Dispatcher.__INCLUDE_SERVLET_PATH, 243 Dispatcher.__INCLUDE_PATH_INFO, Dispatcher.__INCLUDE_QUERY_STRING 244 }); 245 List requestAttributeNames = Collections.list(request.getAttributeNames()); 246 assertTrue(requestAttributeNames.containsAll(expectedAttributeNames)); 247 248 249 assertEquals("/includepath", request.getPathInfo()); 250 assertEquals(null, request.getPathTranslated()); 251 assertEquals("do=assertforwardinclude", request.getQueryString()); 252 assertEquals("/context/IncludeServlet/includepath", request.getRequestURI()); 253 assertEquals("/context", request.getContextPath()); 254 assertEquals("/IncludeServlet", request.getServletPath()); 255 256 response.setContentType("text/html"); 257 response.setStatus(HttpServletResponse.SC_OK); 258 } 259 } 260 261 public static class AssertIncludeForwardServlet extends HttpServlet implements Servlet 262 { doGet(HttpServletRequest request, HttpServletResponse response)263 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 264 { 265 // forward hides include 266 assertEquals( null, request.getAttribute(Dispatcher.__INCLUDE_JETTY) ); 267 assertEquals( null, request.getAttribute(Dispatcher.__INCLUDE_REQUEST_URI)); 268 assertEquals( null, request.getAttribute(Dispatcher.__INCLUDE_CONTEXT_PATH) ); 269 assertEquals( null, request.getAttribute(Dispatcher.__INCLUDE_SERVLET_PATH)); 270 assertEquals( null, request.getAttribute(Dispatcher.__INCLUDE_PATH_INFO)); 271 assertEquals( null, request.getAttribute(Dispatcher.__INCLUDE_QUERY_STRING)); 272 273 assertEquals( Boolean.TRUE, (Boolean)request.getAttribute(Dispatcher.__FORWARD_JETTY) ); 274 assertEquals( "/context/IncludeServlet/includepath", request.getAttribute(Dispatcher.__FORWARD_REQUEST_URI)); 275 assertEquals( "/context", request.getAttribute(Dispatcher.__FORWARD_CONTEXT_PATH) ); 276 assertEquals( "/IncludeServlet", request.getAttribute(Dispatcher.__FORWARD_SERVLET_PATH)); 277 assertEquals( "/includepath", request.getAttribute(Dispatcher.__FORWARD_PATH_INFO)); 278 assertEquals( "do=forward", request.getAttribute(Dispatcher.__FORWARD_QUERY_STRING) ); 279 280 281 List expectedAttributeNames = Arrays.asList(new String[] { 282 Dispatcher.__FORWARD_REQUEST_URI, Dispatcher.__FORWARD_CONTEXT_PATH, Dispatcher.__FORWARD_SERVLET_PATH, 283 Dispatcher.__FORWARD_PATH_INFO, Dispatcher.__FORWARD_QUERY_STRING, 284 }); 285 List requestAttributeNames = Collections.list(request.getAttributeNames()); 286 assertTrue(requestAttributeNames.containsAll(expectedAttributeNames)); 287 288 289 assertEquals("/assertpath", request.getPathInfo()); 290 assertEquals(null, request.getPathTranslated()); 291 assertEquals("do=end", request.getQueryString()); 292 assertEquals("/context/AssertIncludeForwardServlet/assertpath", request.getRequestURI()); 293 assertEquals("/context", request.getContextPath()); 294 assertEquals("/AssertIncludeForwardServlet", request.getServletPath()); 295 296 response.setContentType("text/html"); 297 response.setStatus(HttpServletResponse.SC_OK); 298 } 299 } 300 301 } 302