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

Reply via email to