From 754e0c0bee43bb1d972f026646d778a8d8c611fc Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Wed, 14 Jul 2010 16:57:02 -0500 Subject: [PATCH] UTF-8: send 0 as 256 during encoding too. 0 is valid UTF-8, but in order to avoid WebSockets framing, we encode/decode it as 256. Also, be tolerant of 0 length messages. --- include/vnc.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/include/vnc.js b/include/vnc.js index a4527318..abca2d97 100644 --- a/include/vnc.js +++ b/include/vnc.js @@ -1135,10 +1135,17 @@ clientCutText: function (text) { encode_message: function(arr) { if (RFB.b64encode) { + /* base64 encode */ RFB.SQ = RFB.SQ + Base64.encode(arr); } else { + /* UTF-8 encode. 0 -> 256 to avoid WebSockets framing */ RFB.SQ = RFB.SQ + arr.map(function (num) { - return String.fromCharCode(num); } ).join(''); + if (num === 0) { + return String.fromCharCode(256); + } else { + return String.fromCharCode(num); + } + } ).join(''); } }, @@ -1146,9 +1153,10 @@ decode_message: function(data) { var raw, i, length, RQ = RFB.RQ; //Util.Debug(">> decode_message: " + data); if (RFB.b64encode) { + /* base64 decode */ RFB.RQ = RFB.RQ.concat(Base64.decode(data, 0)); } else { - // A bit faster in firefox + /* UTF-8 decode. 256 -> 0 to WebSockets framing */ length = data.length; for (i=0; i < length; i += 1) { RQ.push(data.charCodeAt(i) % 256); @@ -1162,7 +1170,11 @@ recv_message: function(e) { try { RFB.decode_message(e.data); - RFB.handle_message(); + if (RFB.RQ.length > 0) { + RFB.handle_message(); + } else { + Util.Debug("Ignoring empty message"); + } } catch (exc) { if (typeof exc.stack !== 'undefined') { Util.Warn("recv_message, caught exception: " + exc.stack);