From 01c3c943d437ebc141f80a6c415cc3a7bc03ba23 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Tue, 12 Jul 2011 15:18:44 -0700 Subject: [PATCH] Add close() to tunnel, properly detach and close tunnel on error. --- .../guacamole/net/GuacamoleTunnel.java | 11 ++++++++ .../servlet/GuacamoleTunnelServlet.java | 27 ++++++++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/guacamole-common/src/main/java/net/sourceforge/guacamole/net/GuacamoleTunnel.java b/guacamole-common/src/main/java/net/sourceforge/guacamole/net/GuacamoleTunnel.java index 438a8c03e..4e69051a0 100644 --- a/guacamole-common/src/main/java/net/sourceforge/guacamole/net/GuacamoleTunnel.java +++ b/guacamole-common/src/main/java/net/sourceforge/guacamole/net/GuacamoleTunnel.java @@ -21,6 +21,7 @@ package net.sourceforge.guacamole.net; import java.util.UUID; import java.util.concurrent.locks.ReentrantLock; +import net.sourceforge.guacamole.GuacamoleException; import net.sourceforge.guacamole.io.GuacamoleReader; import net.sourceforge.guacamole.io.GuacamoleWriter; @@ -127,4 +128,14 @@ public class GuacamoleTunnel { return uuid; } + /** + * Release all resources allocated to this GuacamoleTunnel. + * + * @throws GuacamoleException if an error occurs while releasing + * resources. + */ + public void close() throws GuacamoleException { + socket.close(); + } + } diff --git a/guacamole-common/src/main/java/net/sourceforge/guacamole/servlet/GuacamoleTunnelServlet.java b/guacamole-common/src/main/java/net/sourceforge/guacamole/servlet/GuacamoleTunnelServlet.java index 233eac4e7..728afb237 100644 --- a/guacamole-common/src/main/java/net/sourceforge/guacamole/servlet/GuacamoleTunnelServlet.java +++ b/guacamole-common/src/main/java/net/sourceforge/guacamole/servlet/GuacamoleTunnelServlet.java @@ -190,10 +190,8 @@ public abstract class GuacamoleTunnelServlet extends HttpServlet { // Detach tunnel and throw error if EOF (and we haven't sent any // data yet. char[] message = reader.read(); - if (message == null) { - session.detachTunnel(tunnel); + if (message == null) throw new GuacamoleException("Disconnected."); - } // For all messages, until another stream is ready (we send at least one message) do { @@ -215,10 +213,28 @@ public abstract class GuacamoleTunnelServlet extends HttpServlet { response.flushBuffer(); } + catch (GuacamoleException e) { + + // Detach and close + session.detachTunnel(tunnel); + tunnel.close(); + + throw e; + } catch (UnsupportedEncodingException e) { + + // Detach and close + session.detachTunnel(tunnel); + tunnel.close(); + throw new GuacamoleException("UTF-8 not supported by Java.", e); } catch (IOException e) { + + // Detach and close + session.detachTunnel(tunnel); + tunnel.close(); + throw new GuacamoleException("I/O error writing to servlet output stream.", e); } finally { @@ -273,6 +289,11 @@ public abstract class GuacamoleTunnelServlet extends HttpServlet { } catch (IOException e) { + + // Detach and close + session.detachTunnel(tunnel); + tunnel.close(); + throw new GuacamoleException("I/O Error sending data to server: " + e.getMessage(), e); } finally {