You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2016/12/14 20:19:22 UTC

svn commit: r1774335 - in /httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2: config/H2Config.java impl/nio/AbstractHttp2StreamMultiplexer.java

Author: olegk
Date: Wed Dec 14 20:19:21 2016
New Revision: 1774335

URL: http://svn.apache.org/viewvc?rev=1774335&view=rev
Log:
Better handling of HTTP/2 settings violations

Modified:
    httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/config/H2Config.java
    httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/AbstractHttp2StreamMultiplexer.java

Modified: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/config/H2Config.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/config/H2Config.java?rev=1774335&r1=1774334&r2=1774335&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/config/H2Config.java (original)
+++ httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/config/H2Config.java Wed Dec 14 20:19:21 2016
@@ -148,12 +148,13 @@ public class H2Config {
         }
 
         public Builder setInitialWindowSize(final int initialWindowSize) {
+            Args.positive(initialWindowSize, "Initial window size");
             this.initialWindowSize = initialWindowSize;
             return this;
         }
 
         public Builder setMaxFrameSize(final int maxFrameSize) {
-            Args.check(maxFrameSize >= FrameConsts.MIN_FRAME_SIZE && maxFrameSize < FrameConsts.MAX_FRAME_SIZE, "Invalid max frame size");
+            Args.check(maxFrameSize >= FrameConsts.MIN_FRAME_SIZE && maxFrameSize <= FrameConsts.MAX_FRAME_SIZE, "Invalid max frame size");
             this.maxFrameSize = maxFrameSize;
             return this;
         }

Modified: httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/AbstractHttp2StreamMultiplexer.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/AbstractHttp2StreamMultiplexer.java?rev=1774335&r1=1774334&r2=1774335&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/AbstractHttp2StreamMultiplexer.java (original)
+++ httpcomponents/httpcore/trunk/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/AbstractHttp2StreamMultiplexer.java Wed Dec 14 20:19:21 2016
@@ -171,7 +171,7 @@ abstract class AbstractHttp2StreamMultip
     private int updateWindow(final AtomicInteger window, final int delta) throws ArithmeticException {
         for (;;) {
             final int current = window.get();
-            final long newValue = current + delta;
+            final long newValue = (long) current + delta;
             if (Math.abs(newValue) > Integer.MAX_VALUE) {
                 throw new ArithmeticException("Update causes flow control window to exceed " + Integer.MAX_VALUE);
             }
@@ -1061,13 +1061,21 @@ abstract class AbstractHttp2StreamMultip
                         hPackDecoder.setMaxTableSize(value);
                         break;
                     case MAX_CONCURRENT_STREAMS:
-                        configBuilder.setMaxConcurrentStreams(value);
+                        try {
+                            configBuilder.setMaxConcurrentStreams(value);
+                        } catch (IllegalArgumentException ex) {
+                            throw new H2ConnectionException(H2Error.PROTOCOL_ERROR, ex.getMessage());
+                        }
                         break;
                     case ENABLE_PUSH:
                         configBuilder.setPushEnabled(value == 1);
                         break;
                     case INITIAL_WINDOW_SIZE:
-                        configBuilder.setInitialWindowSize(value);
+                        try {
+                            configBuilder.setInitialWindowSize(value);
+                        } catch (IllegalArgumentException ex) {
+                            throw new H2ConnectionException(H2Error.PROTOCOL_ERROR, ex.getMessage());
+                        }
                         final int delta = value - remoteConfig.getInitialWindowSize();
                         if (delta != 0) {
                             updateOutputWindow(0, connOutputWindow, delta);
@@ -1085,10 +1093,18 @@ abstract class AbstractHttp2StreamMultip
                         }
                         break;
                     case MAX_FRAME_SIZE:
-                        configBuilder.setMaxFrameSize(value);
+                        try {
+                            configBuilder.setMaxFrameSize(value);
+                        } catch (IllegalArgumentException ex) {
+                            throw new H2ConnectionException(H2Error.PROTOCOL_ERROR, ex.getMessage());
+                        }
                         break;
                     case MAX_HEADER_LIST_SIZE:
-                        configBuilder.setMaxHeaderListSize(value);
+                        try {
+                            configBuilder.setMaxHeaderListSize(value);
+                        } catch (IllegalArgumentException ex) {
+                            throw new H2ConnectionException(H2Error.PROTOCOL_ERROR, ex.getMessage());
+                        }
                         break;
                 }
             }