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: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to