clix/raw.lua

Mon, 16 Jan 2012 21:27:33 +0100

author
Kim Alvefur <zash@zash.se>
date
Mon, 16 Jan 2012 21:27:33 +0100
changeset 68
b7d92ed9c268
parent 46
b5d6e443e571
child 83
040fadcc86f9
permissions
-rw-r--r--

clix.raw: Add a small sandbox with util.stanza functions

19
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 short_opts.i = "interactive";
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 short_opts.e = "echo";
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 return function (opts, args)
27
5b58c002d6ad clix.*: Add --short-help and make sure they are working correctly
Matthew Wild <mwild1@gmail.com>
parents: 23
diff changeset
5 if opts.short_help then
5b58c002d6ad clix.*: Add --short-help and make sure they are working correctly
Matthew Wild <mwild1@gmail.com>
parents: 23
diff changeset
6 print("Send/receive raw XML to/from the server");
5b58c002d6ad clix.*: Add --short-help and make sure they are working correctly
Matthew Wild <mwild1@gmail.com>
parents: 23
diff changeset
7 return;
5b58c002d6ad clix.*: Add --short-help and make sure they are working correctly
Matthew Wild <mwild1@gmail.com>
parents: 23
diff changeset
8 end
46
b5d6e443e571 raw: If using --stdin and not --interactive then buffer all data before connecting, more reliable in a non-interactive environment
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
9
b5d6e443e571 raw: If using --stdin and not --interactive then buffer all data before connecting, more reliable in a non-interactive environment
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
10 local send_xml;
b5d6e443e571 raw: If using --stdin and not --interactive then buffer all data before connecting, more reliable in a non-interactive environment
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
11 if opts.stdin then
b5d6e443e571 raw: If using --stdin and not --interactive then buffer all data before connecting, more reliable in a non-interactive environment
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
12 send_xml = io.read("*a");
b5d6e443e571 raw: If using --stdin and not --interactive then buffer all data before connecting, more reliable in a non-interactive environment
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
13 end
b5d6e443e571 raw: If using --stdin and not --interactive then buffer all data before connecting, more reliable in a non-interactive environment
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
14
19
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 local function on_connect(conn)
46
b5d6e443e571 raw: If using --stdin and not --interactive then buffer all data before connecting, more reliable in a non-interactive environment
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
16 conn:hook("incoming-raw", function (data) print(data) end);
b5d6e443e571 raw: If using --stdin and not --interactive then buffer all data before connecting, more reliable in a non-interactive environment
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
17 if opts.interactive then
19
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 local stdin = {
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 getfd = function () return 0; end;
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 dirty = function (self) return false; end;
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 settimeout = function () end;
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 send = function (_, d) return #d, 0; end;
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 close = function () end;
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 receive = function (_, patt)
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 local data = io.stdin:read(patt);
68
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
26 if data == nil then
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
27 conn:close();
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
28 end
19
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 if opts.echo then
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 io.write(data, patt == "*l" and "\n" or "");
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 end
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 return data;
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 end
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 };
68
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
35 local env = setmetatable({}, { __index = {
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
36 s = verse.stanza,
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
37 m = verse.message,
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
38 p = verse.presence,
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
39 iq = verse.iq,
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
40 }});
19
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 local function on_incoming(stdin, data)
68
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
42 if not data then
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
43 conn:close();
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
44 return
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
45 end
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
46 if data:sub(1,1) ~= "<" then
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
47 local chunk = assert(loadstring("return "..data, "@stdin"));
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
48 data = "";
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
49 setfenv(chunk, env);
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
50 local ok, ret = pcall(chunk);
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
51 if ok then
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
52 data = ret
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
53 end
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
54 end
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
55 if data then
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
56 conn:send(data);
b7d92ed9c268 clix.raw: Add a small sandbox with util.stanza functions
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
57 end
19
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 if not opts.interactive then
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 conn:close();
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 end
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 end
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 stdin = require "net.server".wrapclient(stdin, "stdin", 0, {
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 onincoming = on_incoming, ondisconnect = function () end
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 }, "*l");
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 else
46
b5d6e443e571 raw: If using --stdin and not --interactive then buffer all data before connecting, more reliable in a non-interactive environment
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
66 if send_xml then
b5d6e443e571 raw: If using --stdin and not --interactive then buffer all data before connecting, more reliable in a non-interactive environment
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
67 conn:send(send_xml);
b5d6e443e571 raw: If using --stdin and not --interactive then buffer all data before connecting, more reliable in a non-interactive environment
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
68 else
b5d6e443e571 raw: If using --stdin and not --interactive then buffer all data before connecting, more reliable in a non-interactive environment
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
69 conn:send(table.concat(arg, " "));
b5d6e443e571 raw: If using --stdin and not --interactive then buffer all data before connecting, more reliable in a non-interactive environment
Matthew Wild <mwild1@gmail.com>
parents: 27
diff changeset
70 end
19
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 conn:close();
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 end
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 end
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 return clix_connect(opts, on_connect);
3a0a156e0a79 clix.raw: New command to set up a raw XML in/out session with the server
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 end

mercurial