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: [email protected]
For additional commands, e-mail: [email protected]