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 2015/06/09 21:26:08 UTC

svn commit: r1684505 - in /tomcat/trunk: java/org/apache/coyote/http2/Http2Parser.java java/org/apache/coyote/http2/Http2UpgradeHandler.java java/org/apache/coyote/http2/LocalStrings.properties test/org/apache/coyote/http2/TestHttp2Section_5_1.java

Author: markt
Date: Tue Jun  9 19:26:08 2015
New Revision: 1684505

URL: http://svn.apache.org/r1684505
Log:
Differentiate between retrieving an existing stream and creating a new one.
Start to add the 5.1.1 tests

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/LocalStrings.properties
    tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_1.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=1684505&r1=1684504&r2=1684505&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java Tue Jun  9 19:26:08 2015
@@ -517,11 +517,11 @@ class Http2Parser {
 
         // Data frames
         ByteBuffer getInputByteBuffer(int streamId, int payloadSize) throws Http2Exception;
-        void receiveEndOfStream(int streamId);
+        void receiveEndOfStream(int streamId) throws ConnectionError;
 
         // Header frames
         HeaderEmitter headersStart(int streamId) throws Http2Exception;
-        void headersEnd(int streamId);
+        void headersEnd(int streamId) throws ConnectionError;
 
         // Priority frames (also headers)
         void reprioritise(int streamId, int parentStreamId, boolean exclusive, int weight)

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=1684505&r1=1684504&r2=1684505&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Tue Jun  9 19:26:08 2015
@@ -168,7 +168,7 @@ public class Http2UpgradeHandler extends
                 socketWrapper.flush(true);
 
                 // Process the initial settings frame
-                stream = getStream(1);
+                stream = getStream(1, true);
                 String base64Settings = stream.getCoyoteRequest().getHeader(HTTP2_SETTINGS_HEADER);
                 byte[] settings = Base64.decodeBase64(base64Settings);
 
@@ -321,7 +321,8 @@ public class Http2UpgradeHandler extends
             int toRead = Math.min(buffer.length, len - read);
             int thisTime = socketWrapper.read(true, buffer, 0, toRead);
             if (thisTime == -1) {
-                throw new IOException("TODO: i18n");
+                throw new IOException(
+                        sm.getString("upgradeHandler.swallow.eos", Integer.valueOf(len)));
             }
             read += thisTime;
         }
@@ -339,15 +340,17 @@ public class Http2UpgradeHandler extends
     }
 
 
-    private void closeStream(StreamError se) throws IOException {
+    private void closeStream(StreamError se) throws ConnectionError, IOException {
 
         if (log.isDebugEnabled()) {
             log.debug(sm.getString("upgradeHandler.rst.debug", connectionId,
                     Integer.toString(se.getStreamId()), se.getError()));
         }
 
-        Stream stream = getStream(se.getStreamId());
-        stream.sendRst();
+        Stream stream = getStream(se.getStreamId(), false);
+        if (stream != null) {
+            stream.sendRst();
+        }
 
         // Write a RST frame
         byte[] rstFrame = new byte[13];
@@ -624,18 +627,33 @@ public class Http2UpgradeHandler extends
     }
 
 
-    private Stream getStream(int streamId) {
+    private Stream getStream(int streamId, boolean unknownIsError) throws ConnectionError{
+        Integer key = Integer.valueOf(streamId);
+        Stream result = streams.get(key);
+        if (result == null && unknownIsError) {
+            // Stream has been closed and removed from the map
+            throw new ConnectionError(sm.getString("upgradeHandler.stream.closed", key), Error.PROTOCOL_ERROR);
+        }
+        return result;
+    }
+
+
+    private Stream createRemoteStream(int streamId) throws ConnectionError {
         Integer key = Integer.valueOf(streamId);
 
-        if (streamId > maxRemoteStreamId) {
-            // Must be a new stream
-            maxRemoteStreamId = streamId;
-            Stream stream = new Stream(key, this);
-            streams.put(key, stream);
-            return stream;
-        } else {
-            return streams.get(key);
+        if (streamId %2 != 1) {
+            throw new ConnectionError(
+                    sm.getString("upgradeHandler.stream.even", key), Error.PROTOCOL_ERROR);
         }
+
+        if (streamId <= maxRemoteStreamId) {
+            throw new ConnectionError(sm.getString("upgradeHandler.stream.old", key,
+                    Integer.valueOf(maxRemoteStreamId)), Error.PROTOCOL_ERROR);
+        }
+
+        Stream result = new Stream(key, this);
+        streams.put(key, result);
+        return result;
     }
 
 
@@ -741,7 +759,7 @@ public class Http2UpgradeHandler extends
 
     @Override
     public ByteBuffer getInputByteBuffer(int streamId, int payloadSize) throws Http2Exception {
-        Stream stream = getStream(streamId);
+        Stream stream = getStream(streamId, true);
         if (stream == null) {
             return null;
         }
@@ -751,8 +769,8 @@ public class Http2UpgradeHandler extends
 
 
     @Override
-    public void receiveEndOfStream(int streamId) {
-        Stream stream = getStream(streamId);
+    public void receiveEndOfStream(int streamId) throws ConnectionError {
+        Stream stream = getStream(streamId, true);
         if (stream != null) {
             stream.receivedEndOfStream();
         }
@@ -761,7 +779,10 @@ public class Http2UpgradeHandler extends
 
     @Override
     public HeaderEmitter headersStart(int streamId) throws Http2Exception {
-        Stream stream = getStream(streamId);
+        Stream stream = getStream(streamId, false);
+        if (stream == null) {
+            stream = createRemoteStream(streamId);
+        }
         stream.checkState(FrameType.HEADERS);
         stream.receivedStartOfHeaders();
         return stream;
@@ -771,9 +792,12 @@ public class Http2UpgradeHandler extends
     @Override
     public void reprioritise(int streamId, int parentStreamId,
             boolean exclusive, int weight) throws Http2Exception {
-        Stream stream = getStream(streamId);
+        Stream stream = getStream(streamId, false);
+        if (stream == null) {
+            stream = createRemoteStream(streamId);
+        }
         stream.checkState(FrameType.PRIORITY);
-        AbstractStream parentStream = getStream(parentStreamId);
+        AbstractStream parentStream = getStream(parentStreamId, false);
         if (parentStream == null) {
             parentStream = this;
         }
@@ -782,8 +806,8 @@ public class Http2UpgradeHandler extends
 
 
     @Override
-    public void headersEnd(int streamId) {
-        Stream stream = getStream(streamId);
+    public void headersEnd(int streamId) throws ConnectionError {
+        Stream stream = getStream(streamId, true);
         // Process this stream on a container thread
         StreamProcessor streamProcessor = new StreamProcessor(stream, adapter, socketWrapper);
         streamProcessor.setSslSupport(sslSupport);
@@ -794,7 +818,7 @@ public class Http2UpgradeHandler extends
 
     @Override
     public void reset(int streamId, long errorCode) throws Http2Exception  {
-        Stream stream = getStream(streamId);
+        Stream stream = getStream(streamId, true);
         if (stream != null) {
             stream.checkState(FrameType.RST);
             stream.reset(errorCode);
@@ -852,13 +876,11 @@ public class Http2UpgradeHandler extends
 
     @Override
     public void incrementWindowSize(int streamId, int increment) throws Http2Exception {
-        AbstractStream stream = getStream(streamId);
-        if (stream != null) {
-            if (streamId > 0) {
-                ((Stream) stream).checkState(FrameType.WINDOW_UPDATE);
-            }
-            stream.incrementWindowSize(increment);
+        AbstractStream stream = getStream(streamId, true);
+        if (streamId > 0) {
+            ((Stream) stream).checkState(FrameType.WINDOW_UPDATE);
         }
+        stream.incrementWindowSize(increment);
     }
 
 

Modified: tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties?rev=1684505&r1=1684504&r2=1684505&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/LocalStrings.properties Tue Jun  9 19:26:08 2015
@@ -69,6 +69,10 @@ upgradeHandler.init=Connection [{0}]
 upgradeHandler.ioerror=Connection [{0}]
 upgradeHandler.sendPrefaceFail=Failed to send preface to client
 upgradeHandler.socketCloseFailed=Error closing socket
+upgradeHandler.stream.closed=Stream [{0}] has been closed for some time
+upgradeHandler.stream.even=A new remote stream ID of [{0}] was requested but all remote streams must use odd identifiers
+upgradeHandler.stream.old=A new remote stream ID of [{0}] was requested but the most recent stream was [{1}]
+upgradeHandler.swallow.eos=End of stream found while trying to swallow [{0}] bytes
 upgradeHandler.unexpectedEos=Unexpected end of stream
 upgradeHandler.unexpectedStatus=An unexpected value of status ([{0}]) was passed to this method
 upgradeHandler.upgrade=Connection [{0}], HTTP/1.1 upgrade to stream [1]

Modified: tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_1.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_1.java?rev=1684505&r1=1684504&r2=1684505&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_1.java (original)
+++ tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_1.java Tue Jun  9 19:26:08 2015
@@ -128,4 +128,31 @@ public class TestHttp2Section_5_1 extend
 
 
     // TODO: Invalid frames for each of the remaining states
+
+    // Section 5.1.1
+
+    @Test
+    public void testClientSendEvenStream() throws Exception {
+        hpackEncoder = new HpackEncoder(ConnectionSettings.DEFAULT_HEADER_TABLE_SIZE);
+
+        // HTTP2 upgrade
+        http2Connect();
+
+        // Part 1
+        byte[] frameHeader = new byte[9];
+        ByteBuffer headersPayload = ByteBuffer.allocate(128);
+        buildSimpleRequestPart1(frameHeader, headersPayload, 4);
+        writeFrame(frameHeader, headersPayload);
+
+        // headers, body
+        parser.readFrame(true);
+
+        Assert.assertTrue(output.getTrace(),
+                output.getTrace().startsWith("0-Goaway-[2147483647]-[" +
+                        Error.PROTOCOL_ERROR.getCode() + "]-["));
+    }
+
+    // TODO Remaining 5.1.1 tests
+
+    // TODO 5.1.2 tests
 }



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