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: [email protected]
For additional commands, e-mail: [email protected]