From e28c62d19b3c1447dae2c34af6b3fede7af3082c Mon Sep 17 00:00:00 2001 From: Athanasios Douitsis Date: Sun, 9 Oct 2016 03:30:39 +0300 Subject: [PATCH] Enhance logging, error reporting. - Added the onlog callback to the ww. Can be used by whoever is using the ww to ascertain progress, etc. In NDTjs the logger now sends messages to that callback too. - Add onopen,onerror and onclose event handlers to NDTjs. The first two are trivial, but onclose tries to analyze the close event and produce some useful messages, especially in the case of abnormal websocket closure. --- HTML5-frontend/ndt-browser-client.js | 78 ++++++++++++++++++++++++++-- HTML5-frontend/ndt-wrapper-ww.js | 8 ++- 2 files changed, 82 insertions(+), 4 deletions(-) diff --git a/HTML5-frontend/ndt-browser-client.js b/HTML5-frontend/ndt-browser-client.js index 6288d5a..b9b430f 100644 --- a/HTML5-frontend/ndt-browser-client.js +++ b/HTML5-frontend/ndt-browser-client.js @@ -31,6 +31,7 @@ function NDTjs(server, serverPort, serverProtocol, serverPath, callbacks, 'onprogress': function () { return false; }, 'onfinish': function () { return false; }, 'onerror': function () { return false; }, + 'onlog': function () { return false; }, }; } else { this.callbacks = callbacks; @@ -76,6 +77,7 @@ NDTjs.prototype.logger = function (logMessage, debugging) { debugging = debugging || false; if (debugging === true) { console.log(logMessage); + this.callbacks.onlog(logMessage); } }; @@ -198,9 +200,79 @@ NDTjs.prototype.TestFailureException = function (message) { */ NDTjs.prototype.createWebsocket = function (serverProtocol, serverAddress, serverPort, urlPath, protocol) { - var createdWebsocket = new WebSocket(serverProtocol + '://' + - serverAddress + ':' + serverPort + - urlPath, protocol); + var that = this; + var ws_str = serverProtocol + '://' + + serverAddress + ':' + serverPort + + urlPath; + var createdWebsocket = new WebSocket(ws_str, protocol); + // did we succeed? If not, call onerror + createdWebsocket.onerror = function (event) { + that.callbacks.onerror( 'Error in '+protocol+' websocket '+ws_str ) ; + }; + // if we succeeded log it + createdWebsocket.onopen = function (event) { + that.logger( 'websocket '+protocol+' opened: '+ws_str ) ; + }; + // http://stackoverflow.com/questions/18803971/websocket-onerror-how-to-read-error-description + // and http://tools.ietf.org/html/rfc6455#section-7.4.1 + createdWebsocket.onclose = function (event) { + var message; + if ( ( event.code == 1006 ) && ( ( protocol == 'c2s' ) || ( protocol == 's2c' ) ) ) { + // it is observed that even in successful measurements the c2s and s2c + // connections terminate with 1006. So we shoulnd't throw an error in that + // specific case. If the control socket is alive, everything is probably ok + return; + } + switch ( event.code ) { + case 1000: + message = 'normal closure'; + return; // everything is normal + break; + case 1001: + message = 'endpoint went away'; + break; + case 1002: + message = 'endpoint terminated the connection due to a protocol error'; + break; + case 1003: + message = 'unacceptable type of data by endpoint'; + break; + case 1004: + message = 'reserved'; + break; + case 1005: + message = 'no status code was actually present'; + break; + case 1006: + message = 'connection closed abnormally, e.g. without sending or receiving a Close control frame'; + break; + case 1007: + message = 'endpoint received data inconsistent with message type'; + break; + case 1008: + message = 'endpoint received data that violate its policy or otherwise data that it didn\'t like'; + break; + case 1009: + message = 'endpoint received a message too big to process'; + break; + case 1010: + message = 'endpoint terminated the connection because server didn\'t support extension'; + break; + case 1011: + message = 'server encountered an unexpected condition'; + break; + case 1015: + message = 'TLS handshake failure'; + break; + default: + message = 'reason '+event.code+' unknown'; + } + var err_str = 'error '+event.code+' ('+message+') (reason:'+event.reason+ + ' clean: '+event.wasClean+') on '+protocol+' websocket '+ + ws_str+'. See http://tools.ietf.org/html/rfc6455#section-7.4.1'; + console.log(err_str); + throw that.TestFailureException(err_str); + }; createdWebsocket.binaryType = 'arraybuffer'; return createdWebsocket; }; diff --git a/HTML5-frontend/ndt-wrapper-ww.js b/HTML5-frontend/ndt-wrapper-ww.js index 7fecc25..3ba0963 100644 --- a/HTML5-frontend/ndt-wrapper-ww.js +++ b/HTML5-frontend/ndt-wrapper-ww.js @@ -59,7 +59,13 @@ function startNDT(hostname, port, protocol, path, update_interval) { 'cmd': 'onerror', 'error_message': error_message }); - } + }, + 'onlog': function(message) { + self.postMessage({ + 'cmd': 'onlog', + 'message': message, + }); + }, }; var client = new NDTjs(hostname, port, protocol, path, callbacks,