Software /
code /
verse
Comparison
plugins/proxy65.lua @ 380:0891b4e27766
Discard trailing whitespace
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 01 May 2015 23:27:29 +0200 |
parent | 103:6cc0ca4aa664 |
child | 392:cdea6a28369e |
comparison
equal
deleted
inserted
replaced
379:d80d27234e38 | 380:0891b4e27766 |
---|---|
17 -- Fill list with available proxies | 17 -- Fill list with available proxies |
18 if service.type == "bytestreams" then | 18 if service.type == "bytestreams" then |
19 outstanding_proxies = outstanding_proxies + 1; | 19 outstanding_proxies = outstanding_proxies + 1; |
20 stream:send_iq(verse.iq({ to = service.jid, type = "get" }) | 20 stream:send_iq(verse.iq({ to = service.jid, type = "get" }) |
21 :tag("query", { xmlns = xmlns_bytestreams }), function (result) | 21 :tag("query", { xmlns = xmlns_bytestreams }), function (result) |
22 | 22 |
23 outstanding_proxies = outstanding_proxies - 1; | 23 outstanding_proxies = outstanding_proxies - 1; |
24 if result.attr.type == "result" then | 24 if result.attr.type == "result" then |
25 local streamhost = result:get_child("query", xmlns_bytestreams) | 25 local streamhost = result:get_child("query", xmlns_bytestreams) |
26 :get_child("streamhost").attr; | 26 :get_child("streamhost").attr; |
27 | 27 |
28 stream.proxy65.available_streamhosts[streamhost.jid] = { | 28 stream.proxy65.available_streamhosts[streamhost.jid] = { |
29 jid = streamhost.jid; | 29 jid = streamhost.jid; |
30 host = streamhost.host; | 30 host = streamhost.host; |
31 port = tonumber(streamhost.port); | 31 port = tonumber(streamhost.port); |
32 }; | 32 }; |
41 local conn = verse.new(nil, { | 41 local conn = verse.new(nil, { |
42 initiator_jid = request.attr.from, | 42 initiator_jid = request.attr.from, |
43 streamhosts = {}, | 43 streamhosts = {}, |
44 current_host = 0; | 44 current_host = 0; |
45 }); | 45 }); |
46 | 46 |
47 -- Parse hosts from request | 47 -- Parse hosts from request |
48 for tag in request.tags[1]:childtags() do | 48 for tag in request.tags[1]:childtags() do |
49 if tag.name == "streamhost" then | 49 if tag.name == "streamhost" then |
50 table.insert(conn.streamhosts, tag.attr); | 50 table.insert(conn.streamhosts, tag.attr); |
51 end | 51 end |
52 end | 52 end |
53 | 53 |
54 --Attempt to connect to the next host | 54 --Attempt to connect to the next host |
55 local function attempt_next_streamhost() | 55 local function attempt_next_streamhost() |
56 -- First connect, or the last connect failed | 56 -- First connect, or the last connect failed |
57 if conn.current_host < #conn.streamhosts then | 57 if conn.current_host < #conn.streamhosts then |
58 conn.current_host = conn.current_host + 1; | 58 conn.current_host = conn.current_host + 1; |
66 -- All streamhosts tried, none successful | 66 -- All streamhosts tried, none successful |
67 conn:unhook("disconnected", attempt_next_streamhost); | 67 conn:unhook("disconnected", attempt_next_streamhost); |
68 stream:send(verse.error_reply(request, "cancel", "item-not-found")); | 68 stream:send(verse.error_reply(request, "cancel", "item-not-found")); |
69 -- Let disconnected event fall through to user handlers... | 69 -- Let disconnected event fall through to user handlers... |
70 end | 70 end |
71 | 71 |
72 function conn:accept() | 72 function conn:accept() |
73 conn:hook("disconnected", attempt_next_streamhost, 100); | 73 conn:hook("disconnected", attempt_next_streamhost, 100); |
74 -- When this event fires, we're connected to a streamhost | 74 -- When this event fires, we're connected to a streamhost |
75 conn:hook("connected", function () | 75 conn:hook("connected", function () |
76 conn:unhook("disconnected", attempt_next_streamhost); | 76 conn:unhook("disconnected", attempt_next_streamhost); |
92 function proxy65_mt:new(target_jid, proxies) | 92 function proxy65_mt:new(target_jid, proxies) |
93 local conn = verse.new(nil, { | 93 local conn = verse.new(nil, { |
94 target_jid = target_jid; | 94 target_jid = target_jid; |
95 bytestream_sid = uuid.generate(); | 95 bytestream_sid = uuid.generate(); |
96 }); | 96 }); |
97 | 97 |
98 local request = verse.iq{type="set", to = target_jid} | 98 local request = verse.iq{type="set", to = target_jid} |
99 :tag("query", { xmlns = xmlns_bytestreams, mode = "tcp", sid = conn.bytestream_sid }); | 99 :tag("query", { xmlns = xmlns_bytestreams, mode = "tcp", sid = conn.bytestream_sid }); |
100 for _, proxy in ipairs(proxies or self.proxies) do | 100 for _, proxy in ipairs(proxies or self.proxies) do |
101 request:tag("streamhost", proxy):up(); | 101 request:tag("streamhost", proxy):up(); |
102 end | 102 end |
103 | 103 |
104 | 104 |
105 self.stream:send_iq(request, function (reply) | 105 self.stream:send_iq(request, function (reply) |
106 if reply.attr.type == "error" then | 106 if reply.attr.type == "error" then |
107 local type, condition, text = reply:get_error(); | 107 local type, condition, text = reply:get_error(); |
108 conn:event("connection-failed", { conn = conn, type = type, condition = condition, text = text }); | 108 conn:event("connection-failed", { conn = conn, type = type, condition = condition, text = text }); |
109 else | 109 else |
121 end | 121 end |
122 end | 122 end |
123 if not (host and port) then | 123 if not (host and port) then |
124 --FIXME: Emit error | 124 --FIXME: Emit error |
125 end | 125 end |
126 | 126 |
127 conn:connect(host, port); | 127 conn:connect(host, port); |
128 | 128 |
129 local function handle_proxy_connected() | 129 local function handle_proxy_connected() |
130 conn:unhook("connected", handle_proxy_connected); | 130 conn:unhook("connected", handle_proxy_connected); |
131 -- Both of us connected, tell proxy to activate connection | 131 -- Both of us connected, tell proxy to activate connection |
156 conn:unhook("connected", suppress_connected); | 156 conn:unhook("connected", suppress_connected); |
157 return true; | 157 return true; |
158 end | 158 end |
159 local function receive_connection_response(data) | 159 local function receive_connection_response(data) |
160 conn:unhook("incoming-raw", receive_connection_response); | 160 conn:unhook("incoming-raw", receive_connection_response); |
161 | 161 |
162 if data:sub(1, 2) ~= "\005\000" then | 162 if data:sub(1, 2) ~= "\005\000" then |
163 return conn:event("error", "connection-failure"); | 163 return conn:event("error", "connection-failure"); |
164 end | 164 end |
165 conn:event("connected"); | 165 conn:event("connected"); |
166 return true; | 166 return true; |