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]