Author: markt Date: Wed Jun 26 14:15:08 2013 New Revision: 1496942 URL: http://svn.apache.org/r1496942 Log: Add message size limit support for message handlers
Added: tomcat/trunk/java/org/apache/tomcat/websocket/WrappedMessageHandler.java (with props) Modified: tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties tomcat/trunk/java/org/apache/tomcat/websocket/Util.java tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerBase.java tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBase.java tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBinary.java tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialText.java tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholePong.java tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java Modified: tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties?rev=1496942&r1=1496941&r2=1496942&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties Wed Jun 26 14:15:08 2013 @@ -43,6 +43,7 @@ wsFrame.controlNoFin=A control frame was wsFrame.invalidOpCode= A WebSocket frame was sent with an unrecognised opCode of [{0}] wsFrame.invalidUtf8=A WebSocket text frame was received that could not be decoded to UTF-8 because it contained invalid byte sequences wsFrame.invalidUtf8Close=A WebSocket close frame was received with a close reason that contained invalid UTF-8 byte sequences +wsFrame.messageTooBig=The message was [{0}] bytes long but the MessageHandler has a limit of [{1}] bytes wsFrame.noContinuation=A new message was started when a continuation frame was expected wsFrame.notMasked=The client frame was not masked but all client frames must be masked wsFrame.oneByteCloseCode=The client sent a close frame with a single byte payload which is not valid Modified: tomcat/trunk/java/org/apache/tomcat/websocket/Util.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/Util.java?rev=1496942&r1=1496941&r2=1496942&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/Util.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/Util.java Wed Jun 26 14:15:08 2013 @@ -343,7 +343,7 @@ public class Util { new PojoMessageHandlerWholeBinary(listener, getOnMessageMethod(listener), null, endpointConfig, null, new Object[1], 0, true, -1, - false), + false, -1), MessageHandlerResultType.BINARY); results.add(result); } else if (InputStream.class.isAssignableFrom(target)) { @@ -351,14 +351,15 @@ public class Util { new PojoMessageHandlerWholeBinary(listener, getOnMessageMethod(listener), null, endpointConfig, null, new Object[1], 0, true, -1, - true), + true, -1), MessageHandlerResultType.BINARY); results.add(result); } else if (Reader.class.isAssignableFrom(target)) { MessageHandlerResult result = new MessageHandlerResult( new PojoMessageHandlerWholeText(listener, getOnMessageMethod(listener), null, - endpointConfig, null, new Object[1], 0, true, -1), + endpointConfig, null, new Object[1], 0, true, -1, + -1), MessageHandlerResultType.BINARY); results.add(result); } else { @@ -376,7 +377,7 @@ public class Util { new PojoMessageHandlerWholeBinary(listener, m, null, endpointConfig, decoderMatch.getBinaryDecoders(), new Object[1], - 0, false, -1, false), + 0, false, -1, false, -1), MessageHandlerResultType.BINARY); results.add(result); } @@ -385,7 +386,7 @@ public class Util { new PojoMessageHandlerWholeText(listener, m, null, endpointConfig, decoderMatch.getTextDecoders(), new Object[1], - 0, false, -1), + 0, false, -1, -1), MessageHandlerResultType.TEXT); results.add(result); } Added: tomcat/trunk/java/org/apache/tomcat/websocket/WrappedMessageHandler.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WrappedMessageHandler.java?rev=1496942&view=auto ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/WrappedMessageHandler.java (added) +++ tomcat/trunk/java/org/apache/tomcat/websocket/WrappedMessageHandler.java Wed Jun 26 14:15:08 2013 @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.tomcat.websocket; + +import javax.websocket.MessageHandler; + +public interface WrappedMessageHandler { + long getMaxMessageSize(); + + MessageHandler getWrappedHandler(); +} Propchange: tomcat/trunk/java/org/apache/tomcat/websocket/WrappedMessageHandler.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java?rev=1496942&r1=1496941&r2=1496942&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java Wed Jun 26 14:15:08 2013 @@ -329,9 +329,21 @@ public abstract class WsFrameBase { @SuppressWarnings("unchecked") - private void sendMessageText(boolean last) { + private void sendMessageText(boolean last) throws WsIOException { MessageHandler mh = wsSession.getTextMessageHandler(); if (mh != null) { + if (mh instanceof WrappedMessageHandler) { + long maxMessageSize = + ((WrappedMessageHandler) mh).getMaxMessageSize(); + if (maxMessageSize > -1 && + messageBufferText.remaining() > maxMessageSize) { + throw new WsIOException(new CloseReason(CloseCodes.TOO_BIG, + sm.getString("wsFrame.messageTooBig", + Long.valueOf(messageBufferText.remaining()), + Long.valueOf(maxMessageSize)))); + } + } + if (mh instanceof MessageHandler.Partial<?>) { ((MessageHandler.Partial<String>) mh).onMessage( messageBufferText.toString(), last); @@ -494,9 +506,20 @@ public abstract class WsFrameBase { @SuppressWarnings("unchecked") - private void sendMessageBinary(ByteBuffer msg, boolean last) { + private void sendMessageBinary(ByteBuffer msg, boolean last) + throws WsIOException { MessageHandler mh = wsSession.getBinaryMessageHandler(); if (mh != null) { + if (mh instanceof WrappedMessageHandler) { + long maxMessageSize = + ((WrappedMessageHandler) mh).getMaxMessageSize(); + if (maxMessageSize > -1 && msg.remaining() > maxMessageSize) { + throw new WsIOException(new CloseReason(CloseCodes.TOO_BIG, + sm.getString("wsFrame.messageTooBig", + Long.valueOf(msg.remaining()), + Long.valueOf(maxMessageSize)))); + } + } if (mh instanceof MessageHandler.Partial<?>) { ((MessageHandler.Partial<ByteBuffer>) mh).onMessage(msg, last); } else { Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java?rev=1496942&r1=1496941&r2=1496942&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java Wed Jun 26 14:15:08 2013 @@ -44,7 +44,6 @@ import javax.websocket.WebSocketContaine import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.res.StringManager; -import org.apache.tomcat.websocket.pojo.PojoMessageHandlerBase; public class WsSession implements Session { @@ -239,9 +238,8 @@ public class WsSession implements Sessio MessageHandler wrapped = null; - if (listener instanceof PojoMessageHandlerBase) { - wrapped = - ((PojoMessageHandlerBase<?>) listener).getWrappedHandler(); + if (listener instanceof WrappedMessageHandler) { + wrapped = ((WrappedMessageHandler) listener).getWrappedHandler(); } if (wrapped == null) { Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerBase.java?rev=1496942&r1=1496941&r2=1496942&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerBase.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerBase.java Wed Jun 26 14:15:08 2013 @@ -25,12 +25,15 @@ import javax.websocket.MessageHandler; import javax.websocket.RemoteEndpoint; import javax.websocket.Session; +import org.apache.tomcat.websocket.WrappedMessageHandler; + /** * Common implementation code for the POJO message handlers. * * @param <T> The type of message to handle */ -public abstract class PojoMessageHandlerBase<T> { +public abstract class PojoMessageHandlerBase<T> + implements WrappedMessageHandler { protected final Object pojo; protected final Method method; @@ -39,11 +42,11 @@ public abstract class PojoMessageHandler protected final int indexPayload; protected final boolean convert; protected final int indexSession; - + protected final long maxMessageSize; public PojoMessageHandlerBase(Object pojo, Method method, Session session, Object[] params, int indexPayload, boolean convert, - int indexSession) { + int indexSession, long maxMessageSize) { this.pojo = pojo; this.method = method; this.session = session; @@ -51,6 +54,7 @@ public abstract class PojoMessageHandler this.indexPayload = indexPayload; this.convert = convert; this.indexSession = indexSession; + this.maxMessageSize = maxMessageSize; } @@ -81,11 +85,18 @@ public abstract class PojoMessageHandler * match requests to remove handlers if the original handler has been * wrapped. */ - public MessageHandler getWrappedHandler() { + @Override + public final MessageHandler getWrappedHandler() { if (pojo instanceof MessageHandler) { return (MessageHandler) pojo; } else { return null; } } + + + @Override + public final long getMaxMessageSize() { + return maxMessageSize; + } } Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBase.java?rev=1496942&r1=1496941&r2=1496942&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBase.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBase.java Wed Jun 26 14:15:08 2013 @@ -39,9 +39,10 @@ public abstract class PojoMessageHandler public PojoMessageHandlerPartialBase(Object pojo, Method method, Session session, Object[] params, int indexPayload, - boolean convert, int indexBoolean, int indexSession) { + boolean convert, int indexBoolean, int indexSession, + long maxMessageSize) { super(pojo, method, session, params, indexPayload, convert, - indexSession); + indexSession, maxMessageSize); this.indexBoolean = indexBoolean; } Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBinary.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBinary.java?rev=1496942&r1=1496941&r2=1496942&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBinary.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialBinary.java Wed Jun 26 14:15:08 2013 @@ -29,8 +29,8 @@ public class PojoMessageHandlerPartialBi public PojoMessageHandlerPartialBinary(Object pojo, Method method, Session session, Object[] params, int indexPayload, boolean convert, - int indexBoolean, int indexSession) { + int indexBoolean, int indexSession, long maxMessageSize) { super(pojo, method, session, params, indexPayload, convert, indexBoolean, - indexSession); + indexSession, maxMessageSize); } } Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialText.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialText.java?rev=1496942&r1=1496941&r2=1496942&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialText.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerPartialText.java Wed Jun 26 14:15:08 2013 @@ -28,8 +28,8 @@ public class PojoMessageHandlerPartialTe public PojoMessageHandlerPartialText(Object pojo, Method method, Session session, Object[] params, int indexPayload, boolean convert, - int indexBoolean, int indexSession) { + int indexBoolean, int indexSession, long maxMessageSize) { super(pojo, method, session, params, indexPayload, convert, indexBoolean, - indexSession); + indexSession, maxMessageSize); } } Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java?rev=1496942&r1=1496941&r2=1496942&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBase.java Wed Jun 26 14:15:08 2013 @@ -36,9 +36,9 @@ public abstract class PojoMessageHandler public PojoMessageHandlerWholeBase(Object pojo, Method method, Session session, Object[] params, int indexPayload, - boolean convert, int indexSession) { + boolean convert, int indexSession, long maxMessageSize) { super(pojo, method, session, params, indexPayload, convert, - indexSession); + indexSession, maxMessageSize); } 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=1496942&r1=1496941&r2=1496942&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeBinary.java Wed Jun 26 14:15:08 2013 @@ -49,9 +49,9 @@ public class PojoMessageHandlerWholeBina Session session, EndpointConfig config, List<Class<? extends Decoder>> decoderClazzes, Object[] params, int indexPayload, boolean convert, int indexSession, - boolean isForInputStream) { + boolean isForInputStream, long maxMessageSize) { super(pojo, method, session, params, indexPayload, convert, - indexSession); + indexSession, maxMessageSize); try { if (decoderClazzes != null) { for (Class<? extends Decoder> decoderClazz : decoderClazzes) { Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholePong.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholePong.java?rev=1496942&r1=1496941&r2=1496942&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholePong.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholePong.java Wed Jun 26 14:15:08 2013 @@ -30,7 +30,8 @@ public class PojoMessageHandlerWholePong public PojoMessageHandlerWholePong(Object pojo, Method method, Session session, Object[] params, int indexPayload, boolean convert, int indexSession) { - super(pojo, method, session, params, indexPayload, convert, indexSession); + super(pojo, method, session, params, indexPayload, convert, + indexSession, -1); } @Override 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=1496942&r1=1496941&r2=1496942&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMessageHandlerWholeText.java Wed Jun 26 14:15:08 2013 @@ -48,9 +48,10 @@ public class PojoMessageHandlerWholeText public PojoMessageHandlerWholeText(Object pojo, Method method, Session session, EndpointConfig config, List<Class<? extends Decoder>> decoderClazzes, Object[] params, - int indexPayload, boolean convert, int indexSession) { + int indexPayload, boolean convert, int indexSession, + long maxMessageSize) { super(pojo, method, session, params, indexPayload, convert, - indexSession); + indexSession, maxMessageSize); // Check for primitives Class<?> type = method.getParameterTypes()[indexPayload]; @@ -61,21 +62,23 @@ public class PojoMessageHandlerWholeText primitiveType = null; } - try { - for (Class<? extends Decoder> decoderClazz : decoderClazzes) { - if (Text.class.isAssignableFrom(decoderClazz)) { - Text<?> decoder = (Text<?>) decoderClazz.newInstance(); - decoder.init(config); - decoders.add(decoder); - } else if (TextStream.class.isAssignableFrom(decoderClazz)) { - TextStream<?> decoder = - (TextStream<?>) decoderClazz.newInstance(); - decoder.init(config); - decoders.add(decoder); - } else { - // Binary decoder - ignore it + try {if (decoderClazzes != null) { + for (Class<? extends Decoder> decoderClazz : decoderClazzes) { + if (Text.class.isAssignableFrom(decoderClazz)) { + Text<?> decoder = (Text<?>) decoderClazz.newInstance(); + decoder.init(config); + decoders.add(decoder); + } else if (TextStream.class.isAssignableFrom( + decoderClazz)) { + TextStream<?> decoder = + (TextStream<?>) decoderClazz.newInstance(); + decoder.init(config); + decoders.add(decoder); + } else { + // Binary decoder - ignore it + } } - } + } } catch (IllegalAccessException | InstantiationException e) { throw new IllegalArgumentException(e); } Modified: tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java?rev=1496942&r1=1496941&r2=1496942&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/pojo/PojoMethodMapping.java Wed Jun 26 14:15:08 2013 @@ -268,6 +268,7 @@ public class PojoMethodMapping { private Map<Integer,PojoPathParam> indexPathParams = new HashMap<>(); private int indexPayload = -1; private boolean useDecoder = false; + private long maxMessageSize = -1; public MessageMethod(Method m, List<DecoderEntry> decoderEntries) { this.m = m; @@ -491,6 +492,8 @@ public class PojoMethodMapping { "pojoMethodMapping.partialObject", m.getName(), m.getDeclaringClass().getName())); } + + maxMessageSize = m.getAnnotation(OnMessage.class).maxMessageSize(); } @@ -526,27 +529,27 @@ public class PojoMethodMapping { if (indexString != -1) { mh = new PojoMessageHandlerWholeText(pojo, m, session, config, decoders, params, indexString, false, - indexSession); + indexSession, maxMessageSize); } else if (indexPrimitive != -1) { mh = new PojoMessageHandlerWholeText(pojo, m, session, config, decoders, params, indexPrimitive, false, - indexSession); + indexSession, maxMessageSize); } else if (indexByteArray != -1) { mh = new PojoMessageHandlerWholeBinary(pojo, m, session, config, decoders, params, indexByteArray, true, - indexSession, false); + indexSession, false, maxMessageSize); } else if (indexByteBuffer != -1) { mh = new PojoMessageHandlerWholeBinary(pojo, m, session, config, decoders, params, indexByteBuffer, false, - indexSession, false); + indexSession, false, maxMessageSize); } else if (indexInputStream != -1) { mh = new PojoMessageHandlerWholeBinary(pojo, m, session, config, decoders, params, indexInputStream, true, - indexSession, true); + indexSession, true, maxMessageSize); } else if (indexReader != -1) { mh = new PojoMessageHandlerWholeText(pojo, m, session, config, decoders, params, indexReader, true, - indexSession); + indexSession, maxMessageSize); } else { mh = new PojoMessageHandlerWholePong(pojo, m, session, params, indexPong, false, indexSession); @@ -556,15 +559,15 @@ public class PojoMethodMapping { if (indexString != -1) { mh = new PojoMessageHandlerPartialText(pojo, m, session, params, indexString, false, indexBoolean, - indexSession); + indexSession, maxMessageSize); } else if (indexByteArray != -1) { mh = new PojoMessageHandlerPartialBinary(pojo, m, session, params, indexByteArray, true, indexBoolean, - indexSession); + indexSession, maxMessageSize); } else { mh = new PojoMessageHandlerPartialBinary(pojo, m, session, params, indexByteBuffer, false, indexBoolean, - indexSession); + indexSession, maxMessageSize); } } return mh; 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=1496942&r1=1496941&r2=1496942&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java (original) +++ tomcat/trunk/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java Wed Jun 26 14:15:08 2013 @@ -588,12 +588,17 @@ public class TestWsWebSocketContainer ex WebSocketContainer wsContainer = ContainerProvider.getWebSocketContainer(); - Session s1a = connectToEchoServerBasic(wsContainer, EndpointA.class); - Session s2a = connectToEchoServerBasic(wsContainer, EndpointA.class); - Session s3a = connectToEchoServerBasic(wsContainer, EndpointA.class); - - Session s1b = connectToEchoServerBasic(wsContainer, EndpointB.class); - Session s2b = connectToEchoServerBasic(wsContainer, EndpointB.class); + Session s1a = connectToEchoServer(wsContainer, EndpointA.class, + TesterEchoServer.Config.PATH_BASIC); + Session s2a = connectToEchoServer(wsContainer, EndpointA.class, + TesterEchoServer.Config.PATH_BASIC); + Session s3a = connectToEchoServer(wsContainer, EndpointA.class, + TesterEchoServer.Config.PATH_BASIC); + + Session s1b = connectToEchoServer(wsContainer, EndpointB.class, + TesterEchoServer.Config.PATH_BASIC); + Session s2b = connectToEchoServer(wsContainer, EndpointB.class, + TesterEchoServer.Config.PATH_BASIC); Set<Session> setA = s3a.getOpenSessions(); Assert.assertEquals(3, setA.size()); @@ -638,9 +643,12 @@ public class TestWsWebSocketContainer ex wsContainer.setDefaultMaxSessionIdleTimeout(5000); wsContainer.setProcessPeriod(1); - connectToEchoServerBasic(wsContainer, EndpointA.class); - connectToEchoServerBasic(wsContainer, EndpointA.class); - Session s3a = connectToEchoServerBasic(wsContainer, EndpointA.class); + connectToEchoServer(wsContainer, EndpointA.class, + TesterEchoServer.Config.PATH_BASIC); + connectToEchoServer(wsContainer, EndpointA.class, + TesterEchoServer.Config.PATH_BASIC); + Session s3a = connectToEchoServer(wsContainer, EndpointA.class, + TesterEchoServer.Config.PATH_BASIC); // Check all three sessions are open Set<Session> setA = s3a.getOpenSessions(); @@ -694,11 +702,14 @@ public class TestWsWebSocketContainer ex wsContainer.setDefaultMaxSessionIdleTimeout(5000); wsContainer.setProcessPeriod(1); - Session s1a = connectToEchoServerBasic(wsContainer, EndpointA.class); + Session s1a = connectToEchoServer(wsContainer, EndpointA.class, + TesterEchoServer.Config.PATH_BASIC); s1a.setMaxIdleTimeout(3000); - Session s2a = connectToEchoServerBasic(wsContainer, EndpointA.class); + Session s2a = connectToEchoServer(wsContainer, EndpointA.class, + TesterEchoServer.Config.PATH_BASIC); s2a.setMaxIdleTimeout(6000); - Session s3a = connectToEchoServerBasic(wsContainer, EndpointA.class); + Session s3a = connectToEchoServer(wsContainer, EndpointA.class, + TesterEchoServer.Config.PATH_BASIC); s3a.setMaxIdleTimeout(9000); // Check all three sessions are open @@ -731,12 +742,11 @@ public class TestWsWebSocketContainer ex return result; } - private Session connectToEchoServerBasic(WebSocketContainer wsContainer, - Class<? extends Endpoint> clazz) throws Exception { + private Session connectToEchoServer(WebSocketContainer wsContainer, + Class<? extends Endpoint> clazz, String path) throws Exception { return wsContainer.connectToServer(clazz, ClientEndpointConfig.Builder.create().build(), - new URI("ws://localhost:" + getPort() + - TesterEchoServer.Config.PATH_BASIC)); + new URI("ws://localhost:" + getPort() + path)); } public static final class EndpointA extends Endpoint { @@ -835,9 +845,9 @@ public class TestWsWebSocketContainer ex WebSocketContainer wsContainer = ContainerProvider.getWebSocketContainer(); - Session s = connectToEchoServerBasic(wsContainer, EndpointA.class); + Session s = connectToEchoServer(wsContainer, EndpointA.class, + TesterEchoServer.Config.PATH_BASIC_LIMIT); - // 9 bytes StringBuilder msg = new StringBuilder(); for (long i = 0; i < size; i++) { msg.append('x'); @@ -845,6 +855,15 @@ public class TestWsWebSocketContainer ex s.getBasicRemote().sendText(msg.toString()); + // Wait for up to 5 seconds for session to close + boolean open = s.isOpen(); + int count = 0; + while (open != expectOpen && count < 50) { + Thread.sleep(100); + count++; + open = s.isOpen(); + } + Assert.assertEquals(Boolean.valueOf(expectOpen), Boolean.valueOf(s.isOpen())); } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org