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