You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/12/16 19:35:07 UTC

svn commit: r1551300 - in /tomcat/trunk: java/org/apache/tomcat/websocket/pojo/ test/org/apache/tomcat/websocket/

Author: markt
Date: Mon Dec 16 18:35:06 2013
New Revision: 1551300

URL: http://svn.apache.org/r1551300
Log:
Need to handle case where message size limits are larger than the default buffer size. (Limits smaller than the buffer size were handled correctly.)

Modified:
    tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java
    tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java
    tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java
    tomcat/trunk/test/org/apache/tomcat/websocket/TesterEchoServer.java

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java?rev=1551300&r1=1551299&r2=1551300&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java Mon Dec 16 18:35:06 2013
@@ -52,6 +52,15 @@ public class PojoMessageHandlerWholeBina
             boolean isForInputStream, long maxMessageSize) {
         super(pojo, method, session, params, indexPayload, convert,
                 indexSession, maxMessageSize);
+
+        // Update binary text size handled by session
+        if (maxMessageSize > -1 && maxMessageSize > session.getMaxBinaryMessageBufferSize()) {
+            if (maxMessageSize > Integer.MAX_VALUE) {
+                // IAE
+            }
+            session.setMaxBinaryMessageBufferSize((int) maxMessageSize);
+        }
+
         try {
             if (decoderClazzes != null) {
                 for (Class<? extends Decoder> decoderClazz : decoderClazzes) {

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java?rev=1551300&r1=1551299&r2=1551300&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java Mon Dec 16 18:35:06 2013
@@ -53,6 +53,14 @@ public class PojoMessageHandlerWholeText
         super(pojo, method, session, params, indexPayload, convert,
                 indexSession, maxMessageSize);
 
+        // Update max text size handled by session
+        if (maxMessageSize > -1 && maxMessageSize > session.getMaxTextMessageBufferSize()) {
+            if (maxMessageSize > Integer.MAX_VALUE) {
+                // IAE
+            }
+            session.setMaxTextMessageBufferSize((int) maxMessageSize);
+        }
+
         // Check for primitives
         Class<?> type = method.getParameterTypes()[indexPayload];
         if (Util.isPrimitive(type)) {

Modified: tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java?rev=1551300&r1=1551299&r2=1551300&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java (original)
+++ tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java Mon Dec 16 18:35:06 2013
@@ -822,23 +822,47 @@ public class TestWsWebSocketContainer ex
 
     @Test
     public void testMaxMessageSize01() throws Exception {
-        doMaxMessageSize(TesterEchoServer.BasicLimit.MAX_SIZE - 1, true);
+        doMaxMessageSize(TesterEchoServer.Config.PATH_BASIC_LIMIT_LOW,
+                TesterEchoServer.BasicLimitLow.MAX_SIZE - 1, true);
     }
 
 
     @Test
     public void testMaxMessageSize02() throws Exception {
-        doMaxMessageSize(TesterEchoServer.BasicLimit.MAX_SIZE, true);
+        doMaxMessageSize(TesterEchoServer.Config.PATH_BASIC_LIMIT_LOW,
+                TesterEchoServer.BasicLimitLow.MAX_SIZE, true);
     }
 
 
     @Test
     public void testMaxMessageSize03() throws Exception {
-        doMaxMessageSize(TesterEchoServer.BasicLimit.MAX_SIZE + 1, false);
+        doMaxMessageSize(TesterEchoServer.Config.PATH_BASIC_LIMIT_LOW,
+                TesterEchoServer.BasicLimitLow.MAX_SIZE + 1, false);
     }
 
 
-    private void doMaxMessageSize(long size, boolean expectOpen)
+    @Test
+    public void testMaxMessageSize04() throws Exception {
+        doMaxMessageSize(TesterEchoServer.Config.PATH_BASIC_LIMIT_HIGH,
+                TesterEchoServer.BasicLimitHigh.MAX_SIZE - 1, true);
+    }
+
+
+    @Test
+    public void testMaxMessageSize05() throws Exception {
+        doMaxMessageSize(TesterEchoServer.Config.PATH_BASIC_LIMIT_HIGH,
+                TesterEchoServer.BasicLimitHigh.MAX_SIZE, true);
+    }
+
+
+    @Test
+    public void testMaxMessageSize06() throws Exception {
+        doMaxMessageSize(TesterEchoServer.Config.PATH_BASIC_LIMIT_HIGH,
+                TesterEchoServer.BasicLimitHigh.MAX_SIZE + 1, false);
+    }
+
+
+    private void doMaxMessageSize(String path, long size, boolean expectOpen)
             throws Exception {
 
         Tomcat tomcat = getTomcatInstance();
@@ -855,8 +879,7 @@ public class TestWsWebSocketContainer ex
         WebSocketContainer wsContainer =
                 ContainerProvider.getWebSocketContainer();
 
-        Session s = connectToEchoServer(wsContainer, EndpointA.class,
-                TesterEchoServer.Config.PATH_BASIC_LIMIT);
+        Session s = connectToEchoServer(wsContainer, EndpointA.class, path);
 
         StringBuilder msg = new StringBuilder();
         for (long i = 0; i < size; i++) {

Modified: tomcat/trunk/test/org/apache/tomcat/websocket/TesterEchoServer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/websocket/TesterEchoServer.java?rev=1551300&r1=1551299&r2=1551300&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/websocket/TesterEchoServer.java (original)
+++ tomcat/trunk/test/org/apache/tomcat/websocket/TesterEchoServer.java Mon Dec 16 18:35:06 2013
@@ -35,7 +35,8 @@ public class TesterEchoServer {
 
         public static final String PATH_ASYNC = "/echoAsync";
         public static final String PATH_BASIC = "/echoBasic";
-        public static final String PATH_BASIC_LIMIT = "/echoBasicLimit";
+        public static final String PATH_BASIC_LIMIT_LOW = "/echoBasicLimitLow";
+        public static final String PATH_BASIC_LIMIT_HIGH = "/echoBasicLimitHigh";
 
         @Override
         public void contextInitialized(ServletContextEvent sce) {
@@ -46,7 +47,8 @@ public class TesterEchoServer {
             try {
                 sc.addEndpoint(Async.class);
                 sc.addEndpoint(Basic.class);
-                sc.addEndpoint(BasicLimit.class);
+                sc.addEndpoint(BasicLimitLow.class);
+                sc.addEndpoint(BasicLimitHigh.class);
             } catch (DeploymentException e) {
                 throw new IllegalStateException(e);
             }
@@ -117,8 +119,8 @@ public class TesterEchoServer {
     }
 
 
-    @ServerEndpoint("/echoBasicLimit")
-    public static class BasicLimit {
+    @ServerEndpoint("/echoBasicLimitLow")
+    public static class BasicLimitLow {
 
         public static final long MAX_SIZE = 10;
 
@@ -149,4 +151,39 @@ public class TesterEchoServer {
             }
         }
     }
+
+
+    @ServerEndpoint("/echoBasicLimitHigh")
+    public static class BasicLimitHigh {
+
+        public static final long MAX_SIZE = 32 * 1024;
+
+        @OnMessage(maxMessageSize = MAX_SIZE)
+        public void echoTextMessage(Session session, String msg) {
+            try {
+                session.getBasicRemote().sendText(msg);
+            } catch (IOException e) {
+                try {
+                    session.close();
+                } catch (IOException e1) {
+                    // Ignore
+                }
+            }
+        }
+
+
+        @OnMessage(maxMessageSize = MAX_SIZE)
+        public void echoBinaryMessage(Session session, ByteBuffer msg) {
+            try {
+                session.getBasicRemote().sendBinary(msg);
+            } catch (IOException e) {
+                try {
+                    session.close();
+                } catch (IOException e1) {
+                    // Ignore
+                }
+            }
+        }
+    }
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org