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: [email protected]
For additional commands, e-mail: [email protected]