Author: remm
Date: Fri Apr 27 10:04:36 2007
New Revision: 533164

URL: http://svn.apache.org/viewvc?view=rev&rev=533164
Log:
- Add more accurate available() method, using a new action (still very cheap to 
invoke, and quite simple).
- This is mostly useful for Comet, since it can be difficult to know for sure 
if reading is possible without
  blocking if the beginning of the entity body was sent along with the request 
header in a single packet.

Modified:
    
tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/CoyoteInputStream.java
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/InputBuffer.java
    tomcat/tc6.0.x/trunk/java/org/apache/coyote/ActionCode.java
    tomcat/tc6.0.x/trunk/java/org/apache/coyote/Request.java
    tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java
    tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java
    tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InputFilter.java
    
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalAprInputBuffer.java
    
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java
    
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/BufferedInputFilter.java
    
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java
    
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/IdentityInputFilter.java
    
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java
    
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/VoidInputFilter.java

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/CoyoteInputStream.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/CoyoteInputStream.java?view=diff&rev=533164&r1=533163&r2=533164
==============================================================================
--- 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/CoyoteInputStream.java 
(original)
+++ 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/CoyoteInputStream.java 
Fri Apr 27 10:04:36 2007
@@ -228,7 +228,7 @@
             }
         } else {
              ib.close();
-        }            
+        }
     }
 
 }

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=533164&r1=533163&r2=533164
==============================================================================
--- 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 10:04:36 2007
@@ -25,6 +25,7 @@
 import java.util.HashMap;
 
 import org.apache.catalina.security.SecurityUtil;
+import org.apache.coyote.ActionCode;
 import org.apache.coyote.Request;
 import org.apache.tomcat.util.buf.B2CConverter;
 import org.apache.tomcat.util.buf.ByteChunk;
@@ -258,13 +259,17 @@
 
     public int available()
         throws IOException {
+        int available = 0;
         if (state == BYTE_STATE) {
-            return bb.getLength();
+            available = bb.getLength();
         } else if (state == CHAR_STATE) {
-            return cb.getLength();
-        } else {
-            return 0;
+            available = cb.getLength();
+        }
+        if (available == 0) {
+            coyoteRequest.action(ActionCode.ACTION_AVAILABLE, null);
+            available = (coyoteRequest.getAvailable() > 0) ? 1 : 0;
         }
+        return available;
     }
 
 
@@ -411,7 +416,7 @@
 
     public boolean ready()
         throws IOException {
-        return (cb.getLength() > 0);
+        return (available() > 0);
     }
 
 

Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/ActionCode.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/ActionCode.java?view=diff&rev=533164&r1=533163&r2=533164
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/coyote/ActionCode.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/ActionCode.java Fri Apr 27 
10:04:36 2007
@@ -146,6 +146,12 @@
     public static final ActionCode ACTION_COMET_END = new ActionCode(22);
 
 
+    /**
+     * Callback for getting the amount of available bytes
+     */
+    public static final ActionCode ACTION_AVAILABLE = new ActionCode(23);
+
+
     // ----------------------------------------------------------- Constructors
     int code;
 

Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/Request.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/Request.java?view=diff&rev=533164&r1=533163&r2=533164
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/coyote/Request.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/Request.java Fri Apr 27 
10:04:36 2007
@@ -143,6 +143,7 @@
     private int bytesRead=0;
     // Time of the request - usefull to avoid repeated calls to 
System.currentTime
     private long startTime = 0L;
+    private int available = 0;
 
     private RequestInfo reqProcessorMX=new RequestInfo(this);
     // ------------------------------------------------------------- Properties
@@ -392,6 +393,14 @@
         return authType;
     }
 
+    public int getAvailable() {
+        return available;
+    }
+
+    public void setAvailable(int available) {
+        this.available = available;
+    }
+
     // -------------------- Input Buffer --------------------
 
 
@@ -484,6 +493,7 @@
         serverPort=-1;
         localPort = -1;
         remotePort = -1;
+        available = 0;
 
         cookies.recycle();
         parameters.recycle();

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java?view=diff&rev=533164&r1=533163&r2=533164
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11AprProcessor.java 
Fri Apr 27 10:04:36 2007
@@ -1192,6 +1192,8 @@
                 request.getInputBuffer();
             internalBuffer.addActiveFilter(savedBody);
             
+        } else if (actionCode == ActionCode.ACTION_AVAILABLE) {
+            request.setAvailable(inputBuffer.available());
         } else if (actionCode == ActionCode.ACTION_COMET_BEGIN) {
             comet = true;
         } else if (actionCode == ActionCode.ACTION_COMET_END) {

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java?view=diff&rev=533164&r1=533163&r2=533164
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java 
Fri Apr 27 10:04:36 2007
@@ -1221,6 +1221,8 @@
                 request.getInputBuffer();
             internalBuffer.addActiveFilter(savedBody);
 
+        } else if (actionCode == ActionCode.ACTION_AVAILABLE) {
+            request.setAvailable(inputBuffer.available());
         } else if (actionCode == ActionCode.ACTION_COMET_BEGIN) {
             comet = true;
         } else if (actionCode == ActionCode.ACTION_COMET_END) {

Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InputFilter.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InputFilter.java?view=diff&rev=533164&r1=533163&r2=533164
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InputFilter.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InputFilter.java Fri Apr 
27 10:04:36 2007
@@ -79,4 +79,10 @@
         throws IOException;
 
 
+    /**
+     * Amount of bytes still available in a buffer.
+     */
+    public int available();
+
+
 }

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalAprInputBuffer.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalAprInputBuffer.java?view=diff&rev=533164&r1=533163&r2=533164
==============================================================================
--- 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalAprInputBuffer.java 
(original)
+++ 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalAprInputBuffer.java 
Fri Apr 27 10:04:36 2007
@@ -673,6 +673,20 @@
 
     }
 
+    
+    /**
+     * Available bytes (note that due to encoding, this may not correspond )
+     */
+    public int available() {
+        int result = (lastValid - pos);
+        if ((result == 0) && (lastActiveFilter >= 0)) {
+            for (int i = 0; (result == 0) && (i <= lastActiveFilter); i++) {
+                result = activeFilters[i].available();
+            }
+        }
+        return result;
+    }
+
 
     // ---------------------------------------------------- InputBuffer Methods
 

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java?view=diff&rev=533164&r1=533163&r2=533164
==============================================================================
--- 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java 
(original)
+++ 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java 
Fri Apr 27 10:04:36 2007
@@ -798,6 +798,20 @@
     }
 
 
+    /**
+     * Available bytes (note that due to encoding, this may not correspond )
+     */
+    public int available() {
+        int result = (lastValid - pos);
+        if ((result == 0) && (lastActiveFilter >= 0)) {
+            for (int i = 0; (result == 0) && (i <= lastActiveFilter); i++) {
+                result = activeFilters[i].available();
+            }
+        }
+        return result;
+    }
+
+
     // ---------------------------------------------------- InputBuffer Methods
 
 

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/BufferedInputFilter.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/BufferedInputFilter.java?view=diff&rev=533164&r1=533163&r2=533164
==============================================================================
--- 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/BufferedInputFilter.java
 (original)
+++ 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/BufferedInputFilter.java
 Fri Apr 27 10:04:36 2007
@@ -120,4 +120,8 @@
         return 0;
     }
 
+    public int available() {
+        return buffered.getLength();
+    }
+    
 }

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java?view=diff&rev=533164&r1=533163&r2=533164
==============================================================================
--- 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java
 (original)
+++ 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/ChunkedInputFilter.java
 Fri Apr 27 10:04:36 2007
@@ -189,6 +189,14 @@
 
 
     /**
+     * Amount of bytes still available in a buffer.
+     */
+    public int available() {
+        return (lastValid - pos);
+    }
+    
+
+    /**
      * Set the next buffer in the filter pipeline.
      */
     public void setBuffer(InputBuffer buffer) {

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/IdentityInputFilter.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/IdentityInputFilter.java?view=diff&rev=533164&r1=533163&r2=533164
==============================================================================
--- 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/IdentityInputFilter.java
 (original)
+++ 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/IdentityInputFilter.java
 Fri Apr 27 10:04:36 2007
@@ -173,6 +173,14 @@
 
 
     /**
+     * Amount of bytes still available in a buffer.
+     */
+    public int available() {
+        return 0;
+    }
+    
+
+    /**
      * Set the next buffer in the filter pipeline.
      */
     public void setBuffer(InputBuffer buffer) {

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java?view=diff&rev=533164&r1=533163&r2=533164
==============================================================================
--- 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java
 (original)
+++ 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/SavedRequestInputFilter.java
 Fri Apr 27 10:04:36 2007
@@ -94,6 +94,13 @@
     }
 
     /**
+     * Amount of bytes still available in a buffer.
+     */
+    public int available() {
+        return input.getLength();
+    }
+    
+    /**
      * End the current request (has no effect).
      */
     public long end() throws IOException {

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/VoidInputFilter.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/VoidInputFilter.java?view=diff&rev=533164&r1=533163&r2=533164
==============================================================================
--- 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/VoidInputFilter.java 
(original)
+++ 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/filters/VoidInputFilter.java 
Fri Apr 27 10:04:36 2007
@@ -116,4 +116,11 @@
     }
 
 
+    /**
+     * Amount of bytes still available in a buffer.
+     */
+    public int available() {
+        return 0;
+    }
+    
 }



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

Reply via email to