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