Software /
code /
verse
Annotate
bosh.lua @ 445:b119dc4d8bc2
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.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Thu, 10 Jun 2021 11:58:23 +0200 |
parent | 411:db462d4feb44 |
child | 490:6b2f31da9610 |
rev | line source |
---|---|
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 | 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 | 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 | 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 | 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 | 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 |