Further BZ 66508 fix
Don't close connection before close message has been sent to client.
diff --git a/java/org/apache/tomcat/websocket/WsSession.java b/java/org/apache/tomcat/websocket/WsSession.java
index 5f947af..4570345 100644
--- a/java/org/apache/tomcat/websocket/WsSession.java
+++ b/java/org/apache/tomcat/websocket/WsSession.java
@@ -462,6 +462,11 @@
     }
 
 
+    public boolean isClosed() {
+    	return state == State.CLOSED;
+    }
+
+
     @Override
     public long getMaxIdleTimeout() {
         checkState();
diff --git a/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java b/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java
index 7f37101..93a717f 100644
--- a/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java
+++ b/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java
@@ -186,10 +186,15 @@
                 return SocketState.CLOSED;
 
         }
-        if (wsFrame.isOpen()) {
-            return SocketState.UPGRADED;
-        } else {
+
+        /*
+         * If a CLOSE frame has been received then wsFrame will be closed but need to keep the connection open until the
+         * CLOSE frame has been sent. Hence use the wsSession.isClosed() rather than wsFrame.isOpen() here.
+         */
+        if (wsSession.isClosed()) {
             return SocketState.CLOSED;
+        } else {
+            return SocketState.UPGRADED;
         }
     }