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