Author: markt
Date: Fri Sep 25 21:47:56 2015
New Revision: 1705358

URL: http://svn.apache.org/viewvc?rev=1705358&view=rev
Log:
Complete Servlet 3.1 non-blocking support

Modified:
    tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java
    tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java
    tomcat/trunk/java/org/apache/coyote/http2/Stream.java
    tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java
    tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java

Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java?rev=1705358&r1=1705357&r2=1705358&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java Fri Sep 25 
21:47:56 2015
@@ -163,7 +163,7 @@ class Http2Parser {
                     Integer.toString(streamId), Integer.toString(dataLength), 
padding));
         }
 
-        ByteBuffer dest = output.getInputByteBuffer(streamId, dataLength);
+        ByteBuffer dest = output.startRequestBodyFrame(streamId, payloadSize);
         if (dest == null) {
             swallow(streamId, dataLength, false);
             // Process padding before sending any notifications in case padding
@@ -185,7 +185,7 @@ class Http2Parser {
                 if (endOfStream) {
                     output.receiveEndOfStream(streamId);
                 }
-                dest.notifyAll();
+                output.endRequestBodyFrame(streamId);
             }
         }
         if (padLength > 0) {
@@ -586,7 +586,8 @@ class Http2Parser {
         HpackDecoder getHpackDecoder();
 
         // Data frames
-        ByteBuffer getInputByteBuffer(int streamId, int payloadSize) throws 
Http2Exception;
+        ByteBuffer startRequestBodyFrame(int streamId, int payloadSize) throws 
Http2Exception;
+        void endRequestBodyFrame(int streamId) throws Http2Exception;
         void receiveEndOfStream(int streamId) throws ConnectionException;
         void swallowedPadding(int streamId, int paddingLength) throws 
ConnectionException, IOException;
 

Modified: tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java?rev=1705358&r1=1705357&r2=1705358&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java 
(original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Fri Sep 
25 21:47:56 2015
@@ -953,13 +953,21 @@ public class Http2UpgradeHandler extends
 
 
     @Override
-    public ByteBuffer getInputByteBuffer(int streamId, int payloadSize) throws 
Http2Exception {
+    public ByteBuffer startRequestBodyFrame(int streamId, int payloadSize) 
throws Http2Exception {
         Stream stream = getStream(streamId, true);
         stream.checkState(FrameType.DATA);
         return stream.getInputByteBuffer();
     }
 
 
+
+    @Override
+    public void endRequestBodyFrame(int streamId) throws Http2Exception {
+        Stream stream = getStream(streamId, true);
+        stream.getInputBuffer().onDataAvailable();
+    }
+
+
     @Override
     public void receiveEndOfStream(int streamId) throws ConnectionException {
         Stream stream = getStream(streamId, 
connectionState.get().isNewStreamAllowed());

Modified: tomcat/trunk/java/org/apache/coyote/http2/Stream.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Stream.java?rev=1705358&r1=1705357&r2=1705358&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Stream.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Stream.java Fri Sep 25 21:47:56 
2015
@@ -21,6 +21,7 @@ import java.nio.ByteBuffer;
 import java.util.Iterator;
 
 import org.apache.coyote.ActionCode;
+import org.apache.coyote.ContainerThreadMarker;
 import org.apache.coyote.InputBuffer;
 import org.apache.coyote.OutputBuffer;
 import org.apache.coyote.Request;
@@ -537,11 +538,31 @@ public class Stream extends AbstractStre
         }
 
 
-        synchronized boolean isRegisteredForRead() {
+        synchronized boolean isRequestBodyFullyRead() {
+            return inBuffer.position() == 0 && isInputFinished();
+        }
+
+
+        synchronized int available() {
+            return inBuffer.position();
+        }
+
+
+        /*
+         * Called after placing some data in the inBuffer.
+         */
+        synchronized boolean onDataAvailable() {
             if (readInterest) {
                 readInterest = false;
+                coyoteRequest.action(ActionCode.DISPATCH_READ, null);
+                if (!ContainerThreadMarker.isContainerThread()) {
+                    coyoteRequest.action(ActionCode.DISPATCH_EXECUTE, null);
+                }
                 return true;
             } else {
+                synchronized (inBuffer) {
+                    inBuffer.notifyAll();
+                }
                 return false;
             }
         }

Modified: tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java?rev=1705358&r1=1705357&r2=1705358&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/StreamProcessor.java Fri Sep 25 
21:47:56 2015
@@ -154,6 +154,9 @@ public class StreamProcessor extends Abs
             ((AtomicBoolean) param).set(getErrorState().isError());
             break;
         }
+        case AVAILABLE: {
+            request.setAvailable(stream.getInputBuffer().available());
+        }
 
         // Request attribute support
         case REQ_HOST_ADDR_ATTRIBUTE: {
@@ -295,7 +298,7 @@ public class StreamProcessor extends Abs
         // Servlet 3.1 non-blocking I/O
         case REQUEST_BODY_FULLY_READ: {
             AtomicBoolean result = (AtomicBoolean) param;
-            result.set(stream.isInputFinished());
+            result.set(stream.getInputBuffer().isRequestBodyFullyRead());
             break;
         }
         case NB_READ_INTEREST: {
@@ -328,7 +331,6 @@ public class StreamProcessor extends Abs
 
         // Unimplemented / to review
         case ACK:
-        case AVAILABLE:
         case CLOSE_NOW:
         case DISABLE_SWALLOW_INPUT:
         case END_REQUEST:

Modified: tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java?rev=1705358&r1=1705357&r2=1705358&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java (original)
+++ tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java Fri Sep 25 
21:47:56 2015
@@ -718,13 +718,19 @@ public abstract class Http2TestBase exte
 
 
         @Override
-        public ByteBuffer getInputByteBuffer(int streamId, int payloadSize) {
+        public ByteBuffer startRequestBodyFrame(int streamId, int payloadSize) 
{
             lastStreamId = Integer.toString(streamId);
             trace.append(lastStreamId + "-Body-" + payloadSize + "\n");
             return null;
         }
 
 
+        @Override
+        public void endRequestBodyFrame(int streamId) throws Http2Exception {
+            // NO-OP
+        }
+
+
         @Override
         public void receiveEndOfStream(int streamId) {
             lastStreamId = Integer.toString(streamId);



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

Reply via email to