Author: markt
Date: Mon Feb 20 22:54:13 2012
New Revision: 1291507

URL: http://svn.apache.org/viewvc?rev=1291507&view=rev
Log:
Ping/pong support

Modified:
    tomcat/trunk/java/org/apache/catalina/websocket/StreamInbound.java
    tomcat/trunk/java/org/apache/catalina/websocket/WsInputStream.java
    tomcat/trunk/java/org/apache/catalina/websocket/WsOutbound.java

Modified: tomcat/trunk/java/org/apache/catalina/websocket/StreamInbound.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/websocket/StreamInbound.java?rev=1291507&r1=1291506&r2=1291507&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/websocket/StreamInbound.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/websocket/StreamInbound.java Mon Feb 
20 22:54:13 2012
@@ -63,9 +63,20 @@ public abstract class StreamInbound impl
             InputStreamReader r =
                     new InputStreamReader(wsIs, B2CConverter.UTF_8);
             onTextData(r);
-        } else if (opCode == Constants.OPCODE_CLOSE){
+        }
+
+        if (wsIs.getPayloadLength() > 125) {
+            getOutbound().close(1002, null);
+            return SocketState.CLOSED;
+        }
+
+        if (opCode == Constants.OPCODE_CLOSE){
             doClose(wsIs);
             return SocketState.CLOSED;
+        } else if (opCode == Constants.OPCODE_PING) {
+            doPing(wsIs);
+        } else if (opCode == Constants.OPCODE_PONG) {
+            doPong(wsIs);
         } else {
             // TODO i18n
             throw new IOException("OpCode " + opCode + " not supported");
@@ -74,8 +85,9 @@ public abstract class StreamInbound impl
     }
 
     private void doClose(InputStream is) throws IOException {
-        // Control messages have a max size of 125 bytes
-        ByteBuffer data = ByteBuffer.allocate(125);
+        // Control messages have a max size of 125 bytes. Need to try and read
+        // one more so we reach end of stream (less 2 for the status)
+        ByteBuffer data = ByteBuffer.allocate(124);
 
         int status = is.read();
         if (status != -1) {
@@ -93,6 +105,29 @@ public abstract class StreamInbound impl
         getOutbound().close(status, data);
     }
 
+    private void doPing(InputStream is) throws IOException {
+        // Control messages have a max size of 125 bytes. Need to try and read
+        // one more so we reach end of stream
+        ByteBuffer data = ByteBuffer.allocate(126);
+
+        int read = 0;
+        while (read > -1) {
+            data.position(data.position() + read);
+            read = is.read(data.array(), data.position(), data.remaining());
+        }
+
+        data.flip();
+        getOutbound().pong(data);
+    }
+
+    private void doPong(InputStream is) throws IOException {
+        // Unsolicited pong - swallow it
+        int read = 0;
+        while (read > -1) {
+            read = is.read();
+        }
+    }
+
     protected abstract void onBinaryData(InputStream is) throws IOException;
     protected abstract void onTextData(Reader r) throws IOException;
 

Modified: tomcat/trunk/java/org/apache/catalina/websocket/WsInputStream.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/websocket/WsInputStream.java?rev=1291507&r1=1291506&r2=1291507&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/websocket/WsInputStream.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/websocket/WsInputStream.java Mon Feb 
20 22:54:13 2012
@@ -79,6 +79,10 @@ public class WsInputStream extends java.
         return wsFrameHeader;
     }
 
+    public long getPayloadLength() {
+        return payloadLength;
+    }
+
 
     // ----------------------------------------------------- InputStream 
methods
 

Modified: tomcat/trunk/java/org/apache/catalina/websocket/WsOutbound.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/websocket/WsOutbound.java?rev=1291507&r1=1291506&r2=1291507&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/websocket/WsOutbound.java (original)
+++ tomcat/trunk/java/org/apache/catalina/websocket/WsOutbound.java Mon Feb 20 
22:54:13 2012
@@ -124,6 +124,10 @@ public class WsOutbound {
         upgradeOutbound.write(0x88);
         if (status == 0) {
             upgradeOutbound.write(0);
+        } else if (data == null) {
+            upgradeOutbound.write(2);
+            upgradeOutbound.write(status >>> 8);
+            upgradeOutbound.write(status);
         } else {
             upgradeOutbound.write(2 + data.limit());
             upgradeOutbound.write(status >>> 8);
@@ -137,6 +141,22 @@ public class WsOutbound {
         upgradeOutbound = null;
     }
 
+    public void pong(ByteBuffer data) throws IOException {
+        // TODO Think about threading requirements for writing. This is not
+        // currently thread safe and writing almost certainly needs to be.
+        if (closed) {
+            // TODO - handle this - ISE?
+        }
+
+        doFlush(true);
+
+        upgradeOutbound.write(0x8A);
+        upgradeOutbound.write(data.limit());
+        upgradeOutbound.write(data.array(), 0, data.limit());
+
+        upgradeOutbound.flush();
+    }
+
     protected void doWriteBinary(ByteBuffer buffer, boolean finalFragment)
             throws IOException {
 



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

Reply via email to