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