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/05/03 22:34:34 UTC

svn commit: r1478968 - in /tomcat/trunk: java/org/apache/coyote/http11/ test/org/apache/catalina/nonblocking/

Author: markt
Date: Fri May  3 20:34:34 2013
New Revision: 1478968

URL: http://svn.apache.org/r1478968
Log:
Faking of non-blocking reads for BIO.
Tweak test case so it relies more on the Servlet API and less on the implementation details of the test so BIO's fake blocking passes.

Modified:
    tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java
    tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java
    tomcat/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java
    tomcat/trunk/test/org/apache/catalina/nonblocking/TestNonBlockingAPI.java

Modified: tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java?rev=1478968&r1=1478967&r2=1478968&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java Fri May  3 20:34:34 2013
@@ -810,6 +810,8 @@ public abstract class AbstractHttp11Proc
             ((AtomicBoolean) param).set(asyncStateMachine.isAsyncTimingOut());
         } else if (actionCode == ActionCode.ASYNC_IS_ERROR) {
             ((AtomicBoolean) param).set(asyncStateMachine.isAsyncError());
+        } else if (actionCode == ActionCode.AVAILABLE) {
+            request.setAvailable(inputBuffer.available());
         } else if (actionCode == ActionCode.NB_WRITE_INTEREST) {
             AtomicBoolean isReady = (AtomicBoolean)param;
             isReady.set(getOutputBuffer().isReady());

Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java?rev=1478968&r1=1478967&r2=1478968&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java Fri May  3 20:34:34 2013
@@ -472,9 +472,6 @@ public class Http11NioProcessor extends 
                     log.warn(sm.getString("http11processor.socket.ssl"), e);
                 }
             }
-
-        } else if (actionCode == ActionCode.AVAILABLE) {
-            request.setAvailable(inputBuffer.available());
         } else if (actionCode == ActionCode.COMET_BEGIN) {
             comet = true;
         } else if (actionCode == ActionCode.COMET_END) {

Modified: tomcat/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java?rev=1478968&r1=1478967&r2=1478968&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http11/InternalInputBuffer.java Fri May  3 20:34:34 2013
@@ -71,6 +71,17 @@ public class InternalInputBuffer extends
 
 
     /**
+     * Data is always available for blocking IO (if you wait long enough) so
+     * return a value of 1. Note that the actual value is never used it is only
+     * tested for == 0 or > 0.
+     */
+    @Override
+    public int available() {
+        return 1;
+    }
+
+
+    /**
      * Read the request line. This function is meant to be used during the
      * HTTP request header parsing. Do NOT attempt to read the request body
      * using it.
@@ -543,8 +554,7 @@ public class InternalInputBuffer extends
 
     @Override
     protected int nbRead() throws IOException {
-        // TODO Auto-generated method stub
-        return 0;
+        throw new IllegalStateException("This method is unused for BIO");
     }
 
 

Modified: tomcat/trunk/test/org/apache/catalina/nonblocking/TestNonBlockingAPI.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/nonblocking/TestNonBlockingAPI.java?rev=1478968&r1=1478967&r2=1478968&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/nonblocking/TestNonBlockingAPI.java (original)
+++ tomcat/trunk/test/org/apache/catalina/nonblocking/TestNonBlockingAPI.java Fri May  3 20:34:34 2013
@@ -57,12 +57,6 @@ public class TestNonBlockingAPI extends 
     public void testNonBlockingRead() throws Exception {
         Tomcat tomcat = getTomcatInstance();
 
-        // TODO Faking non-blocking reads is not yet implemented for BIO.
-        if (tomcat.getConnector().getProtocolHandlerClassName().equals(
-                "org.apache.coyote.http11.Http11Protocol")) {
-            return;
-        }
-
         // TODO Non-blocking reads are not yet implemented for APR.
         if (tomcat.getConnector().getProtocolHandlerClassName().equals(
                 "org.apache.coyote.http11.Http11AprProtocol")) {
@@ -294,12 +288,8 @@ public class TestNonBlockingAPI extends 
             listener = new TestReadListener(actx);
             in.setReadListener(listener);
 
-            while (in.isReady()) {
-                listener.onDataAvailable();
-            }
+            listener.onDataAvailable();
         }
-
-
     }
 
     @WebServlet(asyncSupported = true)
@@ -365,12 +355,16 @@ public class TestNonBlockingAPI extends 
                 ServletInputStream in = ctx.getRequest().getInputStream();
                 String s = "";
                 byte[] b = new byte[8192];
-                while (in.isReady()) {
-                    int read = in.read(b);
+                int read = 0;
+                do {
+                    read = in.read(b);
+                    if (read == -1) {
+                        break;
+                    }
                     s += new String(b, 0, read);
-                }
+                } while (in.isReady());
                 System.out.println(s);
-                if ("FINISHED".equals(s)) {
+                if (s.endsWith("FINISHED")) {
                     ctx.complete();
                     ctx.getResponse().getWriter().print("OK");
                 } else {



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