Author: markt
Date: Mon Dec 16 19:24:33 2013
New Revision: 1551324

URL: http://svn.apache.org/r1551324
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/tc7.0.x/trunk/   (props changed)
    
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties
    
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java
    
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java
    
tomcat/tc7.0.x/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java
    tomcat/tc7.0.x/trunk/test/org/apache/tomcat/websocket/TesterEchoServer.java
    tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml

Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
  Merged /tomcat/trunk:r1551300,1551323

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties?rev=1551324&r1=1551323&r2=1551324&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties
 (original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/pojo/LocalStrings.properties
 Mon Dec 16 19:24:33 2013
@@ -36,4 +36,5 @@ pojoMethodMapping.partialObject=Invalid 
 pojoMethodMapping.partialPong=Invalid PongMesssge and boolean parameters 
present on the method [{0}] of class [{1}] that was annotated with OnMessage
 pojoMethodMapping.partialReader=Invalid Reader and boolean parameters present 
on the method [{0}] of class [{1}] that was annotated with OnMessage
 pojoMethodMapping.pongWithPayload=Invalid PongMessgae and Message parameters 
present on the method [{0}] of class [{1}] that was annotated with OnMessage
-pojoMessageHandlerWhole.decodeIoFail=IO error while decoding message
\ No newline at end of file
+pojoMessageHandlerWhole.decodeIoFail=IO error while decoding message
+pojoMessageHandlerWhole.maxBufferSize=The maximum supported message size for 
this implementation in Integer.MAX_VALUE

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java?rev=1551324&r1=1551323&r2=1551324&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java
 (original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java
 Mon Dec 16 19:24:33 2013
@@ -52,6 +52,16 @@ 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) {
+                throw new IllegalArgumentException(sm.getString(
+                        "pojoMessageHandlerWhole.maxBufferSize"));
+            }
+            session.setMaxBinaryMessageBufferSize((int) maxMessageSize);
+        }
+
         try {
             if (decoderClazzes != null) {
                 for (Class<? extends Decoder> decoderClazz : decoderClazzes) {

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java?rev=1551324&r1=1551323&r2=1551324&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java
 (original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java
 Mon Dec 16 19:24:33 2013
@@ -53,6 +53,15 @@ 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) {
+                throw new IllegalArgumentException(sm.getString(
+                        "pojoMessageHandlerWhole.maxBufferSize"));
+            }
+            session.setMaxTextMessageBufferSize((int) maxMessageSize);
+        }
+
         // Check for primitives
         Class<?> type = method.getParameterTypes()[indexPayload];
         if (Util.isPrimitive(type)) {

Modified: 
tomcat/tc7.0.x/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java?rev=1551324&r1=1551323&r2=1551324&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java
 (original)
+++ 
tomcat/tc7.0.x/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java
 Mon Dec 16 19:24:33 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/tc7.0.x/trunk/test/org/apache/tomcat/websocket/TesterEchoServer.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/test/org/apache/tomcat/websocket/TesterEchoServer.java?rev=1551324&r1=1551323&r2=1551324&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/test/org/apache/tomcat/websocket/TesterEchoServer.java 
(original)
+++ tomcat/tc7.0.x/trunk/test/org/apache/tomcat/websocket/TesterEchoServer.java 
Mon Dec 16 19:24:33 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
+                }
+            }
+        }
+    }
+
 }

Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1551324&r1=1551323&r2=1551324&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Mon Dec 16 19:24:33 2013
@@ -72,6 +72,10 @@
         Streamline handling of WebSocket messages whe no handler is configured
         for the message currently being received. (markt)
       </scode>
+      <fix>
+        Handle the case where a WebSocket annotation configures a message size
+        limit larger than the default permitted by Tomcat. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Cluster">



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

Reply via email to