Author: markt
Date: Thu Aug 20 10:36:25 2015
New Revision: 1696754
URL: http://svn.apache.org/r1696754
Log:
Refactor setting handling so common validation is applied to local and remote
Added:
tomcat/trunk/java/org/apache/coyote/http2/Setting.java (with props)
Modified:
tomcat/trunk/java/org/apache/coyote/http2/AbstractStream.java
tomcat/trunk/java/org/apache/coyote/http2/ConnectionSettingsBase.java
tomcat/trunk/java/org/apache/coyote/http2/ConnectionSettingsLocal.java
tomcat/trunk/java/org/apache/coyote/http2/ConnectionSettingsRemote.java
tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java
tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java
tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java
tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_2.java
tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_2.java
tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_3.java
tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_5.java
tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_5.java
tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_9.java
Modified: tomcat/trunk/java/org/apache/coyote/http2/AbstractStream.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/AbstractStream.java?rev=1696754&r1=1696753&r2=1696754&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/AbstractStream.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/AbstractStream.java Thu Aug 20
10:36:25 2015
@@ -35,7 +35,7 @@ abstract class AbstractStream {
private volatile AbstractStream parentStream = null;
private final Set<AbstractStream> childStreams = new HashSet<>();
- private long windowSize =
ConnectionSettingsRemote.DEFAULT_INITIAL_WINDOW_SIZE;
+ private long windowSize =
ConnectionSettingsBase.DEFAULT_INITIAL_WINDOW_SIZE;
public Integer getIdentifier() {
return identifier;
@@ -119,7 +119,7 @@ abstract class AbstractStream {
getIdentifier(), Integer.toString(increment),
Long.toString(windowSize)));
}
- if (windowSize > ConnectionSettingsRemote.MAX_WINDOW_SIZE) {
+ if (windowSize > ConnectionSettingsBase.MAX_WINDOW_SIZE) {
String msg = sm.getString("abstractStream.windowSizeTooBig",
getConnectionId(), identifier,
Integer.toString(increment), Long.toString(windowSize));
if (identifier.intValue() == 0) {
Modified: tomcat/trunk/java/org/apache/coyote/http2/ConnectionSettingsBase.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/ConnectionSettingsBase.java?rev=1696754&r1=1696753&r2=1696754&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/ConnectionSettingsBase.java
(original)
+++ tomcat/trunk/java/org/apache/coyote/http2/ConnectionSettingsBase.java Thu
Aug 20 10:36:25 2015
@@ -16,6 +16,198 @@
*/
package org.apache.coyote.http2;
-public abstract class ConnectionSettingsBase {
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.res.StringManager;
+
+public abstract class ConnectionSettingsBase<T extends Throwable> {
+
+ private final Log log = LogFactory.getLog(ConnectionSettingsBase.class);
+ private final StringManager sm =
StringManager.getManager(ConnectionSettingsBase.class);
+
+ // Limits
+ protected static final int MAX_WINDOW_SIZE = (1 << 31) - 1;
+ protected static final int MIN_MAX_FRAME_SIZE = 1 << 14;
+ protected static final int MAX_MAX_FRAME_SIZE = (1 << 24) - 1;
+ protected static final long UNLIMITED = ((long)1 << 32); // Use the
maximum possible
+
+ // Defaults
+ protected static final int DEFAULT_HEADER_TABLE_SIZE = 4096;
+ protected static final boolean DEFAULT_ENABLE_PUSH = true;
+ protected static final long DEFAULT_MAX_CONCURRENT_STREAMS = UNLIMITED;
+ protected static final int DEFAULT_INITIAL_WINDOW_SIZE = (1 << 16) - 1;
+ protected static final int DEFAULT_MAX_FRAME_SIZE = MIN_MAX_FRAME_SIZE;
+ protected static final long DEFAULT_MAX_HEADER_LIST_SIZE = UNLIMITED;
+
+ protected Map<Setting,Long> current = new HashMap<>();
+ protected Map<Setting,Long> pending = new HashMap<>();
+
+
+ public ConnectionSettingsBase() {
+ // Set up the defaults
+ current.put(Setting.HEADER_TABLE_SIZE,
Long.valueOf(DEFAULT_HEADER_TABLE_SIZE));
+ current.put(Setting.ENABLE_PUSH,
Long.valueOf(DEFAULT_ENABLE_PUSH ? 1 : 0));
+ current.put(Setting.MAX_CONCURRENT_STREAMS,
Long.valueOf(DEFAULT_MAX_CONCURRENT_STREAMS));
+ current.put(Setting.INITIAL_WINDOW_SIZE,
Long.valueOf(DEFAULT_INITIAL_WINDOW_SIZE));
+ current.put(Setting.MAX_FRAME_SIZE,
Long.valueOf(DEFAULT_MAX_FRAME_SIZE));
+ current.put(Setting.MAX_HEADER_LIST_SIZE,
Long.valueOf(DEFAULT_MAX_HEADER_LIST_SIZE));
+ }
+
+
+ public void set(Setting setting, long value) throws T {
+ if (log.isDebugEnabled()) {
+ log.debug(sm.getString("connectionSettings.debug", setting,
Long.toString(value)));
+ }
+
+ switch(setting) {
+ case HEADER_TABLE_SIZE:
+ validateHeaderTableSize(value);
+ break;
+ case ENABLE_PUSH:
+ validateEnablePush(value);
+ break;
+ case MAX_CONCURRENT_STREAMS:
+ // No further validation required
+ break;
+ case INITIAL_WINDOW_SIZE:
+ validateInitialWindowSize(value);
+ break;
+ case MAX_FRAME_SIZE:
+ validateMaxFrameSize(value);
+ break;
+ case MAX_HEADER_LIST_SIZE:
+ // No further validation required
+ break;
+ case UNKNOWN:
+ // Unrecognised. Ignore it.
+ log.warn(sm.getString("connectionSettings.unknown", setting,
Long.toString(value)));
+ return;
+ }
+
+ set(setting, Long.valueOf(value));
+ }
+
+
+ synchronized void set(Setting setting, Long value) {
+ current.put(setting, value);
+ }
+
+
+ public int getHeaderTableSize() {
+ return getMinInt(Setting.HEADER_TABLE_SIZE);
+ }
+
+
+ public boolean getEnablePush() {
+ long result = getMin(Setting.ENABLE_PUSH);
+ return result != 0;
+ }
+
+
+ public long getMaxConcurrentStreams() {
+ return getMax(Setting.MAX_CONCURRENT_STREAMS);
+ }
+
+
+ public int getInitialWindowSize() {
+ return getMaxInt(Setting.INITIAL_WINDOW_SIZE);
+ }
+
+
+ public int getMaxFrameSize() {
+ return getMaxInt(Setting.MAX_FRAME_SIZE);
+ }
+
+
+ public long getMaxHeaderListSize() {
+ return getMax(Setting.MAX_HEADER_LIST_SIZE);
+ }
+
+
+ private synchronized long getMin(Setting setting) {
+ Long pendingValue = pending.get(setting);
+ long currentValue = current.get(setting).longValue();
+ if (pendingValue == null) {
+ return currentValue;
+ } else {
+ return Long.min(pendingValue.longValue(), currentValue);
+ }
+ }
+
+
+ private synchronized int getMinInt(Setting setting) {
+ long result = getMin(setting);
+ if (result > Integer.MAX_VALUE) {
+ return Integer.MAX_VALUE;
+ } else {
+ return (int) result;
+ }
+ }
+
+
+ private synchronized long getMax(Setting setting) {
+ Long pendingValue = pending.get(setting);
+ long currentValue = current.get(setting).longValue();
+ if (pendingValue == null) {
+ return currentValue;
+ } else {
+ return Long.max(pendingValue.longValue(), currentValue);
+ }
+ }
+
+
+ private synchronized int getMaxInt(Setting setting) {
+ long result = getMax(setting);
+ if (result > Integer.MAX_VALUE) {
+ return Integer.MAX_VALUE;
+ } else {
+ return (int) result;
+ }
+ }
+
+
+ private void validateHeaderTableSize(long headerTableSize) throws T {
+ // Need to put a sensible limit on this. Start with 16k (default is 4k)
+ if (headerTableSize > (16 * 1024)) {
+ String msg =
sm.getString("connectionSettings.headerTableSizeLimit",
+ Long.toString(headerTableSize));
+ throwException(msg, Http2Error.PROTOCOL_ERROR);
+ }
+ }
+
+
+ private void validateEnablePush(long enablePush) throws T {
+ // Can't be less than zero since the result of the byte->long
conversion
+ // will never be negative
+ if (enablePush > 1) {
+ String msg = sm.getString("connectionSettings.enablePushInvalid",
+ Long.toString(enablePush));
+ throwException(msg, Http2Error.PROTOCOL_ERROR);
+ }
+ }
+
+
+ private void validateInitialWindowSize(long initialWindowSize) throws T {
+ if (initialWindowSize > MAX_WINDOW_SIZE) {
+ String msg = sm.getString("connectionSettings.windowSizeTooBig",
+ Long.toString(initialWindowSize),
Long.toString(MAX_WINDOW_SIZE));
+ throwException(msg, Http2Error.FLOW_CONTROL_ERROR);
+ }
+ }
+
+
+ private void validateMaxFrameSize(long maxFrameSize) throws T {
+ if (maxFrameSize < MIN_MAX_FRAME_SIZE || maxFrameSize >
MAX_MAX_FRAME_SIZE) {
+ String msg = sm.getString("connectionSettings.maxFrameSizeInvalid",
+ Long.toString(maxFrameSize),
Integer.toString(MIN_MAX_FRAME_SIZE),
+ Integer.toString(MAX_MAX_FRAME_SIZE));
+ throwException(msg, Http2Error.PROTOCOL_ERROR);
+ }
+ }
+
+
+ abstract void throwException(String msg, Http2Error error) throws T;
}
Modified: tomcat/trunk/java/org/apache/coyote/http2/ConnectionSettingsLocal.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/ConnectionSettingsLocal.java?rev=1696754&r1=1696753&r2=1696754&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/ConnectionSettingsLocal.java
(original)
+++ tomcat/trunk/java/org/apache/coyote/http2/ConnectionSettingsLocal.java Thu
Aug 20 10:36:25 2015
@@ -16,7 +16,6 @@
*/
package org.apache.coyote.http2;
-import java.util.HashMap;
import java.util.Map;
/**
@@ -31,92 +30,17 @@ import java.util.Map;
* client will respond (almost certainly by closing the connection) as defined
* in the HTTP/2 specification.
*/
-public class ConnectionSettingsLocal extends ConnectionSettingsBase {
-
- private static final Integer KEY_HEADER_TABLE_SIZE = Integer.valueOf(1);
- private static final Integer KEY_ENABLE_PUSH = Integer.valueOf(2);
- private static final Integer KEY_MAX_CONCURRENT_STREAMS =
Integer.valueOf(3);
- private static final Integer KEY_INITIAL_WINDOW_SIZE = Integer.valueOf(4);
- private static final Integer KEY_MAX_FRAME_SIZE = Integer.valueOf(5);
- private static final Integer KEY_MAX_HEADER_LIST_SIZE = Integer.valueOf(6);
-
- private static final Long DEFAULT_HEADER_TABLE_SIZE =
- Long.valueOf(ConnectionSettingsRemote.DEFAULT_HEADER_TABLE_SIZE);
- private static final Long DEFAULT_ENABLE_PUSH = Long.valueOf(1);
- private static final Long DEFAULT_MAX_CONCURRENT_STREAMS =
- Long.valueOf(ConnectionSettingsRemote.UNLIMITED);
- private static final Long DEFAULT_INITIAL_WINDOW_SIZE =
- Long.valueOf(ConnectionSettingsRemote.DEFAULT_INITIAL_WINDOW_SIZE);
- private static final Long DEFAULT_MAX_FRAME_SIZE =
- Long.valueOf(ConnectionSettingsRemote.DEFAULT_MAX_FRAME_SIZE);
- private static final Long DEFAULT_MAX_HEADER_LIST_SIZE =
- Long.valueOf(ConnectionSettingsRemote.UNLIMITED);
-
- boolean sendInProgress = false;
-
- private Map<Integer,Long> current = new HashMap<>();
- private Map<Integer,Long> pending = new HashMap<>();
-
-
- public ConnectionSettingsLocal() {
- // Set up the defaults
- current.put(KEY_HEADER_TABLE_SIZE, DEFAULT_HEADER_TABLE_SIZE);
- current.put(KEY_ENABLE_PUSH, DEFAULT_ENABLE_PUSH);
- current.put(KEY_MAX_CONCURRENT_STREAMS,
DEFAULT_MAX_CONCURRENT_STREAMS);
- current.put(KEY_INITIAL_WINDOW_SIZE, DEFAULT_INITIAL_WINDOW_SIZE);
- current.put(KEY_MAX_FRAME_SIZE, DEFAULT_MAX_FRAME_SIZE);
- current.put(KEY_MAX_HEADER_LIST_SIZE, DEFAULT_MAX_HEADER_LIST_SIZE);
- }
+public class ConnectionSettingsLocal extends
ConnectionSettingsBase<IllegalArgumentException> {
+ private boolean sendInProgress = false;
- private synchronized void set(Integer key, long value) {
+ @Override
+ protected synchronized void set(Setting setting, Long value) {
checkSend();
- if (current.get(key).longValue() == value) {
- pending.remove(key);
- } else {
- pending.put(key, Long.valueOf(value));
- }
- }
-
-
- private synchronized long getMin(Integer key) {
- Long pendingValue = pending.get(key);
- long currentValue = current.get(key).longValue();
- if (pendingValue == null) {
- return currentValue;
- } else {
- return Long.min(pendingValue.longValue(), currentValue);
- }
- }
-
-
- private int getMinInt(Integer key) {
- long result = getMin(key);
- if (result > Integer.MAX_VALUE) {
- return Integer.MAX_VALUE;
- } else {
- return (int) result;
- }
- }
-
-
- private synchronized long getMax(Integer key) {
- Long pendingValue = pending.get(key);
- long currentValue = current.get(key).longValue();
- if (pendingValue == null) {
- return currentValue;
- } else {
- return Long.max(pendingValue.longValue(), currentValue);
- }
- }
-
-
- private int getMaxInt(Integer key) {
- long result = getMax(key);
- if (result > Integer.MAX_VALUE) {
- return Integer.MAX_VALUE;
+ if (current.get(setting).longValue() == value.longValue()) {
+ pending.remove(setting);
} else {
- return (int) result;
+ pending.put(setting, value);
}
}
@@ -132,8 +56,8 @@ public class ConnectionSettingsLocal ext
// Stream is zero
// Payload
int pos = 9;
- for (Map.Entry<Integer,Long> setting : pending.entrySet()) {
- ByteUtil.setTwoBytes(result, pos, setting.getKey().intValue());
+ for (Map.Entry<Setting,Long> setting : pending.entrySet()) {
+ ByteUtil.setTwoBytes(result, pos, setting.getKey().getId());
pos += 2;
ByteUtil.setFourBytes(result, pos, setting.getValue().longValue());
pos += 4;
@@ -163,51 +87,8 @@ public class ConnectionSettingsLocal ext
}
- public int getHeaderTableSize() {
- return getMinInt(KEY_HEADER_TABLE_SIZE);
- }
- public void setHeaderTableSize(long headerTableSize) {
- set(KEY_HEADER_TABLE_SIZE, headerTableSize);
- }
-
-
- public boolean getEnablePush() {
- long result = getMin(KEY_ENABLE_PUSH);
- return result != 0;
- }
- public void setEnablePush(long enablePush) {
- set(KEY_ENABLE_PUSH, enablePush);
- }
-
-
- public long getMaxConcurrentStreams() {
- return getMax(KEY_MAX_CONCURRENT_STREAMS);
- }
- public void setMaxConcurrentStreams(long maxConcurrentStreams) {
- set(KEY_MAX_CONCURRENT_STREAMS, maxConcurrentStreams);
- }
-
-
- public int getInitialWindowSize() {
- return getMaxInt(KEY_INITIAL_WINDOW_SIZE);
- }
- public void setInitialWindowSize(long initialWindowSize) {
- set(KEY_INITIAL_WINDOW_SIZE, initialWindowSize);
- }
-
-
- public int getMaxFrameSize() {
- return getMaxInt(KEY_MAX_FRAME_SIZE);
- }
- public void setMaxFrameSize(long maxFrameSize) {
- set(KEY_MAX_FRAME_SIZE, maxFrameSize);
- }
-
-
- public long getMaxHeaderListSize() {
- return getMax(KEY_MAX_HEADER_LIST_SIZE);
- }
- public void setMaxHeaderListSize(long maxHeaderListSize) {
- set(KEY_MAX_HEADER_LIST_SIZE, maxHeaderListSize);
+ @Override
+ void throwException(String msg, Http2Error error) throws
IllegalArgumentException {
+ throw new IllegalArgumentException(msg);
}
}
Modified:
tomcat/trunk/java/org/apache/coyote/http2/ConnectionSettingsRemote.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/ConnectionSettingsRemote.java?rev=1696754&r1=1696753&r2=1696754&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/ConnectionSettingsRemote.java
(original)
+++ tomcat/trunk/java/org/apache/coyote/http2/ConnectionSettingsRemote.java Thu
Aug 20 10:36:25 2015
@@ -16,134 +16,14 @@
*/
package org.apache.coyote.http2;
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.util.res.StringManager;
-
/**
* Represents the remote connection settings: i.e. the settings the server must
* use when communicating with the client.
*/
-public class ConnectionSettingsRemote extends ConnectionSettingsBase {
-
- private final Log log = LogFactory.getLog(ConnectionSettingsRemote.class);
- private final StringManager sm =
StringManager.getManager(ConnectionSettingsRemote.class);
-
- public static final int DEFAULT_INITIAL_WINDOW_SIZE = (1 << 16) - 1;
- static final long UNLIMITED = ((long)1 << 32); // Use the maximum possible
- static final int MAX_WINDOW_SIZE = (1 << 31) - 1;
-
- private static final int MIN_MAX_FRAME_SIZE = 1 << 14;
- private static final int MAX_MAX_FRAME_SIZE = (1 << 24) - 1;
- static final int DEFAULT_MAX_FRAME_SIZE = MIN_MAX_FRAME_SIZE;
-
- static final int DEFAULT_HEADER_TABLE_SIZE = 4096;
- private volatile int headerTableSize = DEFAULT_HEADER_TABLE_SIZE;
-
- private volatile boolean enablePush = true;
- private volatile long maxConcurrentStreams = UNLIMITED;
- private volatile int initialWindowSize = DEFAULT_INITIAL_WINDOW_SIZE;
- private volatile int maxFrameSize = DEFAULT_MAX_FRAME_SIZE;
- private volatile long maxHeaderListSize = UNLIMITED;
-
- public void set(int parameterId, long value) throws ConnectionException {
- if (log.isDebugEnabled()) {
- log.debug(sm.getString("connectionSettings.debug",
- Integer.toString(parameterId), Long.toString(value)));
- }
-
- switch(parameterId) {
- case 1:
- setHeaderTableSize(value);
- break;
- case 2:
- setEnablePush(value);
- break;
- case 3:
- setMaxConcurrentStreams(value);
- break;
- case 4:
- setInitialWindowSize(value);
- break;
- case 5:
- setMaxFrameSize(value);
- break;
- case 6:
- setMaxHeaderListSize(value);
- break;
- default:
- // Unrecognised. Ignore it.
- log.warn(sm.getString("connectionSettings.unknown",
- Integer.toString(parameterId), Long.toString(value)));
- }
- }
-
-
- public int getHeaderTableSize() {
- return headerTableSize;
- }
- public void setHeaderTableSize(long headerTableSize) throws
ConnectionException {
- // Need to put a sensible limit on this. Start with 16k (default is 4k)
- if (headerTableSize > (16 * 1024)) {
- throw new
ConnectionException(sm.getString("connectionSettings.headerTableSizeLimit",
- Long.toString(headerTableSize)),
Http2Error.PROTOCOL_ERROR);
- }
- this.headerTableSize = (int) headerTableSize;
- }
-
+public class ConnectionSettingsRemote extends
ConnectionSettingsBase<ConnectionException> {
- public boolean getEnablePush() {
- return enablePush;
- }
- public void setEnablePush(long enablePush) throws ConnectionException {
- // Can't be less than zero since the result of the byte->long
conversion
- // will never be negative
- if (enablePush > 1) {
- throw new
ConnectionException(sm.getString("connectionSettings.enablePushInvalid",
- Long.toString(enablePush)), Http2Error.PROTOCOL_ERROR);
- }
- this.enablePush = (enablePush == 1);
- }
-
-
- public long getMaxConcurrentStreams() {
- return maxConcurrentStreams;
- }
- public void setMaxConcurrentStreams(long maxConcurrentStreams) {
- this.maxConcurrentStreams = maxConcurrentStreams;
- }
-
-
- public int getInitialWindowSize() {
- return initialWindowSize;
- }
- public void setInitialWindowSize(long initialWindowSize) throws
ConnectionException {
- if (initialWindowSize > MAX_WINDOW_SIZE) {
- throw new
ConnectionException(sm.getString("connectionSettings.windowSizeTooBig",
- Long.toString(initialWindowSize),
Long.toString(MAX_WINDOW_SIZE)),
- Http2Error.FLOW_CONTROL_ERROR);
- }
- this.initialWindowSize = (int) initialWindowSize;
- }
-
-
- public int getMaxFrameSize() {
- return maxFrameSize;
- }
- public void setMaxFrameSize(long maxFrameSize) throws ConnectionException {
- if (maxFrameSize < MIN_MAX_FRAME_SIZE || maxFrameSize >
MAX_MAX_FRAME_SIZE) {
- throw new
ConnectionException(sm.getString("connectionSettings.maxFrameSizeInvalid",
- Long.toString(maxFrameSize),
Integer.toString(MIN_MAX_FRAME_SIZE),
- Integer.toString(MAX_MAX_FRAME_SIZE)),
Http2Error.PROTOCOL_ERROR);
- }
- this.maxFrameSize = (int) maxFrameSize;
- }
-
-
- public long getMaxHeaderListSize() {
- return maxHeaderListSize;
- }
- public void setMaxHeaderListSize(long maxHeaderListSize) {
- this.maxHeaderListSize = maxHeaderListSize;
+ @Override
+ void throwException(String msg, Http2Error error) throws
ConnectionException {
+ throw new ConnectionException(msg, error);
}
}
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=1696754&r1=1696753&r2=1696754&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java (original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2Parser.java Thu Aug 20
10:36:25 2015
@@ -44,8 +44,6 @@ class Http2Parser {
private volatile int headersCurrentStream = -1;
private volatile boolean headersEndStream = false;
- private volatile int maxPayloadSize =
ConnectionSettingsRemote.DEFAULT_MAX_FRAME_SIZE;
-
Http2Parser(String connectionId, Input input, Output output) {
this.connectionId = connectionId;
@@ -308,7 +306,7 @@ class Http2Parser {
input.fill(true, setting);
int id = ByteUtil.getTwoBytes(setting, 0);
long value = ByteUtil.getFourBytes(setting, 2);
- output.setting(id, value);
+ output.setting(Setting.valueOf(id), value);
}
}
output.settingsEnd(ack);
@@ -486,9 +484,10 @@ class Http2Parser {
expected, frameType), Http2Error.PROTOCOL_ERROR, streamId);
}
- if (payloadSize > maxPayloadSize) {
+ int maxFrameSize = input.getMaxFrameSize();
+ if (payloadSize > maxFrameSize) {
throw new
ConnectionException(sm.getString("http2Parser.payloadTooBig",
- Integer.toString(payloadSize),
Integer.toString(maxPayloadSize)),
+ Integer.toString(payloadSize),
Integer.toString(maxFrameSize)),
Http2Error.FRAME_SIZE_ERROR);
}
@@ -573,6 +572,8 @@ class Http2Parser {
}
return result;
}
+
+ int getMaxFrameSize();
}
@@ -601,7 +602,7 @@ class Http2Parser {
void reset(int streamId, long errorCode) throws Http2Exception;
// Settings frames
- void setting(int identifier, long value) throws ConnectionException;
+ void setting(Setting setting, long value) throws ConnectionException;
void settingsEnd(boolean ack) throws IOException;
// Ping frames
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=1696754&r1=1696753&r2=1696754&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java
(original)
+++ tomcat/trunk/java/org/apache/coyote/http2/Http2UpgradeHandler.java Thu Aug
20 10:36:25 2015
@@ -195,7 +195,7 @@ public class Http2UpgradeHandler extends
for (int i = 0; i < settings.length % 6; i++) {
int id = ByteUtil.getTwoBytes(settings, i * 6);
long value = ByteUtil.getFourBytes(settings, (i * 6) + 2);
- remoteSettings.set(id, value);
+ remoteSettings.set(Setting.valueOf(id), value);
}
} catch (Http2Exception | IOException ioe) {
throw new ProtocolException(
@@ -812,12 +812,12 @@ public class Http2UpgradeHandler extends
public void setMaxConcurrentStreams(long maxConcurrentStreams) {
- localSettings.setMaxConcurrentStreams(maxConcurrentStreams);
+ localSettings.set(Setting.MAX_CONCURRENT_STREAMS,
maxConcurrentStreams);
}
public void setInitialWindowSize(int initialWindowSize) {
- localSettings.setInitialWindowSize(initialWindowSize);
+ localSettings.set(Setting.INITIAL_WINDOW_SIZE, initialWindowSize);
}
@@ -852,6 +852,12 @@ public class Http2UpgradeHandler extends
}
+ @Override
+ public int getMaxFrameSize() {
+ return localSettings.getMaxFrameSize();
+ }
+
+
// ---------------------------------------------- Http2Parser.Output
methods
@Override
@@ -976,8 +982,8 @@ public class Http2UpgradeHandler extends
@Override
- public void setting(int identifier, long value) throws ConnectionException
{
- remoteSettings.set(identifier, value);
+ public void setting(Setting setting, long value) throws
ConnectionException {
+ remoteSettings.set(setting, value);
}
Added: tomcat/trunk/java/org/apache/coyote/http2/Setting.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http2/Setting.java?rev=1696754&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http2/Setting.java (added)
+++ tomcat/trunk/java/org/apache/coyote/http2/Setting.java Thu Aug 20 10:36:25
2015
@@ -0,0 +1,52 @@
+package org.apache.coyote.http2;
+
+public enum Setting {
+ HEADER_TABLE_SIZE(1),
+ ENABLE_PUSH(2),
+ MAX_CONCURRENT_STREAMS(3),
+ INITIAL_WINDOW_SIZE(4),
+ MAX_FRAME_SIZE(5),
+ MAX_HEADER_LIST_SIZE(6),
+ UNKNOWN(Integer.MAX_VALUE);
+
+ private final int id;
+
+ private Setting (int id) {
+ this.id = id;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ @Override
+ public String toString() {
+ return Integer.toString(id);
+ }
+
+ public static Setting valueOf(int i) {
+ switch(i) {
+ case 1: {
+ return HEADER_TABLE_SIZE;
+ }
+ case 2: {
+ return ENABLE_PUSH;
+ }
+ case 3: {
+ return MAX_CONCURRENT_STREAMS;
+ }
+ case 4: {
+ return INITIAL_WINDOW_SIZE;
+ }
+ case 5: {
+ return MAX_FRAME_SIZE;
+ }
+ case 6: {
+ return MAX_HEADER_LIST_SIZE;
+ }
+ default: {
+ return Setting.UNKNOWN;
+ }
+ }
+ }
+}
Propchange: tomcat/trunk/java/org/apache/coyote/http2/Setting.java
------------------------------------------------------------------------------
svn:eol-style = native
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=1696754&r1=1696753&r2=1696754&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java (original)
+++ tomcat/trunk/test/org/apache/coyote/http2/Http2TestBase.java Thu Aug 20
10:36:25 2015
@@ -395,7 +395,7 @@ public abstract class Http2TestBase exte
input = new TestInput(is);
output = new TestOutput();
parser = new Http2Parser("-1", input, output);
- hpackEncoder = new
HpackEncoder(ConnectionSettingsRemote.DEFAULT_HEADER_TABLE_SIZE);
+ hpackEncoder = new
HpackEncoder(ConnectionSettingsBase.DEFAULT_HEADER_TABLE_SIZE);
}
@@ -634,7 +634,7 @@ public abstract class Http2TestBase exte
}
- void sendSettings(int streamId, boolean ack, Setting... settings) throws
IOException {
+ void sendSettings(int streamId, boolean ack, SettingValue... settings)
throws IOException {
// length
int settingsCount;
if (settings == null) {
@@ -694,6 +694,13 @@ public abstract class Http2TestBase exte
}
return true;
}
+
+
+ @Override
+ public int getMaxFrameSize() {
+ // Hard-coded to use the default
+ return ConnectionSettingsBase.DEFAULT_MAX_FRAME_SIZE;
+ }
}
@@ -759,9 +766,9 @@ public abstract class Http2TestBase exte
@Override
- public void setting(int identifier, long value) throws
ConnectionException {
- trace.append("0-Settings-[" + identifier + "]-[" + value + "]\n");
- remoteSettings.set(identifier, value);
+ public void setting(Setting setting, long value) throws
ConnectionException {
+ trace.append("0-Settings-[" + setting + "]-[" + value + "]\n");
+ remoteSettings.set(setting, value);
}
@@ -923,11 +930,11 @@ public abstract class Http2TestBase exte
}
- static class Setting {
+ static class SettingValue {
private final int setting;
private final long value;
- public Setting(int setting, long value) {
+ public SettingValue(int setting, long value) {
this.setting = setting;
this.value = value;
}
Modified: tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_2.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_2.java?rev=1696754&r1=1696753&r2=1696754&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_2.java
(original)
+++ tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_4_2.java Thu Aug
20 10:36:25 2015
@@ -35,7 +35,7 @@ public class TestHttp2Section_4_2 extend
// Overly large settings
// Settings have to be a multiple of six
- int settingsCount = (ConnectionSettingsRemote.DEFAULT_MAX_FRAME_SIZE /
6) + 1;
+ int settingsCount = (ConnectionSettingsBase.DEFAULT_MAX_FRAME_SIZE /
6) + 1;
int size = settingsCount * 6;
byte[] settings = new byte[size + 9];
// Header
Modified: tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_2.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_2.java?rev=1696754&r1=1696753&r2=1696754&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_2.java
(original)
+++ tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_2.java Thu Aug
20 10:36:25 2015
@@ -41,7 +41,7 @@ public class TestHttp2Section_5_2 extend
http2Connect();
// Set the default window size to 1024 bytes
- sendSettings(0, false, new Setting(4, 1024));
+ sendSettings(0, false, new SettingValue(4, 1024));
// Wait for the ack
parser.readFrame(true);
output.clearTrace();
Modified: tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_3.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_3.java?rev=1696754&r1=1696753&r2=1696754&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_3.java
(original)
+++ tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_3.java Thu Aug
20 10:36:25 2015
@@ -67,7 +67,7 @@ public class TestHttp2Section_5_3 extend
}
// Set the default window size to 1024 bytes
- sendSettings(0, false, new Setting(4, 1024));
+ sendSettings(0, false, new SettingValue(4, 1024));
// Wait for the ack
parser.readFrame(true);
// Debugging Gump failure
Modified: tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_5.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_5.java?rev=1696754&r1=1696753&r2=1696754&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_5.java
(original)
+++ tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_5_5.java Thu Aug
20 10:36:25 2015
@@ -53,7 +53,7 @@ public class TestHttp2Section_5_5 extend
http2Connect();
// Unknown setting (should be ack'd)
- sendSettings(0, false, new Setting(1 << 15, 0));
+ sendSettings(0, false, new SettingValue(1 << 15, 0));
parser.readFrame(true);
Modified: tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_5.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_5.java?rev=1696754&r1=1696753&r2=1696754&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_5.java
(original)
+++ tomcat/trunk/test/org/apache/coyote/http2/TestHttp2Section_6_5.java Thu Aug
20 10:36:25 2015
@@ -34,7 +34,7 @@ public class TestHttp2Section_6_5 extend
// HTTP2 upgrade
http2Connect();
- sendSettings(0, true, new Setting(1,1));
+ sendSettings(0, true, new SettingValue(1,1));
// Go away
parser.readFrame(true);
@@ -50,7 +50,7 @@ public class TestHttp2Section_6_5 extend
http2Connect();
sendPriority(3, 0, 15);
- sendSettings(3, true, new Setting(1,1));
+ sendSettings(3, true, new SettingValue(1,1));
// Go away
parser.readFrame(true);
@@ -93,7 +93,7 @@ public class TestHttp2Section_6_5 extend
// HTTP2 upgrade
http2Connect();
- sendSettings(0, false, new Setting(0x2,0x2));
+ sendSettings(0, false, new SettingValue(0x2,0x2));
// Go away
parser.readFrame(true);
@@ -108,7 +108,7 @@ public class TestHttp2Section_6_5 extend
// HTTP2 upgrade
http2Connect();
- sendSettings(0, false, new Setting(0x4,1 << 31));
+ sendSettings(0, false, new SettingValue(0x4,1 << 31));
// Go away
parser.readFrame(true);
@@ -123,7 +123,7 @@ public class TestHttp2Section_6_5 extend
// HTTP2 upgrade
http2Connect();
- sendSettings(0, false, new Setting(0x5,1 << 31));
+ sendSettings(0, false, new SettingValue(0x5,1 << 31));
// Go away
parser.readFrame(true);
@@ -138,7 +138,7 @@ public class TestHttp2Section_6_5 extend
// HTTP2 upgrade
http2Connect();
- sendSettings(0, false, new Setting(0xFF,0xFF));
+ sendSettings(0, false, new SettingValue(0xFF,0xFF));
// Ack
parser.readFrame(true);
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=1696754&r1=1696753&r2=1696754&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 10:36:25 2015
@@ -153,7 +153,5 @@ public class TestHttp2Section_6_9 extend
Assert.assertTrue(output.getTrace(), output.getTrace().startsWith(
"0-Goaway-[1]-[" + Http2Error.FLOW_CONTROL_ERROR.getCode() +
"]-["));
}
-
-
// TODO: Remaining 6.9 tests
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]