Author: markt
Date: Thu Aug 20 11:02:58 2015
New Revision: 1696756

URL: http://svn.apache.org/r1696756
Log:
Changes to the initial window size need to modify existing flow control windows 
as if the had started with the new initial size.

Modified:
    tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java
    tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_9.java

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=1696756&r1=1696755&r2=1696756&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java 
(original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Thu Aug 
20 11:02:58 2015
@@ -983,7 +983,22 @@ public class Http2UpgradeHandler extends
 
     @Override
     public void setting(Setting setting, long value) throws 
ConnectionException {
-        remoteSettings.set(setting, value);
+        // Special handling required
+        if (setting == Setting.INITIAL_WINDOW_SIZE) {
+            long oldValue = remoteSettings.getInitialWindowSize();
+            // Do this first in case new value is invalid
+            remoteSettings.set(setting, value);
+            int diff = (int) (value - oldValue);
+            for (Stream stream : streams.values()) {
+                try {
+                    stream.incrementWindowSize(diff);
+                } catch (Http2Exception e) {
+                    // Should never happen since the diff should always be 
valid
+                }
+            }
+        } else {
+            remoteSettings.set(setting, value);
+        }
     }
 
 

Modified: tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_9.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_9.java?rev=1696756&r1=1696755&r2=1696756&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_9.java 
(original)
+++ tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_9.java Thu Aug 
20 11:02:58 2015
@@ -16,6 +16,8 @@
  */
 package org.apache.coyote.http2;
 
+import java.nio.ByteBuffer;
+
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -153,5 +155,89 @@ public class TestHttp2Section_6_9 extend
         Assert.assertTrue(output.getTrace(), output.getTrace().startsWith(
                 "0-Goaway-[1]-[" + Http2Error.FLOW_CONTROL_ERROR.getCode() + 
"]-["));
     }
+
+
+    @Test
+    public void testWindowSizeAndSettingsFrame() throws Exception {
+        http2Connect();
+
+        // Set up a POST request that echoes the body back
+        byte[] headersFrameHeader = new byte[9];
+        ByteBuffer headersPayload = ByteBuffer.allocate(128);
+        byte[] dataFrameHeader = new byte[9];
+        ByteBuffer dataPayload = ByteBuffer.allocate(8 * 1024);
+
+        buildPostRequest(headersFrameHeader, headersPayload,
+                dataFrameHeader, dataPayload, null, 3);
+
+        // Write the headers
+        writeFrame(headersFrameHeader, headersPayload);
+
+        // Now use a settings frame to reduce the size of the flow control
+        // window.
+        sendSettings(0, false, new SettingValue(4, 4 * 1024));
+        // Ack
+        parser.readFrame(true);
+        Assert.assertEquals("0-Settings-Ack\n", output.getTrace());
+        output.clearTrace();
+
+        // Write the body
+        writeFrame(dataFrameHeader, dataPayload);
+
+        // Window size updates after reading POST body
+        parser.readFrame(true);
+        parser.readFrame(true);
+        Assert.assertEquals(
+                "0-WindowSize-[8192]\n" +
+                "3-WindowSize-[8192]\n",
+                output.getTrace());
+        output.clearTrace();
+
+        // Read stream 3 headers and first part of body
+        parser.readFrame(true);
+        parser.readFrame(true);
+        Assert.assertEquals(
+                "3-HeadersStart\n" +
+                "3-Header-[:status]-[200]\n" +
+                "3-HeadersEnd\n" +
+                "3-Body-4096\n", output.getTrace());
+                output.clearTrace();
+
+        // Do a POST that won't be affected by the above limit
+        sendSimplePostRequest(5, null);
+        // Window size updates after reading POST body
+        parser.readFrame(true);
+        parser.readFrame(true);
+        Assert.assertEquals(
+                "0-WindowSize-[128]\n" +
+                "5-WindowSize-[128]\n",
+                output.getTrace());
+        output.clearTrace();
+        // Headers + body
+        parser.readFrame(true);
+        parser.readFrame(true);
+        Assert.assertEquals(
+                "5-HeadersStart\n" +
+                "5-Header-[:status]-[200]\n" +
+                "5-HeadersEnd\n" +
+                "5-Body-128\n" +
+                "5-EndOfStream\n", output.getTrace());
+                output.clearTrace();
+
+        // Now use a settings frame to restore the size of the flow control
+        // window.
+        sendSettings(0, false, new SettingValue(4, 64 * 1024 - 1));
+        // Ack
+        parser.readFrame(true);
+        Assert.assertEquals("0-Settings-Ack\n", output.getTrace());
+        output.clearTrace();
+
+        // Stream remainder of stream 3 body
+        parser.readFrame(true);
+        Assert.assertEquals(
+                "3-Body-4096\n" +
+                "3-EndOfStream\n", output.getTrace());
+                output.clearTrace();
+    }
     // TODO: Remaining 6.9 tests
 }



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

Reply via email to