From 5d8e7ec0681bab89a54817f20e54916e6287dcdb Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Sat, 17 Apr 2010 17:16:08 -0500 Subject: [PATCH] Add web-socket-js support with packet re-ordering. - web-socket-js is from http://github.com/gimite/web-socket-js. It is a flash object that emultates WebSockets. Unfortunately, events (or packets) from the web-socket-js object can get re-ordered so we need to know the packet order. - So wsproxy.py prepends the sequence number of the packet when sending. - If the client receives packets out of order it queues them up and scans the queue for the sequence number it's looking for until things are back on track. Gross, but hey: It works! - Also, add packet sequence checking to wstest.* --- TODO | 17 +-- include/base64.js | 17 ++- vnc.html | 20 ++- vnc.js | 330 ++++++++++++++++++++++++++++++---------------- wsproxy.py | 87 ++++++++---- wstest.html | 29 ++-- wstest.py | 67 +++++++--- 7 files changed, 377 insertions(+), 190 deletions(-) diff --git a/TODO b/TODO index 61105c3..d9eea23 100644 --- a/TODO +++ b/TODO @@ -1,20 +1,7 @@ +- Make packet sequence number optional based on WebSockets 'path'. + - Better status and error feedback. -- Get working in firefox using flash web-socket-js: - http://github.com/gimite/web-socket-js - - - Only load Flash stuff if needed: - var x='< script type="text/javascript" src='; - var y='><\/script>'; - var t=''; - t+= x+'file1.js'+y; - t+= x+'file2.js'+y; - t+= x+'fileA.txt'+y; - document.write(t); - -- Version without mootools: - - test cross-browser - - Add WSS/https/SSL support to page and wsproxy.py - Make C version of wsproxy.py diff --git a/include/base64.js b/include/base64.js index ac56669..e556b2b 100644 --- a/include/base64.js +++ b/include/base64.js @@ -90,25 +90,30 @@ toBinaryTable : [ 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 ], -decode: function (data) { +decode: function (data, offset) { + offset = typeof(offset) != 'undefined' ? offset : 0; var binTable = Base64.toBinaryTable; var pad = Base64.base64Pad; var leftbits = 0; // number of bits decoded, but yet to be appended var leftdata = 0; // bits decoded, but yet to be appended /* Every four characters is 3 resulting numbers */ - var data_length = data.indexOf('='); - if (data_length == -1) data_length = data.length; - var result_length = (data_length >> 2) * 3 + (data.length % 4 - 1); + var data_length = data.indexOf('=') - offset; + if (data_length < 0) data_length = data.length - offset; + + var result_length = (data_length >> 2) * 3 + ((data.length - offset) % 4 - 1); var result = new Array(result_length); // Convert one by one. var idx = 0; - for (var i = 0; i < data.length; i++) { + for (var i = offset; i < data.length; i++) { var c = binTable[data[i].charCodeAt(0) & 0x7f]; var padding = (data[i] == pad); // Skip illegal characters and whitespace - if (c == -1) continue; + if (c == -1) { + console.log("Illegal character '" + data[i].charCodeAt(0) + "'"); + continue; + } // Collect data into leftdata, update bitcount leftdata = (leftdata << 6) | c; diff --git a/vnc.html b/vnc.html index 5da72bf..8abe2ce 100644 --- a/vnc.html +++ b/vnc.html @@ -2,7 +2,7 @@ VNC Client - + Host:   Port:   @@ -35,8 +35,26 @@