You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by gk...@apache.org on 2008/08/25 11:43:56 UTC

svn commit: r688686 - in /cocoon/trunk/subprojects/cocoon-servlet-service/cocoon-servlet-service-impl/src: main/java/org/apache/cocoon/servletservice/ test/java/org/apache/cocoon/servletservice/

Author: gkossakowski
Date: Mon Aug 25 02:43:56 2008
New Revision: 688686

URL: http://svn.apache.org/viewvc?rev=688686&view=rev
Log:
Fix problem with writer returned by HttpServletResponseBufferingWrapper that was never flushed.

Since wrapper's internal outputstream is used in every case, flushing must be performed in every case as well.

Added test case testing flushing of writer returned by HttpServletResponseBufferingWrapper.

Modified:
    cocoon/trunk/subprojects/cocoon-servlet-service/cocoon-servlet-service-impl/src/main/java/org/apache/cocoon/servletservice/HttpServletResponseBufferingWrapper.java
    cocoon/trunk/subprojects/cocoon-servlet-service/cocoon-servlet-service-impl/src/test/java/org/apache/cocoon/servletservice/HttpServletResponseBufferingWrapperTestCase.java

Modified: cocoon/trunk/subprojects/cocoon-servlet-service/cocoon-servlet-service-impl/src/main/java/org/apache/cocoon/servletservice/HttpServletResponseBufferingWrapper.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/subprojects/cocoon-servlet-service/cocoon-servlet-service-impl/src/main/java/org/apache/cocoon/servletservice/HttpServletResponseBufferingWrapper.java?rev=688686&r1=688685&r2=688686&view=diff
==============================================================================
--- cocoon/trunk/subprojects/cocoon-servlet-service/cocoon-servlet-service-impl/src/main/java/org/apache/cocoon/servletservice/HttpServletResponseBufferingWrapper.java (original)
+++ cocoon/trunk/subprojects/cocoon-servlet-service/cocoon-servlet-service-impl/src/main/java/org/apache/cocoon/servletservice/HttpServletResponseBufferingWrapper.java Mon Aug 25 02:43:56 2008
@@ -225,17 +225,19 @@
                 else
                     super.setStatus(SC_NOT_FOUND);
             }
-
-            if (this.printWriter != null) {
-                if (this.printWriter.checkError())
-                    throw new IOException(
-                            "Error occured while writing to printWriter.");
-                this.printWriter.close();
-            }
-            
-            if (outputStream != null)
-                outputStream.writeTo(super.getOutputStream());
         }
+        
+        //since all data goes through ForwardingOrLimitingServletOutputStream then flushing
+        //must be performed in *every* case now
+        if (this.printWriter != null) {
+            if (this.printWriter.checkError())
+                throw new IOException(
+                        "Error occured while writing to printWriter.");
+            this.printWriter.close();
+        } else if (outputStream != null)
+            outputStream.writeTo(super.getOutputStream());
+        
+        super.flushBuffer();
     }
 
     public void resetBufferedResponse() {

Modified: cocoon/trunk/subprojects/cocoon-servlet-service/cocoon-servlet-service-impl/src/test/java/org/apache/cocoon/servletservice/HttpServletResponseBufferingWrapperTestCase.java
URL: http://svn.apache.org/viewvc/cocoon/trunk/subprojects/cocoon-servlet-service/cocoon-servlet-service-impl/src/test/java/org/apache/cocoon/servletservice/HttpServletResponseBufferingWrapperTestCase.java?rev=688686&r1=688685&r2=688686&view=diff
==============================================================================
--- cocoon/trunk/subprojects/cocoon-servlet-service/cocoon-servlet-service-impl/src/test/java/org/apache/cocoon/servletservice/HttpServletResponseBufferingWrapperTestCase.java (original)
+++ cocoon/trunk/subprojects/cocoon-servlet-service/cocoon-servlet-service-impl/src/test/java/org/apache/cocoon/servletservice/HttpServletResponseBufferingWrapperTestCase.java Mon Aug 25 02:43:56 2008
@@ -18,6 +18,7 @@
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.io.PrintWriter;
 
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
@@ -127,6 +128,7 @@
         response.isCommitted();
         control.setReturnValue(false, MockControl.ZERO_OR_MORE);
         response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+        response.flushBuffer();
         control.replay();
         HttpServletResponseBufferingWrapper responseWrapper = new HttpServletResponseBufferingWrapper(response);
         responseWrapper.setStatus(HttpServletResponse.SC_NOT_FOUND);
@@ -161,6 +163,34 @@
     }
     
     /**
+     * This method tests if flushing of obtained writer is performed correctly in flushBufferedResponse.
+     * @throws Exception
+     */
+    public void testWriterFlushing() throws Exception {
+        CountingServletOutputStream countingStream = new CountingServletOutputStream();
+        
+        MockControl control = MockControl.createControl(HttpServletResponse.class);
+        HttpServletResponse response = (HttpServletResponse)control.getMock();
+        response.setStatus(HttpServletResponse.SC_OK);
+        response.getCharacterEncoding();
+        control.setReturnValue("ISO-8859-1");
+        response.isCommitted();
+        control.setReturnValue(false, MockControl.ZERO_OR_MORE);
+        response.getOutputStream();
+        control.setReturnValue(countingStream, MockControl.ONE_OR_MORE);
+        response.flushBuffer();
+        control.replay();
+        
+        HttpServletResponseBufferingWrapper responseWrapper = new HttpServletResponseBufferingWrapper(response);
+        responseWrapper.setStatus(HttpServletResponse.SC_OK);
+        PrintWriter writer = responseWrapper.getWriter();
+        writer.write("0");
+        responseWrapper.flushBufferedResponse();
+        
+        assertEquals(1, countingStream.getCounter());
+    }
+    
+    /**
      * Simple ServletOutputStream that counts how many bytes were written.
      *
      */