Author: markt Date: Mon Mar 25 21:54:33 2013 New Revision: 1460911 URL: http://svn.apache.org/r1460911 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=54748 Don't generate an error during a normal close that there is more data to read when there isn't.
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameClient.java tomcat/trunk/java/org/apache/tomcat/websocket/server/WsFrameServer.java 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=1460911&r1=1460910&r2=1460911&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameBase.java Mon Mar 25 21:54:33 2013 @@ -74,7 +74,7 @@ public abstract class WsFrameBase { // Attributes tracking state private State state = State.NEW_FRAME; - private boolean closed = false; + private volatile boolean open = true; private int readPos = 0; protected int writePos = 0; @@ -94,12 +94,14 @@ public abstract class WsFrameBase { wsSession.updateLastActive(); if (state == State.NEW_FRAME) { - if (closed) { - throw new IOException(sm.getString("wsFrame.closed")); - } if (!processInitialHeader()) { break; } + // If a close frame has been received, no further data should + // have seen + if (!open) { + throw new IOException(sm.getString("wsFrame.closed")); + } } if (state == State.PARTIAL_HEADER) { if (!processRemainingHeader()) { @@ -265,7 +267,7 @@ public abstract class WsFrameBase { } controlBufferBinary.flip(); if (opCode == Constants.OPCODE_CLOSE) { - closed = true; + open = false; String reason = null; int code = CloseCodes.NORMAL_CLOSURE.getCode(); if (controlBufferBinary.remaining() == 1) { @@ -613,6 +615,11 @@ public abstract class WsFrameBase { } + protected boolean isOpen() { + return open; + } + + private static enum State { NEW_FRAME, PARTIAL_HEADER, DATA } Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameClient.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameClient.java?rev=1460911&r1=1460910&r2=1460911&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameClient.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsFrameClient.java Mon Mar 25 21:54:33 2013 @@ -63,7 +63,9 @@ public class WsFrameClient extends WsFra response.clear(); // Get some more data - channel.read(response, null, handler); + if (isOpen()) { + channel.read(response, null, handler); + } } Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsFrameServer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsFrameServer.java?rev=1460911&r1=1460910&r2=1460911&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsFrameServer.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsFrameServer.java Mon Mar 25 21:54:33 2013 @@ -41,7 +41,7 @@ public class WsFrameServer extends WsFra */ public void onDataAvailable() throws IOException { synchronized (connectionReadLock) { - while (sis.isReady()) { + while (isOpen() && sis.isReady()) { // Fill up the input buffer with as much data as we can int read = sis.read( inputBuffer, writePos, inputBuffer.length - writePos); --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org