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