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