Lines 16-59
Link Here
|
16 |
*/ |
16 |
*/ |
17 |
package org.apache.catalina.core; |
17 |
package org.apache.catalina.core; |
18 |
|
18 |
|
19 |
import java.io.IOException; |
|
|
20 |
import java.io.PrintWriter; |
21 |
import java.util.HashMap; |
22 |
import java.util.LinkedHashMap; |
23 |
import java.util.List; |
24 |
import java.util.Map; |
25 |
import java.util.concurrent.ExecutorService; |
26 |
import java.util.concurrent.Executors; |
27 |
|
28 |
import javax.servlet.AsyncContext; |
29 |
import javax.servlet.AsyncEvent; |
30 |
import javax.servlet.AsyncListener; |
31 |
import javax.servlet.DispatcherType; |
32 |
import javax.servlet.GenericServlet; |
33 |
import javax.servlet.RequestDispatcher; |
34 |
import javax.servlet.Servlet; |
35 |
import javax.servlet.ServletException; |
36 |
import javax.servlet.ServletRequest; |
37 |
import javax.servlet.ServletRequestEvent; |
38 |
import javax.servlet.ServletRequestListener; |
39 |
import javax.servlet.ServletRequestWrapper; |
40 |
import javax.servlet.ServletResponse; |
41 |
import javax.servlet.ServletResponseWrapper; |
42 |
import javax.servlet.http.HttpServlet; |
43 |
import javax.servlet.http.HttpServletRequest; |
44 |
import javax.servlet.http.HttpServletResponse; |
45 |
|
46 |
import static org.junit.Assert.assertEquals; |
47 |
import static org.junit.Assert.assertNotNull; |
48 |
import static org.junit.Assert.assertTrue; |
49 |
|
50 |
import org.junit.Assert; |
51 |
import org.junit.Test; |
52 |
|
53 |
import org.apache.catalina.Context; |
19 |
import org.apache.catalina.Context; |
54 |
import org.apache.catalina.Wrapper; |
20 |
import org.apache.catalina.Wrapper; |
55 |
import org.apache.catalina.connector.Request; |
21 |
import org.apache.catalina.connector.Request; |
56 |
import org.apache.catalina.connector.Response; |
22 |
import org.apache.catalina.connector.Response; |
|
|
23 |
import org.apache.catalina.startup.TesterServlet; |
57 |
import org.apache.catalina.startup.Tomcat; |
24 |
import org.apache.catalina.startup.Tomcat; |
58 |
import org.apache.catalina.startup.TomcatBaseTest; |
25 |
import org.apache.catalina.startup.TomcatBaseTest; |
59 |
import org.apache.catalina.valves.TesterAccessLogValve; |
26 |
import org.apache.catalina.valves.TesterAccessLogValve; |
Lines 61-67
Link Here
|
61 |
import org.apache.tomcat.util.buf.ByteChunk; |
28 |
import org.apache.tomcat.util.buf.ByteChunk; |
62 |
import org.apache.tomcat.util.descriptor.web.ErrorPage; |
29 |
import org.apache.tomcat.util.descriptor.web.ErrorPage; |
63 |
import org.easymock.EasyMock; |
30 |
import org.easymock.EasyMock; |
|
|
31 |
import org.junit.Assert; |
32 |
import org.junit.Test; |
64 |
|
33 |
|
|
|
34 |
import javax.servlet.*; |
35 |
import javax.servlet.http.HttpServlet; |
36 |
import javax.servlet.http.HttpServletRequest; |
37 |
import javax.servlet.http.HttpServletResponse; |
38 |
import java.io.IOException; |
39 |
import java.io.PrintWriter; |
40 |
import java.util.HashMap; |
41 |
import java.util.LinkedHashMap; |
42 |
import java.util.List; |
43 |
import java.util.Map; |
44 |
import java.util.concurrent.ExecutorService; |
45 |
import java.util.concurrent.Executors; |
46 |
|
47 |
import static org.junit.Assert.*; |
48 |
|
65 |
public class TestAsyncContextImpl extends TomcatBaseTest { |
49 |
public class TestAsyncContextImpl extends TomcatBaseTest { |
66 |
|
50 |
|
67 |
// Time for a request to process (need to allow for threads to start etc.) |
51 |
// Time for a request to process (need to allow for threads to start etc.) |
Lines 1822-1827
Link Here
|
1822 |
} |
1806 |
} |
1823 |
|
1807 |
|
1824 |
@Test |
1808 |
@Test |
|
|
1809 |
public void testBug59219() throws Exception{ |
1810 |
resetTracker(); |
1811 |
Tomcat tomcat = getTomcatInstance(); |
1812 |
|
1813 |
Context ctx = tomcat.addContext("", null); |
1814 |
// tomcat.addServlet("", "async", new Bug59219Servlet()) |
1815 |
tomcat.addServlet("", "async", new Bug59219Servlet()) |
1816 |
.setAsyncSupported(true); |
1817 |
ctx.addServletMapping("/async", "async"); |
1818 |
|
1819 |
tomcat.start(); |
1820 |
|
1821 |
//Point 2. |
1822 |
ByteChunk body = getUrl("http://localhost:" + getPort() + "/async"); |
1823 |
String expected = "doGet-onError"; |
1824 |
|
1825 |
//Just let's give it 5 seconds :) |
1826 |
int count = 0; |
1827 |
while(!expected.equals(body.toString()) || count < 100) { |
1828 |
Thread.sleep(50); |
1829 |
count++; |
1830 |
} |
1831 |
|
1832 |
Assert.assertEquals(expected, body.toString()); |
1833 |
|
1834 |
//Point 3. |
1835 |
body = getUrl("http://localhost:" + getPort() + "/async?loops=3"); |
1836 |
expected = "doGet-doGet-doGet-onError"; |
1837 |
|
1838 |
count = 0; |
1839 |
while(!expected.equals(body.toString()) || count < 100) { |
1840 |
Thread.sleep(50); |
1841 |
count++; |
1842 |
} |
1843 |
|
1844 |
Assert.assertEquals(expected, body.toString()); |
1845 |
} |
1846 |
|
1847 |
private static class Bug59219Servlet extends HttpServlet { |
1848 |
|
1849 |
@Override |
1850 |
protected void doGet(HttpServletRequest req, HttpServletResponse resp) |
1851 |
throws ServletException, IOException { |
1852 |
|
1853 |
resp.setContentType("text/html"); |
1854 |
AsyncContext ctx = req.startAsync(); |
1855 |
ctx.addListener(new Bug59219Listener()); |
1856 |
resp.getWriter().write("doGet-"); |
1857 |
|
1858 |
String loop = req.getParameter("loop"); |
1859 |
Integer iloop = (Integer) req.getAttribute("iloop"); |
1860 |
|
1861 |
if (iloop == null) { |
1862 |
iloop = 0; |
1863 |
if (loop != null) |
1864 |
iloop = Integer.parseInt(loop); |
1865 |
} |
1866 |
|
1867 |
if (iloop > 0) { |
1868 |
iloop--; |
1869 |
req.setAttribute("iloop", iloop); |
1870 |
ctx.dispatch(); |
1871 |
} else |
1872 |
throw new ServletException("container be nice and process onError."); |
1873 |
} |
1874 |
|
1875 |
} |
1876 |
|
1877 |
private static class Bug59219Listener implements AsyncListener { |
1878 |
|
1879 |
@Override |
1880 |
public void onComplete(AsyncEvent ae) throws IOException { |
1881 |
// Nothing. |
1882 |
} |
1883 |
|
1884 |
@Override |
1885 |
public void onTimeout(AsyncEvent ae) throws IOException { |
1886 |
// Nothing. |
1887 |
} |
1888 |
|
1889 |
@Override |
1890 |
public void onError(AsyncEvent ae) throws IOException { |
1891 |
ae.getAsyncContext().getResponse().getWriter() |
1892 |
.write("onError"); |
1893 |
} |
1894 |
|
1895 |
@Override |
1896 |
public void onStartAsync(AsyncEvent ae) throws IOException { |
1897 |
// Nothing. |
1898 |
} |
1899 |
} |
1900 |
|
1901 |
@Test |
1825 |
public void testForbiddenDispatching() throws Exception { |
1902 |
public void testForbiddenDispatching() throws Exception { |
1826 |
resetTracker(); |
1903 |
resetTracker(); |
1827 |
// Setup Tomcat instance |
1904 |
// Setup Tomcat instance |