diff --git a/shterm.js b/shterm.js index 9db2d50..b60b185 100644 --- a/shterm.js +++ b/shterm.js @@ -2,6 +2,9 @@ * is running a shell via the webtty.js server. */ +/* The number of the next packet to send. */ +var nsend = 0; + // A state machine that keeps track of polling the server. var ajaxstate = { state: 0, @@ -169,10 +172,11 @@ function postResponseHandler() { function sendback(str) { /* For responding to terminal queries. */ + var formdata = {"t": "d", "n": nsend++, "d": str}; var datareq = new XMLHttpRequest(); datareq.onreadystatechange = postResponseHandler; datareq.open('POST', '/feed', true); - datareq.send("keys=" + str); + datareq.send(JSON.stringify(formdata)); return; } @@ -214,10 +218,11 @@ function sendkey(ev) { } if (termemu.alive) ev.preventDefault(); + var formdata = {"t": "d", "n": nsend++, "d": code}; var datareq = new XMLHttpRequest(); datareq.onreadystatechange = postResponseHandler; datareq.open('POST', '/feed', true); - datareq.send("keys=" + code); + datareq.send(JSON.stringify(formdata)); //dkey(code); return; } @@ -263,10 +268,11 @@ function vkey(c) { else return; //writeData("Sending " + keystr); + var formdata = {"t": "d", "n": nsend++, "d": code}; var datareq = new XMLHttpRequest(); datareq.onreadystatechange = postResponseHandler; datareq.open('POST', '/feed', true); - datareq.send("keys=" + keystr); + datareq.send(JSON.stringify(formdata)); return; } @@ -300,6 +306,7 @@ function togglectrl() { function login(h, w) { if (termemu.alive) return; + params = {"login": true, "h": h, "w": w}; var req = new XMLHttpRequest(); req.onreadystatechange = function () { if (req.readyState == 4 && req.status == 200) { @@ -308,6 +315,7 @@ function login(h, w) { /* Success */ termemu.resize(logindict.h, logindict.w); termemu.alive = true; + nsend = 0; setTitle("Logged in"); debug(1, "Logged in with id " + logindict.id); getData(); @@ -317,7 +325,8 @@ function login(h, w) { } }; req.open('POST', '/login', true); - req.send("login=login&h=" + String(h) + "&w=" + String(w)); + req.send(JSON.stringify(params)); + //req.send("login=login&h=" + String(h) + "&w=" + String(w)); return; } @@ -332,7 +341,7 @@ function stop() { } }; req.open('POST', '/feed', true); - req.send("quit=quit"); + req.send(JSON.stringify({"t": "q", "n": nsend++})); return; } diff --git a/webtty.js b/webtty.js index c96025b..e06073d 100755 --- a/webtty.js +++ b/webtty.js @@ -144,22 +144,14 @@ function urlDec(encstr) { /* Returns the contents of a form */ function getFormValues(formtext) { - var pairstrs = formtext.split("&"); - var data = {}; - for (var i = 0; i < pairstrs.length; i++) - { - var eqsign = pairstrs[i].indexOf("="); - if (eqsign > 0) { - rawname = pairstrs[i].slice(0, eqsign); - rawval = pairstrs[i].slice(eqsign + 1); - name = urlDec(rawname); - val = urlDec(rawval); - if (!(name in data)) - data[name] = []; - data[name].push(val); - } + var jsonobj; + try { + jsonobj = JSON.parse(formtext); + } catch (e) { + if (e instanceof SyntaxError) + return null; } - return data; + return jsonobj; } function login(req, res, formdata) { @@ -298,14 +290,14 @@ function handler(req, res) { sendError(res, 1); return; } - if (formdata["quit"] == "quit") { + if (formdata["t"] == "q") { /* The client wants to quit. */ // FIXME need to send a message back to the client cterm.close(); } - else if (formdata["keys"]) { + else if (formdata["t"] == "d" && typeof(formdata["d"]) == "string") { /* process the keys */ - hexstr = formdata["keys"][0].replace(/[^0-9a-f]/gi, ""); + hexstr = formdata["d"].replace(/[^0-9a-f]/gi, ""); if (hexstr.length % 2 != 0) { sendError(res, 2); return;