Added disconnect function to tunnel, added automatic disconnect on error receipt in client.

This commit is contained in:
Michael Jumper
2011-03-08 21:08:59 -08:00
parent 4f656c2e94
commit cfebdb2cf3
2 changed files with 26 additions and 7 deletions

View File

@@ -218,6 +218,7 @@ function GuacamoleClient(display, tunnel) {
"error": function(parameters) { "error": function(parameters) {
if (errorHandler) errorHandler(tunnel.unescapeGuacamoleString(parameters[0])); if (errorHandler) errorHandler(tunnel.unescapeGuacamoleString(parameters[0]));
disconnect();
}, },
"name": function(parameters) { "name": function(parameters) {
@@ -337,6 +338,7 @@ function GuacamoleClient(display, tunnel) {
setState(STATE_DISCONNECTING); setState(STATE_DISCONNECTING);
tunnel.sendMessage("disconnect;"); tunnel.sendMessage("disconnect;");
tunnel.disconnect();
setState(STATE_DISCONNECTED); setState(STATE_DISCONNECTED);
} }

View File

@@ -22,6 +22,7 @@ function GuacamoleHTTPTunnel(tunnelURL) {
var TUNNEL_READ = tunnelURL + "?read"; var TUNNEL_READ = tunnelURL + "?read";
var TUNNEL_WRITE = tunnelURL + "?write"; var TUNNEL_WRITE = tunnelURL + "?write";
var connected = 0;
var pollResponse = 1; // Default to polling - will be turned off automatically if not needed var pollResponse = 1; // Default to polling - will be turned off automatically if not needed
var instructionHandler = null; var instructionHandler = null;
@@ -30,6 +31,10 @@ function GuacamoleHTTPTunnel(tunnelURL) {
function sendMessage(message) { function sendMessage(message) {
// Do not attempt to send messages if not connected
if (!connected)
return;
// Add event to queue, restart send loop if finished. // Add event to queue, restart send loop if finished.
outputMessageBuffer += message; outputMessageBuffer += message;
if (sendingMessages == 0) if (sendingMessages == 0)
@@ -75,6 +80,16 @@ function GuacamoleHTTPTunnel(tunnelURL) {
function parseResponse() { function parseResponse() {
// Do not handle responses if not connected
if (!connected) {
// Clean up interval if polling
if (interval != null)
clearInterval(interval);
return;
}
// Start next request as soon as possible // Start next request as soon as possible
if (xmlhttprequest.readyState >= 2 && nextRequest == null) if (xmlhttprequest.readyState >= 2 && nextRequest == null)
nextRequest = makeRequest(); nextRequest = makeRequest();
@@ -92,12 +107,8 @@ function GuacamoleHTTPTunnel(tunnelURL) {
} }
// Halt on error during request // Halt on error during request
if (xmlhttprequest.status == 0) { if (xmlhttprequest.status == 0 || xmlhttprequest.status != 200) {
showError("Request canceled by browser."); disconnect();
return;
}
else if (xmlhttprequest.status != 200) {
showError("Error during request (HTTP " + xmlhttprequest.status + "): " + xmlhttprequest.statusText);
return; return;
} }
@@ -201,12 +212,18 @@ function GuacamoleHTTPTunnel(tunnelURL) {
connect_xmlhttprequest.send(null); connect_xmlhttprequest.send(null);
// Start reading data // Start reading data
connected = 1;
handleResponse(makeRequest()); handleResponse(makeRequest());
}; }
function disconnect() {
connected = 0;
}
// External API // External API
this.connect = connect; this.connect = connect;
this.disconnect = disconnect;
this.sendMessage = sendMessage; this.sendMessage = sendMessage;
this.setInstructionHandler = function(handler) { this.setInstructionHandler = function(handler) {
instructionHandler = handler; instructionHandler = handler;