GUACAMOLE-504: Allow exceptions to pass WebSocket status to closeConnection.


Project: http://git-wip-us.apache.org/repos/asf/guacamole-client/repo
Commit: http://git-wip-us.apache.org/repos/asf/guacamole-client/commit/ffc4c7bc
Tree: http://git-wip-us.apache.org/repos/asf/guacamole-client/tree/ffc4c7bc
Diff: http://git-wip-us.apache.org/repos/asf/guacamole-client/diff/ffc4c7bc

Branch: refs/heads/master
Commit: ffc4c7bcad42bd7ab0d268229cc23daa11605df9
Parents: 0dc5306
Author: Nick Couchman <vn...@apache.org>
Authored: Thu Feb 8 23:25:53 2018 -0500
Committer: Nick Couchman <vn...@apache.org>
Committed: Fri Feb 9 13:17:08 2018 -0500

----------------------------------------------------------------------
 .../GuacamoleWebSocketTunnelEndpoint.java       | 22 ++++++++++--------
 .../jetty8/GuacamoleWebSocketTunnelServlet.java | 24 ++++++++++++--------
 .../GuacamoleWebSocketTunnelListener.java       | 23 +++++++++++--------
 .../tomcat/GuacamoleWebSocketTunnelServlet.java | 22 ++++++++++--------
 4 files changed, 53 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/ffc4c7bc/guacamole-common/src/main/java/org/apache/guacamole/websocket/GuacamoleWebSocketTunnelEndpoint.java
----------------------------------------------------------------------
diff --git 
a/guacamole-common/src/main/java/org/apache/guacamole/websocket/GuacamoleWebSocketTunnelEndpoint.java
 
b/guacamole-common/src/main/java/org/apache/guacamole/websocket/GuacamoleWebSocketTunnelEndpoint.java
index 0cae732..46ba1f9 100644
--- 
a/guacamole-common/src/main/java/org/apache/guacamole/websocket/GuacamoleWebSocketTunnelEndpoint.java
+++ 
b/guacamole-common/src/main/java/org/apache/guacamole/websocket/GuacamoleWebSocketTunnelEndpoint.java
@@ -71,11 +71,15 @@ public abstract class GuacamoleWebSocketTunnelEndpoint 
extends Endpoint {
      *
      * @param session The outbound WebSocket connection to close.
      * @param guac_status The status to send.
+     * @param webSocketCode The numeric WebSocket status to send.
      */
-    private void closeConnection(Session session, GuacamoleStatus guac_status) 
{
+    private void closeConnection(Session session, GuacamoleStatus guac_status,
+            Integer webSocketCode) {
 
         try {
-            CloseCode code = 
CloseReason.CloseCodes.getCloseCode(guac_status.getWebSocketCode());
+            if (webSocketCode == null)
+                webSocketCode = guac_status.getWebSocketCode();
+            CloseCode code = 
CloseReason.CloseCodes.getCloseCode(webSocketCode);
             String message = 
Integer.toString(guac_status.getGuacamoleStatusCode());
             session.close(new CloseReason(code, message));
         }
@@ -109,7 +113,7 @@ public abstract class GuacamoleWebSocketTunnelEndpoint 
extends Endpoint {
             // Get tunnel
             tunnel = createTunnel(session, config);
             if (tunnel == null) {
-                closeConnection(session, GuacamoleStatus.RESOURCE_NOT_FOUND);
+                closeConnection(session, GuacamoleStatus.RESOURCE_NOT_FOUND, 
null);
                 return;
             }
 
@@ -117,7 +121,7 @@ public abstract class GuacamoleWebSocketTunnelEndpoint 
extends Endpoint {
         catch (GuacamoleException e) {
             logger.error("Creation of WebSocket tunnel to guacd failed: {}", 
e.getMessage());
             logger.debug("Error connecting WebSocket tunnel.", e);
-            closeConnection(session, e.getStatus());
+            closeConnection(session, e.getStatus(), e.getWebSocketCode());
             return;
         }
 
@@ -171,7 +175,7 @@ public abstract class GuacamoleWebSocketTunnelEndpoint 
extends Endpoint {
                         }
 
                         // No more data
-                        closeConnection(session, GuacamoleStatus.SUCCESS);
+                        closeConnection(session, GuacamoleStatus.SUCCESS, 
null);
 
                     }
 
@@ -181,22 +185,22 @@ public abstract class GuacamoleWebSocketTunnelEndpoint 
extends Endpoint {
                     catch (GuacamoleClientException e) {
                         logger.info("WebSocket connection terminated: {}", 
e.getMessage());
                         logger.debug("WebSocket connection terminated due to 
client error.", e);
-                        closeConnection(session, e.getStatus());
+                        closeConnection(session, e.getStatus(), 
e.getWebSocketCode());
                     }
                     catch (GuacamoleConnectionClosedException e) {
                         logger.debug("Connection to guacd closed.", e);
-                        closeConnection(session, GuacamoleStatus.SUCCESS);
+                        closeConnection(session, GuacamoleStatus.SUCCESS, 
null);
                     }
                     catch (GuacamoleException e) {
                         logger.error("Connection to guacd terminated 
abnormally: {}", e.getMessage());
                         logger.debug("Internal error during connection to 
guacd.", e);
-                        closeConnection(session, e.getStatus());
+                        closeConnection(session, e.getStatus(), 
e.getWebSocketCode());
                     }
 
                 }
                 catch (IOException e) {
                     logger.debug("I/O error prevents further reads.", e);
-                    closeConnection(session, GuacamoleStatus.SERVER_ERROR);
+                    closeConnection(session, GuacamoleStatus.SERVER_ERROR, 
null);
                 }
 
             }

http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/ffc4c7bc/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty8/GuacamoleWebSocketTunnelServlet.java
----------------------------------------------------------------------
diff --git 
a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty8/GuacamoleWebSocketTunnelServlet.java
 
b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty8/GuacamoleWebSocketTunnelServlet.java
index 9769646..a5c27f4 100644
--- 
a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty8/GuacamoleWebSocketTunnelServlet.java
+++ 
b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty8/GuacamoleWebSocketTunnelServlet.java
@@ -58,11 +58,15 @@ public abstract class GuacamoleWebSocketTunnelServlet 
extends WebSocketServlet {
      *
      * @param connection The WebSocket connection to close.
      * @param guac_status The status to send.
+     * @param webSocketCode The numeric WebSocket status code to send.
      */
-    public static void closeConnection(Connection connection,
-            GuacamoleStatus guac_status) {
+    private static void closeConnection(Connection connection,
+            GuacamoleStatus guac_status, Integer webSocketCode) {
 
-        connection.close(guac_status.getWebSocketCode(),
+        if (webSocketCode == null)
+            webSocketCode = guac_status.getWebSocketCode();
+
+        connection.close(webSocketCode,
                 Integer.toString(guac_status.getGuacamoleStatusCode()));
 
     }
@@ -114,13 +118,13 @@ public abstract class GuacamoleWebSocketTunnelServlet 
extends WebSocketServlet {
                 catch (GuacamoleException e) {
                     logger.error("Creation of WebSocket tunnel to guacd 
failed: {}", e.getMessage());
                     logger.debug("Error connecting WebSocket tunnel.", e);
-                    closeConnection(connection, e.getStatus());
+                    closeConnection(connection, e.getStatus(), 
e.getWebSocketCode());
                     return;
                 }
 
                 // Do not start connection if tunnel does not exist
                 if (tunnel == null) {
-                    closeConnection(connection, 
GuacamoleStatus.RESOURCE_NOT_FOUND);
+                    closeConnection(connection, 
GuacamoleStatus.RESOURCE_NOT_FOUND, null);
                     return;
                 }
 
@@ -158,7 +162,7 @@ public abstract class GuacamoleWebSocketTunnelServlet 
extends WebSocketServlet {
                                 }
 
                                 // No more data
-                                closeConnection(connection, 
GuacamoleStatus.SUCCESS);
+                                closeConnection(connection, 
GuacamoleStatus.SUCCESS, null);
                                 
                             }
 
@@ -168,22 +172,22 @@ public abstract class GuacamoleWebSocketTunnelServlet 
extends WebSocketServlet {
                             catch (GuacamoleClientException e) {
                                 logger.info("WebSocket connection terminated: 
{}", e.getMessage());
                                 logger.debug("WebSocket connection terminated 
due to client error.", e);
-                                closeConnection(connection, e.getStatus());
+                                closeConnection(connection, e.getStatus(), 
e.getWebSocketCode());
                             }
                             catch (GuacamoleConnectionClosedException e) {
                                 logger.debug("Connection to guacd closed.", e);
-                                closeConnection(connection, 
GuacamoleStatus.SUCCESS);
+                                closeConnection(connection, 
GuacamoleStatus.SUCCESS, null);
                             }
                             catch (GuacamoleException e) {
                                 logger.error("Connection to guacd terminated 
abnormally: {}", e.getMessage());
                                 logger.debug("Internal error during connection 
to guacd.", e);
-                                closeConnection(connection, e.getStatus());
+                                closeConnection(connection, e.getStatus(), 
e.getWebSocketCode());
                             }
 
                         }
                         catch (IOException e) {
                             logger.debug("WebSocket tunnel read failed due to 
I/O error.", e);
-                            closeConnection(connection, 
GuacamoleStatus.SERVER_ERROR);
+                            closeConnection(connection, 
GuacamoleStatus.SERVER_ERROR, null);
                         }
 
                     }

http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/ffc4c7bc/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/GuacamoleWebSocketTunnelListener.java
----------------------------------------------------------------------
diff --git 
a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/GuacamoleWebSocketTunnelListener.java
 
b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/GuacamoleWebSocketTunnelListener.java
index 5375d75..51a3b76 100644
--- 
a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/GuacamoleWebSocketTunnelListener.java
+++ 
b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/jetty9/GuacamoleWebSocketTunnelListener.java
@@ -62,13 +62,16 @@ public abstract class GuacamoleWebSocketTunnelListener 
implements WebSocketListe
      *
      * @param session The outbound WebSocket connection to close.
      * @param guac_status The status to send.
+     * @param webSocketCode The numeric WebSocket status code to send.
      */
-    private void closeConnection(Session session, GuacamoleStatus guac_status) 
{
+    private void closeConnection(Session session, GuacamoleStatus guac_status,
+            Integer webSocketCode) {
 
         try {
-            int code = guac_status.getWebSocketCode();
+            if (webSocketCode == null)
+                webSocketCode = guac_status.getWebSocketCode();
             String message = 
Integer.toString(guac_status.getGuacamoleStatusCode());
-            session.close(new CloseStatus(code, message));
+            session.close(new CloseStatus(webSocketCode, message));
         }
         catch (IOException e) {
             logger.debug("Unable to close WebSocket connection.", e);
@@ -97,7 +100,7 @@ public abstract class GuacamoleWebSocketTunnelListener 
implements WebSocketListe
             // Get tunnel
             tunnel = createTunnel(session);
             if (tunnel == null) {
-                closeConnection(session, GuacamoleStatus.RESOURCE_NOT_FOUND);
+                closeConnection(session, GuacamoleStatus.RESOURCE_NOT_FOUND, 
null);
                 return;
             }
 
@@ -105,7 +108,7 @@ public abstract class GuacamoleWebSocketTunnelListener 
implements WebSocketListe
         catch (GuacamoleException e) {
             logger.error("Creation of WebSocket tunnel to guacd failed: {}", 
e.getMessage());
             logger.debug("Error connecting WebSocket tunnel.", e);
-            closeConnection(session, e.getStatus());
+            closeConnection(session, e.getStatus(), e.getWebSocketCode());
             return;
         }
 
@@ -149,7 +152,7 @@ public abstract class GuacamoleWebSocketTunnelListener 
implements WebSocketListe
                         }
 
                         // No more data
-                        closeConnection(session, GuacamoleStatus.SUCCESS);
+                        closeConnection(session, GuacamoleStatus.SUCCESS, 
null);
 
                     }
 
@@ -159,22 +162,22 @@ public abstract class GuacamoleWebSocketTunnelListener 
implements WebSocketListe
                     catch (GuacamoleClientException e) {
                         logger.info("WebSocket connection terminated: {}", 
e.getMessage());
                         logger.debug("WebSocket connection terminated due to 
client error.", e);
-                        closeConnection(session, e.getStatus());
+                        closeConnection(session, e.getStatus(), 
e.getWebSocketCode());
                     }
                     catch (GuacamoleConnectionClosedException e) {
                         logger.debug("Connection to guacd closed.", e);
-                        closeConnection(session, GuacamoleStatus.SUCCESS);
+                        closeConnection(session, GuacamoleStatus.SUCCESS, 
null);
                     }
                     catch (GuacamoleException e) {
                         logger.error("Connection to guacd terminated 
abnormally: {}", e.getMessage());
                         logger.debug("Internal error during connection to 
guacd.", e);
-                        closeConnection(session, e.getStatus());
+                        closeConnection(session, e.getStatus(), 
e.getWebSocketCode());
                     }
 
                 }
                 catch (IOException e) {
                     logger.debug("I/O error prevents further reads.", e);
-                    closeConnection(session, GuacamoleStatus.SERVER_ERROR);
+                    closeConnection(session, GuacamoleStatus.SERVER_ERROR, 
null);
                 }
 
             }

http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/ffc4c7bc/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/tomcat/GuacamoleWebSocketTunnelServlet.java
----------------------------------------------------------------------
diff --git 
a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/tomcat/GuacamoleWebSocketTunnelServlet.java
 
b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/tomcat/GuacamoleWebSocketTunnelServlet.java
index 986650e..280848c 100644
--- 
a/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/tomcat/GuacamoleWebSocketTunnelServlet.java
+++ 
b/guacamole/src/main/java/org/apache/guacamole/tunnel/websocket/tomcat/GuacamoleWebSocketTunnelServlet.java
@@ -63,12 +63,16 @@ public abstract class GuacamoleWebSocketTunnelServlet 
extends WebSocketServlet {
      *
      * @param outbound The outbound WebSocket connection to close.
      * @param guac_status The status to send.
+     * @param webSocketCode The numeric WebSocket status code to send.
      */
-    public void closeConnection(WsOutbound outbound, GuacamoleStatus 
guac_status) {
+    private void closeConnection(WsOutbound outbound, GuacamoleStatus 
guac_status,
+            Integer webSocketCode) {
 
         try {
+            if(webSocketCode == null)
+                webSocketCode = guac_status.getWebSocketCode();
             byte[] message = 
Integer.toString(guac_status.getGuacamoleStatusCode()).getBytes("UTF-8");
-            outbound.close(guac_status.getWebSocketCode(), 
ByteBuffer.wrap(message));
+            outbound.close(webSocketCode, ByteBuffer.wrap(message));
         }
         catch (IOException e) {
             logger.debug("Unable to close WebSocket tunnel.", e);
@@ -142,13 +146,13 @@ public abstract class GuacamoleWebSocketTunnelServlet 
extends WebSocketServlet {
                 catch (GuacamoleException e) {
                     logger.error("Creation of WebSocket tunnel to guacd 
failed: {}", e.getMessage());
                     logger.debug("Error connecting WebSocket tunnel.", e);
-                    closeConnection(outbound, e.getStatus());
+                    closeConnection(outbound, e.getStatus(), 
e.getWebSocketCode());
                     return;
                 }
 
                 // Do not start connection if tunnel does not exist
                 if (tunnel == null) {
-                    closeConnection(outbound, 
GuacamoleStatus.RESOURCE_NOT_FOUND);
+                    closeConnection(outbound, 
GuacamoleStatus.RESOURCE_NOT_FOUND, null);
                     return;
                 }
 
@@ -186,7 +190,7 @@ public abstract class GuacamoleWebSocketTunnelServlet 
extends WebSocketServlet {
                                 }
 
                                 // No more data
-                                closeConnection(outbound, 
GuacamoleStatus.SUCCESS);
+                                closeConnection(outbound, 
GuacamoleStatus.SUCCESS, null);
 
                             }
 
@@ -196,22 +200,22 @@ public abstract class GuacamoleWebSocketTunnelServlet 
extends WebSocketServlet {
                             catch (GuacamoleClientException e) {
                                 logger.info("WebSocket connection terminated: 
{}", e.getMessage());
                                 logger.debug("WebSocket connection terminated 
due to client error.", e);
-                                closeConnection(outbound, e.getStatus());
+                                closeConnection(outbound, e.getStatus(), 
e.getWebSocketCode());
                             }
                             catch (GuacamoleConnectionClosedException e) {
                                 logger.debug("Connection to guacd closed.", e);
-                                closeConnection(outbound, 
GuacamoleStatus.SUCCESS);
+                                closeConnection(outbound, 
GuacamoleStatus.SUCCESS, null);
                             }
                             catch (GuacamoleException e) {
                                 logger.error("Connection to guacd terminated 
abnormally: {}", e.getMessage());
                                 logger.debug("Internal error during connection 
to guacd.", e);
-                                closeConnection(outbound, e.getStatus());
+                                closeConnection(outbound, e.getStatus(), 
e.getWebSocketCode());
                             }
 
                         }
                         catch (IOException e) {
                             logger.debug("I/O error prevents further reads.", 
e);
-                            closeConnection(outbound, 
GuacamoleStatus.SERVER_ERROR);
+                            closeConnection(outbound, 
GuacamoleStatus.SERVER_ERROR, null);
                         }
 
                     }

Reply via email to