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

Reply via email to