Author: markt Date: Mon Mar 2 12:02:49 2015 New Revision: 1663277 URL: http://svn.apache.org/r1663277 Log: Ensure HEAD requests return the correct content length (i.e. the same as for a GET) when the requested resource includes a resource served by a servlet that extends HttpServlet.
Modified: tomcat/trunk/java/javax/servlet/http/HttpServlet.java tomcat/trunk/test/javax/servlet/http/TestHttpServlet.java Modified: tomcat/trunk/java/javax/servlet/http/HttpServlet.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/http/HttpServlet.java?rev=1663277&r1=1663276&r2=1663277&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/http/HttpServlet.java (original) +++ tomcat/trunk/java/javax/servlet/http/HttpServlet.java Mon Mar 2 12:02:49 2015 @@ -25,6 +25,7 @@ import java.text.MessageFormat; import java.util.Enumeration; import java.util.ResourceBundle; +import javax.servlet.DispatcherType; import javax.servlet.GenericServlet; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; @@ -236,10 +237,13 @@ public abstract class HttpServlet extend protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - NoBodyResponse response = new NoBodyResponse(resp); - - doGet(req, response); - response.setContentLength(); + if (DispatcherType.INCLUDE.equals(req.getDispatcherType())) { + doGet(req, resp); + } else { + NoBodyResponse response = new NoBodyResponse(resp); + doGet(req, response); + response.setContentLength(); + } } Modified: tomcat/trunk/test/javax/servlet/http/TestHttpServlet.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/javax/servlet/http/TestHttpServlet.java?rev=1663277&r1=1663276&r2=1663277&view=diff ============================================================================== --- tomcat/trunk/test/javax/servlet/http/TestHttpServlet.java (original) +++ tomcat/trunk/test/javax/servlet/http/TestHttpServlet.java Mon Mar 2 12:02:49 2015 @@ -17,6 +17,7 @@ package javax.servlet.http; import java.io.IOException; +import java.io.PrintWriter; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -68,4 +69,76 @@ public class TestHttpServlet extends Tom resp.setHeader("content-length", RESPONSE_LENGTH); } } + + + /** + * Verifies that the same Content-Length is returned for both GET and HEAD + * operations when a Servlet includes content from another Servlet + */ + @Test + public void testBug57602() throws Exception { + Tomcat tomcat = getTomcatInstance(); + + // No file system docBase required + StandardContext ctx = (StandardContext) tomcat.addContext("", null); + + Bug57602ServletOuter outer = new Bug57602ServletOuter(); + Tomcat.addServlet(ctx, "Bug57602ServletOuter", outer); + ctx.addServletMapping("/outer", "Bug57602ServletOuter"); + + Bug57602ServletInner inner = new Bug57602ServletInner(); + Tomcat.addServlet(ctx, "Bug57602ServletInner", inner); + ctx.addServletMapping("/inner", "Bug57602ServletInner"); + + tomcat.start(); + + Map<String,List<String>> resHeaders= new HashMap<>(); + String path = "http://localhost:" + getPort() + "/outer"; + ByteChunk out = new ByteChunk(); + + int rc = getUrl(path, out, resHeaders); + Assert.assertEquals(HttpServletResponse.SC_OK, rc); + String length = resHeaders.get("Content-Length").get(0); + Assert.assertEquals(Long.parseLong(length), out.getLength()); + out.recycle(); + + rc = headUrl(path, out, resHeaders); + Assert.assertEquals(HttpServletResponse.SC_OK, rc); + Assert.assertEquals(0, out.getLength()); + Assert.assertEquals(length, resHeaders.get("Content-Length").get(0)); + + tomcat.stop(); + } + + + private static class Bug57602ServletOuter extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + resp.setContentType("text/plain"); + resp.setCharacterEncoding("UTF-8"); + PrintWriter pw = resp.getWriter(); + pw.println("Header"); + req.getRequestDispatcher("/inner").include(req, resp); + pw.println("Footer"); + } + } + + + private static class Bug57602ServletInner extends HttpServlet { + + private static final long serialVersionUID = 1L; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + resp.setContentType("text/plain"); + resp.setCharacterEncoding("UTF-8"); + PrintWriter pw = resp.getWriter(); + pw.println("Included"); + } + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org