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); } }