You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/11/26 12:06:04 UTC

svn commit: r1545613 - in /tomcat/trunk/java/org/apache: catalina/connector/CoyoteAdapter.java coyote/Request.java

Author: markt
Date: Tue Nov 26 11:06:03 2013
New Revision: 1545613

URL: http://svn.apache.org/r1545613
Log:
Ensure that onAllDataRead() event is always fired once (and once only) after the request body has been read

Modified:
    tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
    tomcat/trunk/java/org/apache/coyote/Request.java

Modified: tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java?rev=1545613&r1=1545612&r2=1545613&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Tue Nov 26 11:06:03 2013
@@ -364,6 +364,9 @@ public class CoyoteAdapter implements Ad
                     try {
                         Thread.currentThread().setContextClassLoader(newCL);
                         res.onWritePossible();
+                        if (request.isFinished() && req.sendAllDataReadEvent()) {
+                            req.getReadListener().onAllDataRead();
+                        }
                     } catch (Throwable t) {
                         ExceptionUtils.handleThrowable(t);
                         res.getWriteListener().onError(t);
@@ -381,7 +384,7 @@ public class CoyoteAdapter implements Ad
                     try {
                         Thread.currentThread().setContextClassLoader(newCL);
                         req.getReadListener().onDataAvailable();
-                        if (request.isFinished()) {
+                        if (request.isFinished() && req.sendAllDataReadEvent()) {
                             req.getReadListener().onAllDataRead();
                         }
                     } catch (Throwable t) {
@@ -548,7 +551,9 @@ public class CoyoteAdapter implements Ad
                             request.getContext().getLoader().getClassLoader();
                     try {
                         Thread.currentThread().setContextClassLoader(newCL);
-                        req.getReadListener().onAllDataRead();
+                        if (req.sendAllDataReadEvent()) {
+                            req.getReadListener().onAllDataRead();
+                        }
                     } finally {
                         Thread.currentThread().setContextClassLoader(oldCL);
                     }

Modified: tomcat/trunk/java/org/apache/coyote/Request.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/Request.java?rev=1545613&r1=1545612&r2=1545613&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/Request.java (original)
+++ tomcat/trunk/java/org/apache/coyote/Request.java Tue Nov 26 11:06:03 2013
@@ -167,9 +167,15 @@ public final class Request {
         this.listener = listener;
     }
 
-    // ------------------------------------------------------------- Properties
+    private AtomicBoolean allDataReadEventSent = new AtomicBoolean(false);
+
+    public boolean sendAllDataReadEvent() {
+        return allDataReadEventSent.compareAndSet(false, true);
+    }
 
 
+    // ------------------------------------------------------------- Properties
+
     /**
      * Get the instance id (or JVM route). Currently Ajp is sending it with each
      * request. In future this should be fixed, and sent only once ( or
@@ -545,6 +551,7 @@ public final class Request {
         attributes.clear();
 
         listener = null;
+        allDataReadEventSent.set(false);
 
         startTime = -1;
     }



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