blob: bc9f0da8fbbdc9a1a8843edb22257eb7fdc99cfb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2016 Raymond Augé.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Raymond Augé <raymond.auge@liferay.com> - initial implementation
******************************************************************************/
package org.eclipse.equinox.http.servlet.tests;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.equinox.http.servlet.testbase.BaseTest;
import org.eclipse.equinox.http.servlet.tests.util.BaseServlet;
import org.eclipse.equinox.http.servlet.tests.util.DispatchResultServlet;
import org.eclipse.equinox.http.servlet.tests.util.EventHandler;
import org.junit.Assert;
import org.junit.Test;
import org.osgi.service.http.HttpContext;
import org.osgi.service.http.HttpService;
import org.osgi.service.http.context.ServletContextHelper;
import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
public class DispatchingTest extends BaseTest {
@Test
public void test_crossContextDispatch1() throws Exception {
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
StringWriter writer = new StringWriter();
writer.write(request.getContextPath());
writer.write("|");
ServletContext servletContext = getServletContext().getContext("/");
writer.write(servletContext.getContextPath());
response.getWriter().write(writer.toString());
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "a");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/a");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
String response = requestAdvisor.request("a/s1/d");
Assert.assertEquals("/a|", response);
}
@Test
public void test_forwardDepth1() throws Exception {
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s2/b?u=5").forward(request, response);
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "a");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/a");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props));
String response = requestAdvisor.request("a/s1/d?p=1");
Assert.assertEquals("/a|/b|u=5|/a/s2/b|/s2|/a|/d|p=1|/a/s1/d|/s1", response);
}
@Test
public void test_forwardDepth1_WithRequestFilter() throws Exception {
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s2/b?u=5").forward(request, response);
}
};
TestFilter filter = new TestFilter() {
@Override
public void doFilter(
ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
response.getWriter().write('b');
super.doFilter(request, response, chain);
response.getWriter().write('b');
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "a");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/a");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_NAME, "F1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_DISPATCHER, new String[] {DispatcherType.REQUEST.toString()});
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_PATTERN, "/*");
registrations.add(getBundleContext().registerService(Filter.class, filter, props));
String response = requestAdvisor.request("a/s1/d?p=1");
Assert.assertEquals("/a|/b|u=5|/a/s2/b|/s2|/a|/d|p=1|/a/s1/d|/s1", response);
Assert.assertTrue(filter.getCalled());
}
@Test
public void test_forwardDepth1_WithRequestAndForwardFilter() throws Exception {
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s2/i4?u=5").forward(request, response);
}
};
TestFilter filter = new TestFilter() {
@Override
public void doFilter(
ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
response.getWriter().write('b');
super.doFilter(request, response, chain);
response.getWriter().write('b');
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "a");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/a");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_NAME, "F1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_DISPATCHER, new String[] {DispatcherType.FORWARD.toString(),DispatcherType.REQUEST.toString()});
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_PATTERN, "/*");
registrations.add(getBundleContext().registerService(Filter.class, filter, props));
String response = requestAdvisor.request("a/s1/d?p=1");
Assert.assertEquals("b/a|/i4|u=5|/a/s2/i4|/s2|/a|/d|p=1|/a/s1/d|/s1b", response);
Assert.assertEquals(2, filter.getCount());
}
@Test
public void test_forwardDepth2() throws Exception {
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s2/i2?p2=2").forward(request, response);
}
};
Servlet servlet2 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s3/i3?p3=3").forward(request, response);
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "c1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/c1");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s3/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props));
String response = requestAdvisor.request("c1/s1/i1?p1=1");
Assert.assertEquals("/c1|/i3|p3=3|/c1/s3/i3|/s3|/c1|/i1|p1=1|/c1/s1/i1|/s1", response);
}
@Test
public void test_forwardDepth3() throws Exception {
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s2/i2?p2=2").forward(request, response);
}
};
Servlet servlet2 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s3/i3?p3=3").forward(request, response);
}
};
Servlet servlet3 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s4/i4?p4=4").forward(request, response);
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "c1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/c1");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s3/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet3, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s4/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props));
String response = requestAdvisor.request("c1/s1/i1?p1=1");
Assert.assertEquals("/c1|/i4|p4=4|/c1/s4/i4|/s4|/c1|/i1|p1=1|/c1/s1/i1|/s1", response);
}
@Test
public void test_forwardNamedParameterAggregationAndPrecedence() throws Exception {
Servlet sA = new HttpServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(
HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
ServletContext servletContext = getServletContext();
RequestDispatcher requestDispatcher = servletContext.getNamedDispatcher("s2");
requestDispatcher.forward(req, resp);
}
};
Servlet sB = new HttpServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(
HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.write(String.valueOf(req.getQueryString()));
writer.write("|");
writer.write(String.valueOf(req.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING)));
writer.write("|");
writer.write(req.getParameter("p"));
writer.write("|");
writer.write(Arrays.toString(req.getParameterValues("p")));
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "c1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/c1");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "s1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
registrations.add(getBundleContext().registerService(Servlet.class, sA, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "s2");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
registrations.add(getBundleContext().registerService(Servlet.class, sB, props));
String result = requestAdvisor.request("c1/s1/a?p=1&p=2");
Assert.assertEquals("p=1&p=2|null|1|[1, 2]", result);
}
@Test
public void test_forwardNamed() throws Exception {
Servlet sA = new HttpServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(
HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
ServletContext servletContext = getServletContext();
RequestDispatcher requestDispatcher = servletContext.getNamedDispatcher("s2");
requestDispatcher.forward(req, resp);
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "c1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/c1");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "s1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
registrations.add(getBundleContext().registerService(Servlet.class, sA, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "s2");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props));
String result = requestAdvisor.request("c1/s1/a?p=1&p=2");
Assert.assertEquals("/c1|/a|p=1&p=2|/c1/s1/a|/s1|null|null|null|null|null", result);
}
@Test
public void test_forwardParameterAggregationAndPrecedence() throws Exception {
Servlet sA = new HttpServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(
HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/Servlet13B/a?p=3&p=4");
requestDispatcher.forward(req, resp);
}
};
Servlet sB = new HttpServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(
HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.write(req.getQueryString());
writer.write("|");
writer.write((String)req.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING));
writer.write("|");
writer.write(req.getParameter("p"));
writer.write("|");
writer.write(Arrays.toString(req.getParameterValues("p")));
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "S13A");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/Servlet13A/*");
registrations.add(getBundleContext().registerService(Servlet.class, sA, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "S13B");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/Servlet13B/*");
registrations.add(getBundleContext().registerService(Servlet.class, sB, props));
String result = requestAdvisor.request("Servlet13A/a?p=1&p=2");
Assert.assertEquals("p=3&p=4|p=1&p=2|3|[3, 4, 1, 2]", result);
}
@Test
public void test_forwardStreamed() throws Exception {
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s2/b?u=5").forward(request, response);
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "a");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/a");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props));
String response = requestAdvisor.request("a/s1/d?p=1");
Assert.assertEquals("/a|/b|u=5|/a/s2/b|/s2|/a|/d|p=1|/a/s1/d|/s1", response);
}
@Test
public void test_forwardStreamed_WithRequestFilter() throws Exception {
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s2/b?u=5").forward(request, response);
}
};
TestFilter filter = new TestFilter() {
@Override
public void doFilter(
ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
write(response.getOutputStream(), "b");
super.doFilter(request, response, chain);
write(response.getOutputStream(), "b");
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "a");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/a");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_NAME, "F1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_DISPATCHER, new String[] {DispatcherType.REQUEST.toString()});
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_PATTERN, "/*");
registrations.add(getBundleContext().registerService(Filter.class, filter, props));
String response = requestAdvisor.request("a/s1/d?p=1");
Assert.assertEquals("/a|/b|u=5|/a/s2/b|/s2|/a|/d|p=1|/a/s1/d|/s1", response);
Assert.assertTrue(filter.getCalled());
}
@Test
public void test_forwardStreamed_WithRequestAndForwardFilter() throws Exception {
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s2/b?u=5").forward(request, response);
}
};
TestFilter filter = new TestFilter() {
@Override
public void doFilter(
ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
write(response.getOutputStream(), "b");
super.doFilter(request, response, chain);
write(response.getOutputStream(), "b");
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "a");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/a");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_NAME, "F1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_DISPATCHER, new String[] {DispatcherType.FORWARD.toString(),DispatcherType.REQUEST.toString()});
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_PATTERN, "/*");
registrations.add(getBundleContext().registerService(Filter.class, filter, props));
String response = requestAdvisor.request("a/s1/d?p=1");
Assert.assertEquals("b/a|/b|u=5|/a/s2/b|/s2|/a|/d|p=1|/a/s1/d|/s1b", response);
Assert.assertEquals(2, filter.getCount());
}
@Test
public void test_includeBasic() throws Exception {
Servlet servlet8 = new HttpServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
RequestDispatcher requestDispatcher =
request.getRequestDispatcher("/S8/target");
requestDispatcher.include(request, response);
}
};
Servlet servlet8Target = new HttpServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().print("s8target");
}
};
HttpService httpService = getHttpService();
HttpContext httpContext = httpService.createDefaultHttpContext();
httpService.registerServlet("/S8", servlet8, null, httpContext);
httpService.registerServlet("/S8/target", servlet8Target, null, httpContext);
Assert.assertEquals("s8target", requestAdvisor.request("S8"));
}
@Test
public void test_includeDepth1() throws Exception {
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s2/b?u=5").include(request, response);
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "a");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/a");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props));
String response = requestAdvisor.request("a/s1/d?p=1");
Assert.assertEquals("/a|/d|p=1|/a/s1/d|/s1|/a|/b|u=5|/a/s2/b|/s2", response);
}
@Test
public void test_includeDepth1_WithRequestFilter() throws Exception {
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s2/b?u=5").include(request, response);
}
};
TestFilter filter = new TestFilter() {
@Override
public void doFilter(
ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
response.getWriter().write('b');
super.doFilter(request, response, chain);
response.getWriter().write('b');
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "a");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/a");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_NAME, "F1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_DISPATCHER, new String[] {DispatcherType.REQUEST.toString()});
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_PATTERN, "/*");
registrations.add(getBundleContext().registerService(Filter.class, filter, props));
String response = requestAdvisor.request("a/s1/d?p=1");
Assert.assertEquals("b/a|/d|p=1|/a/s1/d|/s1|/a|/b|u=5|/a/s2/b|/s2b", response);
Assert.assertTrue(filter.getCalled());
}
@Test
public void test_includeDepth1_WithRequestAndIncludeFilter() throws Exception {
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s2/b?u=5").include(request, response);
}
};
TestFilter filter = new TestFilter() {
@Override
public void doFilter(
ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
response.getWriter().write('b');
super.doFilter(request, response, chain);
response.getWriter().write('b');
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "a");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/a");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_NAME, "F1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_DISPATCHER, new String[] {DispatcherType.INCLUDE.toString(), DispatcherType.REQUEST.toString()});
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_PATTERN, "/*");
registrations.add(getBundleContext().registerService(Filter.class, filter, props));
String response = requestAdvisor.request("a/s1/d?p=1");
Assert.assertEquals("bb/a|/d|p=1|/a/s1/d|/s1|/a|/b|u=5|/a/s2/b|/s2bb", response);
Assert.assertEquals(2, filter.getCount());
}
@Test
public void test_includeDepth2() throws Exception {
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s2/i2?p2=2").include(request, response);
}
};
Servlet servlet2 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s3/i3?p3=3").include(request, response);
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "c1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/c1");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s3/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props));
String response = requestAdvisor.request("c1/s1/i1?p1=1");
Assert.assertEquals("/c1|/i1|p1=1|/c1/s1/i1|/s1|/c1|/i3|p3=3|/c1/s3/i3|/s3", response);
}
@Test
public void test_includeDepth3() throws Exception {
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s2/i2?p2=2").include(request, response);
}
};
Servlet servlet2 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s3/i3?p3=3").include(request, response);
}
};
Servlet servlet3 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s4/i4?p4=4").include(request, response);
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "c1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/c1");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s3/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet3, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s4/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props));
String response = requestAdvisor.request("c1/s1/i1?p1=1");
Assert.assertEquals("/c1|/i1|p1=1|/c1/s1/i1|/s1|/c1|/i4|p4=4|/c1/s4/i4|/s4", response);
}
@Test
public void test_includeNamedParameterAggregationAndPrecedence() throws Exception {
Servlet sA = new HttpServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(
HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
ServletContext servletContext = getServletContext();
RequestDispatcher requestDispatcher = servletContext.getNamedDispatcher("s2");
requestDispatcher.include(req, resp);
}
};
Servlet sB = new HttpServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(
HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.write(req.getQueryString());
writer.write("|");
writer.write(String.valueOf(req.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING)));
writer.write("|");
writer.write(req.getParameter("p"));
writer.write("|");
writer.write(Arrays.toString(req.getParameterValues("p")));
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "c1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/c1");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "s1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
registrations.add(getBundleContext().registerService(Servlet.class, sA, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "s2");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
registrations.add(getBundleContext().registerService(Servlet.class, sB, props));
String result = requestAdvisor.request("c1/s1/a?p=1&p=2");
Assert.assertEquals("p=1&p=2|null|1|[1, 2]", result);
}
@Test
public void test_includeNamed() throws Exception {
Servlet sA = new HttpServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(
HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
ServletContext servletContext = getServletContext();
RequestDispatcher requestDispatcher = servletContext.getNamedDispatcher("s2");
requestDispatcher.include(req, resp);
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "c1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/c1");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "s1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
registrations.add(getBundleContext().registerService(Servlet.class, sA, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "s2");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=c1)");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props));
String result = requestAdvisor.request("c1/s1/a?p=1&p=2");
Assert.assertEquals("/c1|/a|p=1&p=2|/c1/s1/a|/s1|null|null|null|null|null", result);
}
@Test
public void test_includeParameterAggregationAndPrecedence() throws Exception {
Servlet sA = new HttpServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(
HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/Servlet13B/a?p=3&p=4");
requestDispatcher.include(req, resp);
}
};
Servlet sB = new HttpServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(
HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.write(req.getQueryString());
writer.write("|");
writer.write((String)req.getAttribute(RequestDispatcher.INCLUDE_QUERY_STRING));
writer.write("|");
writer.write(req.getParameter("p"));
writer.write("|");
writer.write(Arrays.toString(req.getParameterValues("p")));
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "S13A");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/Servlet13A/*");
registrations.add(getBundleContext().registerService(Servlet.class, sA, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "S13B");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/Servlet13B/*");
registrations.add(getBundleContext().registerService(Servlet.class, sB, props));
String result = requestAdvisor.request("Servlet13A/a?p=1&p=2");
Assert.assertEquals("p=1&p=2|p=3&p=4|3|[3, 4, 1, 2]", result);
}
@Test
public void test_includeStreamed() throws Exception {
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s2/b?u=5").include(request, response);
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "a");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/a");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props));
String response = requestAdvisor.request("a/s1/d?p=1");
Assert.assertEquals("/a|/d|p=1|/a/s1/d|/s1|/a|/b|u=5|/a/s2/b|/s2", response);
}
@Test
public void test_includeStreamed_WithRequestFilter() throws Exception {
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s2/b?u=5").include(request, response);
}
};
TestFilter filter = new TestFilter() {
@Override
public void doFilter(
ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
write(response.getOutputStream(), "b");
super.doFilter(request, response, chain);
write(response.getOutputStream(), "b");
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "a");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/a");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_NAME, "F1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_DISPATCHER, new String[] {DispatcherType.REQUEST.toString()});
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_PATTERN, "/*");
registrations.add(getBundleContext().registerService(Filter.class, filter, props));
String response = requestAdvisor.request("a/s1/d?p=1");
Assert.assertEquals("b/a|/d|p=1|/a/s1/d|/s1|/a|/b|u=5|/a/s2/b|/s2b", response);
Assert.assertTrue(filter.getCalled());
}
@Test
public void test_includeStreamed_WithRequestAndIncludeFilter() throws Exception {
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/s2/b?u=5").include(request, response);
}
};
TestFilter filter = new TestFilter() {
@Override
public void doFilter(
ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
write(response.getOutputStream(), "b");
super.doFilter(request, response, chain);
write(response.getOutputStream(), "b");
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME, "a");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH, "/a");
registrations.add(getBundleContext().registerService(ServletContextHelper.class, new ServletContextHelper() {}, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
registrations.add(getBundleContext().registerService(Servlet.class, new DispatchResultServlet(), props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_NAME, "F1");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_DISPATCHER, new String[] {DispatcherType.INCLUDE.toString(), DispatcherType.REQUEST.toString()});
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_PATTERN, "/*");
registrations.add(getBundleContext().registerService(Filter.class, filter, props));
String response = requestAdvisor.request("a/s1/d?p=1");
Assert.assertEquals("bb/a|/d|p=1|/a/s1/d|/s1|/a|/b|u=5|/a/s2/b|/s2bb", response);
Assert.assertEquals(2, filter.getCount());
}
@Test
public void test_Bug479115() throws Exception {
Servlet servlet = new HttpServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(
final HttpServletRequest req, final HttpServletResponse resp)
throws ServletException, IOException {
final AtomicReference<String[]> results = new AtomicReference<String[]>();
Thread thread = new Thread() {
@Override
public void run() {
String[] parts = new String[2];
parts[0] = req.getContextPath();
parts[1] = req.getRequestURI();
results.set(parts);
}
};
thread.start();
try {
thread.join();
}
catch (InterruptedException ie) {
throw new IOException(ie);
}
Assert.assertNotNull(results.get());
PrintWriter writer = resp.getWriter();
writer.write(results.get()[0]);
writer.write("|");
writer.write(results.get()[1]);
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "Bug479115");
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/Bug479115/*");
registrations.add(getBundleContext().registerService(Servlet.class, servlet, props));
String result = requestAdvisor.request("Bug479115/a");
Assert.assertEquals("|/Bug479115/a", result);
}
@Test
public void test_headers_include() throws Exception {
SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz");
format.setTimeZone(TimeZone.getTimeZone("GMT"));
final long date1 = System.currentTimeMillis() - (1000*60*60*24*365*30);
final long date2 = System.currentTimeMillis() - (1000*60*60*24*365*40);
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.addCookie(new Cookie("foo","bar"));
response.addDateHeader("X-date", date1);
response.addHeader("X-colour", "blue");
response.addIntHeader("X-size", 20);
response.setCharacterEncoding("UTF-8");
response.setContentType("text/plain");
response.setHeader("X-animal", "cat");
response.setLocale(Locale.CANADA);
response.setBufferSize(1024);
request.getRequestDispatcher("/s2").include(request, response);
}
};
Servlet servlet2 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.addCookie(new Cookie("foo","baz"));
response.addDateHeader("X-date", date2);
response.addHeader("X-colour", "green");
response.addIntHeader("X-size", 30);
response.setCharacterEncoding("UTF-16");
response.setContentType("text/json");
response.setHeader("X-animal", "bog");
response.setLocale(Locale.US);
response.setBufferSize(0);
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props));
Map<String, List<String>> response = requestAdvisor.request("s1", null);
Assert.assertNotNull(response.get("Set-Cookie"));
Assert.assertEquals("foo=bar", response.get("Set-Cookie").get(0));
Assert.assertNotNull(response.get("X-date"));
Assert.assertEquals(format.format(new Date(date1)), response.get("X-date").get(0));
Assert.assertNotNull(response.get("X-colour"));
Assert.assertEquals("blue", response.get("X-colour").get(0));
Assert.assertNotNull(response.get("X-size"));
Assert.assertEquals("20", response.get("X-size").get(0));
String contentType = response.get("Content-Type").get(0);
Assert.assertTrue(contentType.contains("text/plain;"));
Assert.assertTrue(contentType.toLowerCase().contains("charset=utf-8"));
Assert.assertEquals("en-CA", response.get("Content-Language").get(0));
Assert.assertNotNull(response.get("X-animal"));
Assert.assertEquals("cat", response.get("X-animal").get(0));
}
@Test
public void test_headers_forward() throws Exception {
SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz");
format.setTimeZone(TimeZone.getTimeZone("GMT"));
final long date1 = System.currentTimeMillis() - (1000*60*60*24*365*30);
final long date2 = System.currentTimeMillis() - (1000*60*60*24*365*40);
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.addCookie(new Cookie("foo","bar"));
response.addDateHeader("X-date", date1);
response.addHeader("X-colour", "blue");
response.addIntHeader("X-size", 20);
response.setCharacterEncoding("UTF-8");
response.setContentType("text/plain");
response.setHeader("X-animal", "cat");
response.setLocale(Locale.CANADA);
response.setBufferSize(1024);
request.getRequestDispatcher("/s2").forward(request, response);
}
};
Servlet servlet2 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.addCookie(new Cookie("foo","baz"));
response.addDateHeader("X-date", date2);
response.addHeader("X-colour", "green");
response.addIntHeader("X-size", 30);
response.setCharacterEncoding("UTF-16");
response.setContentType("text/json");
response.setHeader("X-animal", "dog");
response.setLocale(Locale.US);
response.setBufferSize(0);
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s2/*");
registrations.add(getBundleContext().registerService(Servlet.class, servlet2, props));
Map<String, List<String>> response = requestAdvisor.request("s1", null);
Assert.assertNotNull(response.get("Set-Cookie"));
Assert.assertEquals("foo=baz", response.get("Set-Cookie").get(0));
Assert.assertNotNull(response.get("X-date"));
Assert.assertEquals(format.format(new Date(date2)), response.get("X-date").get(0));
Assert.assertNotNull(response.get("X-colour"));
Assert.assertEquals("green", response.get("X-colour").get(0));
Assert.assertNotNull(response.get("X-size"));
Assert.assertEquals("30", response.get("X-size").get(0));
String contentType = response.get("Content-Type").get(0);
Assert.assertTrue(contentType.contains("text/json;"));
Assert.assertTrue(contentType.toLowerCase().contains("charset=utf-16"));
Assert.assertEquals("en-US", response.get("Content-Language").get(0));
Assert.assertNotNull(response.get("X-animal"));
Assert.assertEquals("dog", response.get("X-animal").get(0));
}
// Bug 493583
@Test
public void test_streamed_response_outputstream() throws Exception {
final long interval = 100L;
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/event-stream");
response.setCharacterEncoding("UTF-8");
try (ServletOutputStream out = response.getOutputStream()) {
for (int i = 1; i <= 10; ++i) {
try {
Thread.sleep(interval);
}
catch (InterruptedException e) {
throw new ServletException(e);
}
out.print("data: ");
out.print(System.currentTimeMillis());
out.print("\n\n");
out.flush();
}
}
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
final AtomicLong previousTime = new AtomicLong(System.currentTimeMillis());
final AtomicInteger counter = new AtomicInteger();
final AtomicBoolean result = new AtomicBoolean(true);
EventHandler handler = new EventHandler() {
@Override
public void handle(Map<String, String> eventMap) {
super.handle(eventMap);
long currentTime = System.currentTimeMillis();
long diff = (currentTime - previousTime.get());
System.out.println("Differential: " + diff);
// check that there is at least a differential of half the interval
// because we can't really guarantee that machine time will accurately
// reflect the timeouts we've set
if (diff < (interval / 2)) {
result.set(false);
}
previousTime.set(currentTime);
counter.incrementAndGet();
}
};
requestAdvisor.eventSource("s1", null, handler);
handler.close();
Assert.assertTrue(
"The interval between events was too short. It means that the response was not properly streamed.",
result.get());
Assert.assertEquals(10, counter.get());
}
// Bug 493583
@Test
public void test_streamed_response_writer() throws Exception {
final long interval = 100L;
Servlet servlet1 = new BaseServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/event-stream");
response.setCharacterEncoding("UTF-8");
try (PrintWriter writer = response.getWriter()) {
for (int i = 1; i <= 10; ++i) {
try {
Thread.sleep(interval);
}
catch (InterruptedException e) {
throw new ServletException(e);
}
writer.print("data: ");
writer.print(System.currentTimeMillis());
writer.print("\n\n");
writer.flush();
}
}
}
};
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/s1/*");
registrations.add(getBundleContext().registerService(Servlet.class, servlet1, props));
final AtomicLong previousTime = new AtomicLong(System.currentTimeMillis());
final AtomicInteger counter = new AtomicInteger();
final AtomicBoolean result = new AtomicBoolean(true);
EventHandler handler = new EventHandler() {
@Override
public void handle(Map<String, String> eventMap) {
super.handle(eventMap);
long currentTime = System.currentTimeMillis();
long diff = (currentTime - previousTime.get());
System.out.println("Differential: " + diff);
// check that there is at least a differential of half the interval
// because we can't really guarantee that machine time will accurately
// reflect the timeouts we've set
if (diff < (interval / 2)) {
result.set(false);
}
previousTime.set(currentTime);
counter.incrementAndGet();
}
};
requestAdvisor.eventSource("s1", null, handler);
handler.close();
Assert.assertTrue(
"The interval between events was too short. It means that the response was not properly streamed.",
result.get());
Assert.assertEquals(10, counter.get());
}
}