bosh.lua

Thu, 10 Jun 2021 11:58:23 +0200

author
Kim Alvefur <zash@zash.se>
date
Thu, 10 Jun 2021 11:58:23 +0200
changeset 445
b119dc4d8bc2
parent 411
db462d4feb44
child 490
6b2f31da9610
permissions
-rw-r--r--

plugins.smacks: Don't warn about zero stanzas acked

It's only if the count somehow goes backwards that something is really
wrong. An ack for zero stanzas is fine and we don't need to do anything.

87
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1
161
b177bcea2006 squishy, verse.client, verse.component, verse.bosh: Port to util.xmppstream instead of xmlhandlers which has been removed from Prosody. Also remove util.ztact from squishy for the same reason.
Matthew Wild <mwild1@gmail.com>
parents: 93
diff changeset
2 local new_xmpp_stream = require "util.xmppstream".new;
87
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local st = require "util.stanza";
89
1752a9097e6b verse.bosh: Update to use net.http instead of verse.plugins.http
Matthew Wild <mwild1@gmail.com>
parents: 87
diff changeset
4 require "net.httpclient_listener"; -- Required for net.http to work
1752a9097e6b verse.bosh: Update to use net.http instead of verse.plugins.http
Matthew Wild <mwild1@gmail.com>
parents: 87
diff changeset
5 local http = require "net.http";
87
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 local stream_mt = setmetatable({}, { __index = verse.stream_mt });
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 stream_mt.__index = stream_mt;
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 local xmlns_stream = "http://etherx.jabber.org/streams";
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 local xmlns_bosh = "http://jabber.org/protocol/httpbind";
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12
93
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
13 local reconnect_timeout = 5;
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
14
87
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 function verse.new_bosh(logger, url)
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 local stream = {
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 bosh_conn_pool = {};
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 bosh_waiting_requests = {};
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 bosh_rid = math.random(1,999999);
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 bosh_outgoing_buffer = {};
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 bosh_url = url;
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 conn = {};
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 };
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 function stream:reopen()
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 self.bosh_need_restart = true;
93
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
26 self:flush();
87
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 end
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 local conn = verse.new(logger, stream);
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 return setmetatable(conn, stream_mt);
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 end
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 function stream_mt:connect()
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 self:_send_session_request();
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 end
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 function stream_mt:send(data)
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 self:debug("Putting into BOSH send buffer: %s", tostring(data));
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 self.bosh_outgoing_buffer[#self.bosh_outgoing_buffer+1] = st.clone(data);
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 self:flush(); --TODO: Optimize by doing this on next tick (give a chance for data to buffer)
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 end
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41
93
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
42 function stream_mt:flush()
87
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 if self.connected
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 and #self.bosh_waiting_requests < self.bosh_max_requests
93
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
45 and (#self.bosh_waiting_requests == 0
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
46 or #self.bosh_outgoing_buffer > 0
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
47 or self.bosh_need_restart) then
87
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 self:debug("Flushing...");
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 local payload = self:_make_body();
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 local buffer = self.bosh_outgoing_buffer;
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 for i, stanza in ipairs(buffer) do
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 payload:add_child(stanza);
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 buffer[i] = nil;
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 end
93
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
55 self:_make_request(payload);
87
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 else
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 self:debug("Decided not to flush.");
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 end
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 end
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60
93
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
61 function stream_mt:_make_request(payload)
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
62 local request, err = http.request(self.bosh_url, { body = tostring(payload) }, function (response, code, request)
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
63 if code ~= 0 then
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
64 self.inactive_since = nil;
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
65 return self:_handle_response(response, code, request);
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
66 end
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 262
diff changeset
67
93
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
68 -- Connection issues, we need to retry this request
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
69 local time = os.time();
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
70 if not self.inactive_since then
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
71 self.inactive_since = time; -- So we know when it is time to give up
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
72 elseif time - self.inactive_since > self.bosh_max_inactivity then
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
73 return self:_disconnected();
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
74 else
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 262
diff changeset
75 self:debug("%d seconds left to reconnect, retrying in %d seconds...",
93
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
76 self.bosh_max_inactivity - (time - self.inactive_since), reconnect_timeout);
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
77 end
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 262
diff changeset
78
93
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
79 -- Set up reconnect timer
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
80 timer.add_task(reconnect_timeout, function ()
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
81 self:debug("Retrying request...");
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
82 -- Remove old request
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
83 for i, waiting_request in ipairs(self.bosh_waiting_requests) do
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
84 if waiting_request == request then
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
85 table.remove(self.bosh_waiting_requests, i);
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
86 break;
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
87 end
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
88 end
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
89 self:_make_request(payload);
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
90 end);
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
91 end);
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
92 if request then
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
93 table.insert(self.bosh_waiting_requests, request);
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
94 else
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
95 self:warn("Request failed instantly: %s", err);
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
96 end
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
97 end
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
98
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
99 function stream_mt:_disconnected()
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
100 self.connected = nil;
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
101 self:event("disconnected");
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
102 end
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
103
87
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 function stream_mt:_send_session_request()
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 local body = self:_make_body();
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 262
diff changeset
106
87
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 -- XEP-0124
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 body.attr.hold = "1";
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109 body.attr.wait = "60";
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 body.attr["xml:lang"] = "en";
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 body.attr.ver = "1.6";
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 -- XEP-0206
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 body.attr.from = self.jid;
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 body.attr.to = self.host;
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 body.attr.secure = 'true';
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 262
diff changeset
117
93
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
118 http.request(self.bosh_url, { body = tostring(body) }, function (response, code)
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
119 if code == 0 then
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
120 -- Failed to connect
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
121 return self:_disconnected();
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
122 end
87
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 -- Handle session creation response
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 local payload = self:_parse_response(response)
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 if not payload then
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 self:warn("Invalid session creation response");
93
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
127 self:_disconnected();
87
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128 return;
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129 end
93
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
130 self.bosh_sid = payload.attr.sid; -- Session id
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
131 self.bosh_wait = tonumber(payload.attr.wait); -- How long the server may hold connections for
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
132 self.bosh_hold = tonumber(payload.attr.hold); -- How many connections the server may hold
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
133 self.bosh_max_inactivity = tonumber(payload.attr.inactivity); -- Max amount of time with no connections
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
134 self.bosh_max_requests = tonumber(payload.attr.requests) or self.bosh_hold; -- Max simultaneous requests we can make
87
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135 self.connected = true;
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136 self:event("connected");
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137 self:_handle_response_payload(payload);
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
138 end);
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
139 end
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
140
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
141 function stream_mt:_handle_response(response, code, request)
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142 if self.bosh_waiting_requests[1] ~= request then
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
143 self:warn("Server replied to request that wasn't the oldest");
93
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
144 for i, waiting_request in ipairs(self.bosh_waiting_requests) do
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
145 if waiting_request == request then
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
146 self.bosh_waiting_requests[i] = nil;
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
147 break;
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
148 end
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
149 end
87
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 else
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151 table.remove(self.bosh_waiting_requests, 1);
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
152 end
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
153 local payload = self:_parse_response(response);
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
154 if payload then
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
155 self:_handle_response_payload(payload);
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
156 end
93
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
157 self:flush();
87
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
158 end
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
160 function stream_mt:_handle_response_payload(payload)
261
c1404c69dec9 verse.bosh: Fix to loop over every child tag (childtags() is now too namespace-aware for this purpose)
Matthew Wild <mwild1@gmail.com>
parents: 161
diff changeset
161 local stanzas = payload.tags;
c1404c69dec9 verse.bosh: Fix to loop over every child tag (childtags() is now too namespace-aware for this purpose)
Matthew Wild <mwild1@gmail.com>
parents: 161
diff changeset
162 for i = 1, #stanzas do
c1404c69dec9 verse.bosh: Fix to loop over every child tag (childtags() is now too namespace-aware for this purpose)
Matthew Wild <mwild1@gmail.com>
parents: 161
diff changeset
163 local stanza = stanzas[i];
87
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
164 if stanza.attr.xmlns == xmlns_stream then
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165 self:event("stream-"..stanza.name, stanza);
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166 elseif stanza.attr.xmlns then
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
167 self:event("stream/"..stanza.attr.xmlns, stanza);
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
168 else
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169 self:event("stanza", stanza);
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
170 end
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
171 end
93
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
172 if payload.attr.type == "terminate" then
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
173 self:_disconnected({reason = payload.attr.condition});
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
174 end
87
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
175 end
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
177 local stream_callbacks = {
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
178 stream_ns = "http://jabber.org/protocol/httpbind", stream_tag = "body",
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
179 default_ns = "jabber:client",
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
180 streamopened = function (session, attr) session.notopen = nil; session.payload = verse.stanza("body", attr); return true; end;
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
181 handlestanza = function (session, stanza) session.payload:add_child(stanza); end;
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
182 };
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
183 function stream_mt:_parse_response(response)
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
184 self:debug("Parsing response: %s", response);
93
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
185 if response == nil then
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
186 self:debug("%s", debug.traceback());
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
187 self:_disconnected();
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
188 return;
2442e751f3cb verse.bosh: Implemented retry/reconnect logic, and handling of disconnects (either CM-intiated or due to connection failures)
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
189 end
262
f47afb171e6e verse.bosh: Minor change to pass Verse stream to stream callbacks (though it isn't currently used by them)
Matthew Wild <mwild1@gmail.com>
parents: 261
diff changeset
190 local session = { notopen = true, stream = self };
161
b177bcea2006 squishy, verse.client, verse.component, verse.bosh: Port to util.xmppstream instead of xmlhandlers which has been removed from Prosody. Also remove util.ztact from squishy for the same reason.
Matthew Wild <mwild1@gmail.com>
parents: 93
diff changeset
191 local stream = new_xmpp_stream(session, stream_callbacks);
b177bcea2006 squishy, verse.client, verse.component, verse.bosh: Port to util.xmppstream instead of xmlhandlers which has been removed from Prosody. Also remove util.ztact from squishy for the same reason.
Matthew Wild <mwild1@gmail.com>
parents: 93
diff changeset
192 stream:feed(response);
87
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
193 return session.payload;
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
194 end
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
195
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
196 function stream_mt:_make_body()
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
197 self.bosh_rid = self.bosh_rid + 1;
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
198 local body = verse.stanza("body", {
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
199 xmlns = xmlns_bosh;
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
200 content = "text/xml; charset=utf-8";
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
201 sid = self.bosh_sid;
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
202 rid = self.bosh_rid;
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
203 });
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
204 if self.bosh_need_restart then
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
205 self.bosh_need_restart = nil;
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
206 body.attr.restart = 'true';
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
207 end
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
208 return body;
d59073722924 verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
209 end

mercurial