From 03237cf3e31e29f995b0ecc7167e7cf7f4c9fa89 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Tue, 26 Jul 2011 16:53:43 +0200 Subject: [PATCH] Bug #723: Improve error handling in Sunstone/oZones client-side. *Removed unused error regexps *Fixed used regexps *Do not report "server cannot be reached" all the time, do it only once. *Do not crash when a server exception occurs: inform user and direct to server logs --- src/ozones/Server/public/js/ozones.js | 7 ++++- src/sunstone/public/js/opennebula.js | 7 ++++- src/sunstone/public/js/sunstone-util.js | 39 ++++++++++++------------- 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/ozones/Server/public/js/ozones.js b/src/ozones/Server/public/js/ozones.js index b77601bca3..a825b391b0 100644 --- a/src/ozones/Server/public/js/ozones.js +++ b/src/ozones/Server/public/js/ozones.js @@ -21,7 +21,12 @@ var oZones = { var error = {}; if (resp.responseText) { - error = JSON.parse(resp.responseText); + try { + error = JSON.parse(resp.responseText); + } + catch (e) { + error.error = {message: "It appears there was a server exception. Please check server's log."}; + }; } else { diff --git a/src/sunstone/public/js/opennebula.js b/src/sunstone/public/js/opennebula.js index 222faa20ca..276672778c 100644 --- a/src/sunstone/public/js/opennebula.js +++ b/src/sunstone/public/js/opennebula.js @@ -21,7 +21,12 @@ var OpenNebula = { var error = {}; if (resp.responseText) { - error = JSON.parse(resp.responseText); + try { + error = JSON.parse(resp.responseText); + } + catch (e) { + error.error = {message: "It appears there was a server exception. Please check server's log."}; + }; } else { diff --git a/src/sunstone/public/js/sunstone-util.js b/src/sunstone/public/js/sunstone-util.js index d641552e85..e2c570c792 100644 --- a/src/sunstone/public/js/sunstone-util.js +++ b/src/sunstone/public/js/sunstone-util.js @@ -321,43 +321,40 @@ function onError(request,error_json) { var m; var message = error_json.error.message; + if ( typeof onError.disabled == 'undefined' ) { + onError.disabled=false; + } + //redirect to login if unauthenticated if (error_json.error.http_status=="401") { window.location.href = "login"; + onError.disabled=false; + return false; }; if (!message){ - notifyError("Cannot contact server: is Sunstone server running and reachable?"); + if (!onError.disabled){ + notifyError("Cannot contact server: is it running and reachable?"); + onError.disabled=true; + } return false; + } else { + onError.disabled=false; } //Parse known errors: - var action_error = /^\[(\w+)\] Error trying to (\w+) (\w+) \[(\w+)\].*Reason: (.*)\.$/; - var action_error_noid = /^\[(\w+)\] Error trying to (\w+) (\w+) (.*)\.$/; - var get_error = /^\[(\w+)\] Error getting (\w+) \[(\w+)\]\.$/; - var auth_error = /^\[(\w+)\] User \[.\] not authorized to perform (\w+) on (\w+) \[?(\w+)\]?\.?$/; + var get_error = /^\[(\w+)\] Error getting ([\w ]+) \[(\d+)\]\.$/; + var auth_error = /^\[(\w+)\] User \[(\d+)\] not authorized to perform action on ([\w ]+).$/; - if (m = message.match(action_error)) { + if (m = message.match(get_error)) { method = m[1]; - action = m[2]; - object = m[3]; - id = m[4]; - reason = m[5]; - } else if (m = message.match(action_error_noid)) { - method = m[1]; - action = m[2]; - object = m[3]; - reason = m[4]; - } else if (m = message.match(get_error)) { - method = m[1]; - action = "SHOW"; + action = "Show"; object = m[2]; id = m[3]; } else if (m = message.match(auth_error)) { method = m[1]; - action = m[2]; - object = m[3]; - id = m[4]; + object = m[3]; + reason = "Unauthorized"; } if (m) {