Author: remm
Date: Fri Apr 27 15:03:57 2007
New Revision: 533240

URL: http://svn.apache.org/viewvc?view=rev&rev=533240
Log:
- Add code to check that at least one read is made that goes down to the 
connector for each read event.
- It is an error to not read bytes as long as some are reported as available.
- Generate a read event if bytes are available after processing the begin event 
(for API lawyers out there).
- Not tested yet, sorry. In theory, previously working code shouldn't have to 
be modified at all.

Modified:
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Request.java

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java?view=diff&rev=533240&r1=533239&r2=533240
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java 
Fri Apr 27 15:03:57 2007
@@ -118,6 +118,7 @@
         if (request.getWrapper() != null) {
             
             boolean error = false;
+            boolean read = false;
             try {
                 if (status == SocketStatus.OPEN) {
                     if (response.isClosed()) {
@@ -128,6 +129,8 @@
                     } else {
                         
request.getEvent().setEventType(CometEvent.EventType.READ);
                         request.getEvent().setEventSubType(null);
+                        read = true;
+                        request.resetDidRead();
                     }
                 } else if (status == SocketStatus.DISCONNECT) {
                     
request.getEvent().setEventType(CometEvent.EventType.ERROR);
@@ -167,6 +170,11 @@
                 }
                 if (response.isClosed() || !request.isComet()) {
                     res.action(ActionCode.ACTION_COMET_END, null);
+                } else if (!error && read && (!request.didRead() || 
request.getAvailable())) {
+                    // If this was a read and not all bytes have been read, or 
if no data
+                    // was read from the connector, then it is an error
+                    error = true;
+                    log.error(sm.getString("coyoteAdapter.read"));
                 }
                 return (!error);
             } catch (Throwable t) {
@@ -240,8 +248,16 @@
 
                 if (request.isComet()) {
                     if (!response.isClosed() && !response.isError()) {
-                        comet = true;
-                        res.action(ActionCode.ACTION_COMET_BEGIN, null);
+                        if (request.getAvailable()) {
+                            // Invoke a read event right away if there are 
available bytes
+                            if (event(req, res, SocketStatus.OPEN)) {
+                                comet = true;
+                                res.action(ActionCode.ACTION_COMET_BEGIN, 
null);
+                            }
+                        } else {
+                            comet = true;
+                            res.action(ActionCode.ACTION_COMET_BEGIN, null);
+                        }
                     } else {
                         // Clear the filter chain, as otherwise it will not be 
reset elsewhere
                         // since this is a Comet request

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java?view=diff&rev=533240&r1=533239&r2=533240
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java 
Fri Apr 27 15:03:57 2007
@@ -99,6 +99,12 @@
 
 
     /**
+     * Flag which if a read was performed.
+     */
+    private boolean didRead = false;
+
+
+    /**
      * Byte chunk used to input bytes.
      */
     private ByteChunk inputChunk = new ByteChunk();
@@ -257,8 +263,7 @@
     }
 
 
-    public int available()
-        throws IOException {
+    public int available() {
         int available = 0;
         if (state == BYTE_STATE) {
             available = bb.getLength();
@@ -273,6 +278,16 @@
     }
 
 
+    public boolean didRead() {
+        return didRead();
+    }
+
+
+    public void resetDidRead() {
+        didRead = false;
+    }
+
+
     // ------------------------------------------------- Bytes Handling Methods
 
 
@@ -294,6 +309,7 @@
             return -1;
 
         state = BYTE_STATE;
+        didRead = true;
 
         int result = coyoteRequest.doRead(bb);
 

Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Request.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Request.java?view=diff&rev=533240&r1=533239&r2=533240
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Request.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Request.java Fri 
Apr 27 15:03:57 2007
@@ -2240,6 +2240,24 @@
     }
 
     
+    /**
+     * Return true if bytes are available.
+     */
+    public boolean getAvailable() {
+        return (inputBuffer.available() > 0);
+    }
+
+    
+    public boolean didRead() {
+        return inputBuffer.didRead();
+    }
+
+
+    public void resetDidRead() {
+        inputBuffer.resetDidRead();
+    }
+
+
     // ------------------------------------------------------ Protected Methods
 
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to