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