webtty: switch upward protocol to JSON

Switch the client-to-server messages from the HTML forms format to
JSON (for the webtty app).  Message numbers are sent but not yet used.
This commit is contained in:
John "Elwin" Edwards 2012-05-13 20:50:13 -07:00
parent 32127f8b77
commit 090e02ed59
2 changed files with 24 additions and 23 deletions

View file

@ -2,6 +2,9 @@
* is running a shell via the webtty.js server. * 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. // A state machine that keeps track of polling the server.
var ajaxstate = { var ajaxstate = {
state: 0, state: 0,
@ -169,10 +172,11 @@ function postResponseHandler() {
function sendback(str) { function sendback(str) {
/* For responding to terminal queries. */ /* For responding to terminal queries. */
var formdata = {"t": "d", "n": nsend++, "d": str};
var datareq = new XMLHttpRequest(); var datareq = new XMLHttpRequest();
datareq.onreadystatechange = postResponseHandler; datareq.onreadystatechange = postResponseHandler;
datareq.open('POST', '/feed', true); datareq.open('POST', '/feed', true);
datareq.send("keys=" + str); datareq.send(JSON.stringify(formdata));
return; return;
} }
@ -214,10 +218,11 @@ function sendkey(ev) {
} }
if (termemu.alive) if (termemu.alive)
ev.preventDefault(); ev.preventDefault();
var formdata = {"t": "d", "n": nsend++, "d": code};
var datareq = new XMLHttpRequest(); var datareq = new XMLHttpRequest();
datareq.onreadystatechange = postResponseHandler; datareq.onreadystatechange = postResponseHandler;
datareq.open('POST', '/feed', true); datareq.open('POST', '/feed', true);
datareq.send("keys=" + code); datareq.send(JSON.stringify(formdata));
//dkey(code); //dkey(code);
return; return;
} }
@ -263,10 +268,11 @@ function vkey(c) {
else else
return; return;
//writeData("Sending " + keystr); //writeData("Sending " + keystr);
var formdata = {"t": "d", "n": nsend++, "d": code};
var datareq = new XMLHttpRequest(); var datareq = new XMLHttpRequest();
datareq.onreadystatechange = postResponseHandler; datareq.onreadystatechange = postResponseHandler;
datareq.open('POST', '/feed', true); datareq.open('POST', '/feed', true);
datareq.send("keys=" + keystr); datareq.send(JSON.stringify(formdata));
return; return;
} }
@ -300,6 +306,7 @@ function togglectrl() {
function login(h, w) { function login(h, w) {
if (termemu.alive) if (termemu.alive)
return; return;
params = {"login": true, "h": h, "w": w};
var req = new XMLHttpRequest(); var req = new XMLHttpRequest();
req.onreadystatechange = function () { req.onreadystatechange = function () {
if (req.readyState == 4 && req.status == 200) { if (req.readyState == 4 && req.status == 200) {
@ -308,6 +315,7 @@ function login(h, w) {
/* Success */ /* Success */
termemu.resize(logindict.h, logindict.w); termemu.resize(logindict.h, logindict.w);
termemu.alive = true; termemu.alive = true;
nsend = 0;
setTitle("Logged in"); setTitle("Logged in");
debug(1, "Logged in with id " + logindict.id); debug(1, "Logged in with id " + logindict.id);
getData(); getData();
@ -317,7 +325,8 @@ function login(h, w) {
} }
}; };
req.open('POST', '/login', true); 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; return;
} }
@ -332,7 +341,7 @@ function stop() {
} }
}; };
req.open('POST', '/feed', true); req.open('POST', '/feed', true);
req.send("quit=quit"); req.send(JSON.stringify({"t": "q", "n": nsend++}));
return; return;
} }

View file

@ -144,22 +144,14 @@ function urlDec(encstr) {
/* Returns the contents of a form */ /* Returns the contents of a form */
function getFormValues(formtext) { function getFormValues(formtext) {
var pairstrs = formtext.split("&"); var jsonobj;
var data = {}; try {
for (var i = 0; i < pairstrs.length; i++) jsonobj = JSON.parse(formtext);
{ } catch (e) {
var eqsign = pairstrs[i].indexOf("="); if (e instanceof SyntaxError)
if (eqsign > 0) { return null;
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);
}
} }
return data; return jsonobj;
} }
function login(req, res, formdata) { function login(req, res, formdata) {
@ -298,14 +290,14 @@ function handler(req, res) {
sendError(res, 1); sendError(res, 1);
return; return;
} }
if (formdata["quit"] == "quit") { if (formdata["t"] == "q") {
/* The client wants to quit. */ /* The client wants to quit. */
// FIXME need to send a message back to the client // FIXME need to send a message back to the client
cterm.close(); cterm.close();
} }
else if (formdata["keys"]) { else if (formdata["t"] == "d" && typeof(formdata["d"]) == "string") {
/* process the keys */ /* 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) { if (hexstr.length % 2 != 0) {
sendError(res, 2); sendError(res, 2);
return; return;