Author: markt
Date: Wed Dec 12 23:25:39 2018
New Revision: 1848810

URL: http://svn.apache.org/viewvc?rev=1848810&view=rev
Log:
Ensure that the HEAD response is consistent with the GET response when 
HttpServlet is relied upon to generate the HEAD response and the GET response 
uses chunking.

Modified:
    tomcat/trunk/java/javax/servlet/http/HttpServlet.java
    tomcat/trunk/test/javax/servlet/http/TestHttpServlet.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/javax/servlet/http/HttpServlet.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/http/HttpServlet.java?rev=1848810&r1=1848809&r2=1848810&view=diff
==============================================================================
--- tomcat/trunk/java/javax/servlet/http/HttpServlet.java (original)
+++ tomcat/trunk/java/javax/servlet/http/HttpServlet.java Wed Dec 12 23:25:39 
2018
@@ -758,7 +758,7 @@ class NoBodyResponse extends HttpServlet
     // file private
     NoBodyResponse(HttpServletResponse r) {
         super(r);
-        noBody = new NoBodyOutputStream();
+        noBody = new NoBodyOutputStream(this);
     }
 
     // file private
@@ -847,11 +847,13 @@ class NoBodyOutputStream extends Servlet
     private static final ResourceBundle lStrings =
         ResourceBundle.getBundle(LSTRING_FILE);
 
+    private final HttpServletResponse response;
+    private boolean flushed = false;
     private int contentLength = 0;
 
     // file private
-    NoBodyOutputStream() {
-        // NOOP
+    NoBodyOutputStream(HttpServletResponse response) {
+        this.response = response;
     }
 
     // file private
@@ -860,8 +862,9 @@ class NoBodyOutputStream extends Servlet
     }
 
     @Override
-    public void write(int b) {
+    public void write(int b) throws IOException {
         contentLength++;
+        checkCommit();
     }
 
     @Override
@@ -882,6 +885,7 @@ class NoBodyOutputStream extends Servlet
         }
 
         contentLength += len;
+        checkCommit();
     }
 
     @Override
@@ -894,4 +898,11 @@ class NoBodyOutputStream extends Servlet
     public void setWriteListener(javax.servlet.WriteListener listener) {
         // TODO SERVLET 3.1
     }
+
+    private void checkCommit() throws IOException {
+        if (!flushed && contentLength > response.getBufferSize()) {
+            response.flushBuffer();
+            flushed = true;
+        }
+    }
 }

Modified: tomcat/trunk/test/javax/servlet/http/TestHttpServlet.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/javax/servlet/http/TestHttpServlet.java?rev=1848810&r1=1848809&r2=1848810&view=diff
==============================================================================
--- tomcat/trunk/test/javax/servlet/http/TestHttpServlet.java (original)
+++ tomcat/trunk/test/javax/servlet/http/TestHttpServlet.java Wed Dec 12 
23:25:39 2018
@@ -143,7 +143,7 @@ public class TestHttpServlet extends Tom
             if ("date".equalsIgnoreCase(headerName)) {
                 continue;
             }
-            Assert.assertTrue(headHeaders.containsKey(headerName));
+            Assert.assertTrue(headerName, headHeaders.containsKey(headerName));
             List<String> getValues = getHeader.getValue();
             List<String> headValues = headHeaders.get(headerName);
             Assert.assertEquals(getValues.size(), headValues.size());
@@ -198,8 +198,8 @@ public class TestHttpServlet extends Tom
             resp.setContentType("text/plain");
             resp.setCharacterEncoding("UTF-8");
             PrintWriter pw = resp.getWriter();
-            // Force chunking
-            resp.flushBuffer();
+            // Trigger chunking
+            pw.write(new char[8192 * 16]);
             pw.println("Data");
         }
     }

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1848810&r1=1848809&r2=1848810&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Wed Dec 12 23:25:39 2018
@@ -56,6 +56,11 @@
         fragments with duplicate names and is configured to use relative
         ordering of fragments. (markt)
       </fix>
+      <fix>
+        Ensure that the HEAD response is consistent with the GET response when
+        <code>HttpServlet</code> is relied upon to generate the HEAD response
+        and the GET response uses chunking. (markt)
+      </fix>
     </changelog>
   </subsection>
 </section>



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to