Author: violetagg Date: Sun Nov 27 17:25:25 2016 New Revision: 1771613 URL: http://svn.apache.org/viewvc?rev=1771613&view=rev Log: Unit test that reproduces bug 60409.
Modified: tomcat/trunk/test/org/apache/catalina/connector/TestSendFile.java Modified: tomcat/trunk/test/org/apache/catalina/connector/TestSendFile.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/connector/TestSendFile.java?rev=1771613&r1=1771612&r2=1771613&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/catalina/connector/TestSendFile.java (original) +++ tomcat/trunk/test/org/apache/catalina/connector/TestSendFile.java Sun Nov 27 17:25:25 2016 @@ -22,10 +22,14 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Random; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -33,6 +37,8 @@ import javax.servlet.http.HttpServletReq import javax.servlet.http.HttpServletResponse; import static org.junit.Assert.assertEquals; + +import org.junit.Assert; import org.junit.Test; import org.apache.catalina.Context; @@ -149,4 +155,93 @@ public class TestSendFile extends Tomcat } } + + @Test + public void testBug60409() throws Exception { + Tomcat tomcat = getTomcatInstance(); + + Context ctx = tomcat.addContext("", TEMP_DIR); + File file = generateFile(TEMP_DIR, "", EXPECTED_CONTENT_LENGTH); + CountDownLatch latch = new CountDownLatch(2); + Tomcat.addServlet(ctx, "test", new Bug60409Servlet(file, latch)); + ctx.addServletMappingDecoded("/", "test"); + + tomcat.start(); + + ByteChunk bc = new ByteChunk(); + getUrl("http://localhost:" + getPort() + "/test/?" + Globals.SENDFILE_SUPPORTED_ATTR + + "=true", bc, null); + + List<Throwable> exceptions = new ArrayList<>(); + new Thread(new RequestExecutor("http://localhost:" + getPort() + "/test/", exceptions)) + .start(); + new Thread(new RequestExecutor("http://localhost:" + getPort() + "/test/", exceptions)) + .start(); + + latch.await(3000, TimeUnit.MILLISECONDS); + + if (exceptions.size() > 0) { + Assert.fail(); + } + } + + private static final class Bug60409Servlet extends HttpServlet { + private static final long serialVersionUID = 1L; + private final File file; + private final CountDownLatch latch; + + Bug60409Servlet(File file, CountDownLatch latch) { + this.file = file; + this.latch = latch; + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + resp.setContentType("'application/octet-stream"); + resp.setCharacterEncoding("ISO-8859-1"); + resp.setContentLengthLong(file.length()); + if (Boolean.TRUE.equals(req.getAttribute(Globals.SENDFILE_SUPPORTED_ATTR))) { + req.setAttribute(Globals.SENDFILE_FILENAME_ATTR, file.getAbsolutePath()); + req.setAttribute(Globals.SENDFILE_FILE_START_ATTR, new Long(0)); + req.setAttribute(Globals.SENDFILE_FILE_END_ATTR, new Long(file.length())); + file.delete(); + } else { + byte[] c = new byte[1024]; + Random rd = new Random(); + rd.nextBytes(c); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + resp.getOutputStream().write(c); + latch.countDown(); + } + } + + } + + private static final class RequestExecutor implements Runnable { + private final String url; + private final List<Throwable> exceptions; + + public RequestExecutor(String url, List<Throwable> exceptions) { + this.url = url; + this.exceptions = exceptions; + } + + @Override + public void run() { + try { + ByteChunk result = new ByteChunk(); + int rc = getUrl(url, result, null); + Assert.assertTrue(rc == HttpServletResponse.SC_OK); + } catch (Throwable e) { + e.printStackTrace(); + exceptions.add(e); + } + } + + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org