Author: markt
Date: Mon Dec 24 13:42:37 2012
New Revision: 1425647

URL: http://svn.apache.org/viewvc?rev=1425647&view=rev
Log:
Fix Ping/Pong issues identified by Autobahn

Added:
    tomcat/trunk/java/org/apache/tomcat/websocket/WsIOException.java   (with 
props)
Modified:
    tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java
    tomcat/trunk/java/org/apache/tomcat/websocket/WsProtocolHandler.java
    tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java?rev=1425647&r1=1425646&r2=1425647&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsFrame.java Mon Dec 24 
13:42:37 2012
@@ -34,7 +34,7 @@ import org.apache.tomcat.util.res.String
  */
 public class WsFrame {
 
-    private static StringManager sm =
+    private static final StringManager sm =
             StringManager.getManager(Constants.PACKAGE_NAME);
 
     // Connection level attributes
@@ -177,9 +177,11 @@ public class WsFrame {
         }
         if (isControl()) {
             if (payloadLength > 125) {
-                throw new IOException(sm.getString(
-                        "wsFrame.controlPayloadTooBig",
-                        Long.valueOf(payloadLength)));
+                CloseReason cr = new CloseReason(
+                        CloseCodes.PROTOCOL_ERROR,
+                        sm.getString("wsFrame.controlPayloadTooBig",
+                                Long.valueOf(payloadLength)));
+                throw new WsIOException(cr);
             }
             if (!fin) {
                 throw new IOException("wsFrame.controlNoFin");
@@ -202,7 +204,7 @@ public class WsFrame {
             if (opCode == Constants.OPCODE_CLOSE) {
                 messageBuffer.flip();
                 String reason = null;
-                int code = CloseCodes.NO_STATUS_CODE.getCode();
+                int code = CloseCodes.NORMAL_CLOSURE.getCode();
                 if (messageBuffer.remaining() > 1) {
                     code = messageBuffer.getShort();
                     if (messageBuffer.remaining() > 0) {

Added: tomcat/trunk/java/org/apache/tomcat/websocket/WsIOException.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsIOException.java?rev=1425647&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsIOException.java (added)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsIOException.java Mon Dec 24 
13:42:37 2012
@@ -0,0 +1,36 @@
+/*
+ *  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 java.io.IOException;
+
+import javax.websocket.CloseReason;
+
+public class WsIOException extends IOException {
+
+    private static final long serialVersionUID = 1L;
+
+    private final CloseReason closeReason;
+
+    public WsIOException(CloseReason closeReason) {
+        this.closeReason = closeReason;
+    }
+
+    public CloseReason getCloseReason() {
+        return closeReason;
+    }
+}

Propchange: tomcat/trunk/java/org/apache/tomcat/websocket/WsIOException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsProtocolHandler.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsProtocolHandler.java?rev=1425647&r1=1425646&r2=1425647&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsProtocolHandler.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsProtocolHandler.java Mon 
Dec 24 13:42:37 2012
@@ -111,19 +111,25 @@ public class WsProtocolHandler implement
         public void onDataAvailable() {
             try {
                 wsFrame.onDataAvailable();
-            } catch (IOException e) {
-                if (e instanceof EOFException){
-                    try {
-                        CloseReason cr = new CloseReason(
-                                CloseCodes.CLOSED_ABNORMALLY, e.getMessage());
-                        wsSession.onClose(cr);
-                        wsSession.close(cr);
-                    } catch (IOException e1) {
-                        // TODO
-                    }
-                } else {
-                    onError(e);
+            } catch (WsIOException ws) {
+                CloseReason cr = ws.getCloseReason();
+                wsSession.onClose(cr);
+                try {
+                    wsSession.close(cr);
+                } catch (IOException e) {
+                    // TODO Log?
                 }
+            } catch (EOFException eof) {
+                try {
+                    CloseReason cr = new CloseReason(
+                            CloseCodes.CLOSED_ABNORMALLY, eof.getMessage());
+                    wsSession.onClose(cr);
+                    wsSession.close(cr);
+                } catch (IOException e1) {
+                    // TODO Log?
+                }
+            } catch (IOException ioe) {
+                onError(ioe);
             }
         }
 

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=1425647&r1=1425646&r2=1425647&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsSession.java Mon Dec 24 
13:42:37 2012
@@ -46,8 +46,7 @@ public class WsSession implements Sessio
     private WsRemoteEndpoint wsRemoteEndpoint;
     private MessageHandler textMessageHandler = null;
     private MessageHandler binaryMessageHandler = null;
-    private MessageHandler.Basic<PongMessage> pongMessageHandler =
-            new DefaultPingMessageHandler(this);
+    private MessageHandler.Basic<PongMessage> pongMessageHandler = null;
 
     protected WsSession(Endpoint localEndpoint) {
         this.localEndpoint = localEndpoint;
@@ -352,27 +351,6 @@ public class WsSession implements Sessio
     }
 
 
-    private static class DefaultPingMessageHandler implements
-            MessageHandler.Basic<PongMessage> {
-
-        private final WsSession wsSession;
-
-
-        private DefaultPingMessageHandler(WsSession wsSession) {
-            this.wsSession = wsSession;
-        }
-
-
-        @Override
-        public void onMessage(PongMessage message) {
-            RemoteEndpoint remoteEndpoint = wsSession.getRemote();
-            if (remoteEndpoint != null) {
-                remoteEndpoint.sendPong(message.getApplicationData());
-            }
-        }
-    }
-
-
     @Override
     public String getId() {
         // TODO Auto-generated method stub



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

Reply via email to