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