diff --git a/guacamole-common-js/src/main/resources/guacamole.js b/guacamole-common-js/src/main/resources/guacamole.js index 3bff5d0fe..e32c62dbe 100644 --- a/guacamole-common-js/src/main/resources/guacamole.js +++ b/guacamole-common-js/src/main/resources/guacamole.js @@ -44,6 +44,11 @@ Guacamole.Client = function(display, tunnel) { tunnel.oninstruction = doInstruction; + tunnel.onerror = function(message) { + if (guac_client.onerror) + guac_client.onerror(message); + }; + // Display must be relatively positioned for mouse to be handled properly display.style.position = "relative"; diff --git a/guacamole-common-js/src/main/resources/tunnel.js b/guacamole-common-js/src/main/resources/tunnel.js index 0f33c3e26..278766e4a 100644 --- a/guacamole-common-js/src/main/resources/tunnel.js +++ b/guacamole-common-js/src/main/resources/tunnel.js @@ -169,8 +169,8 @@ Guacamole.HTTPTunnel = function(tunnelURL) { return; } - // Start next request as soon as possible - if (xmlhttprequest.readyState >= 2 && nextRequest == null) + // Start next request as soon as possible IF request was successful + if (xmlhttprequest.readyState >= 2 && nextRequest == null && xmlhttprequest.status == 200) nextRequest = makeRequest(); // Parse stream when data is received and when complete. @@ -185,8 +185,14 @@ Guacamole.HTTPTunnel = function(tunnelURL) { clearInterval(interval); } + // If canceled, stop transfer + if (xmlhttprequest.status == 0) { + tunnel.disconnect(); + return; + } + // Halt on error during request - if (xmlhttprequest.status == 0 || xmlhttprequest.status != 200) { + else if (xmlhttprequest.status != 200) { // Get error message (if any) var message = xmlhttprequest.getResponseHeader("X-Guacamole-Error-Message");