Software / code / verse
Comparison
client.lua @ 137:e4b9d3c5332c
verse.client: Support for SRV record lookups
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Tue, 14 Sep 2010 15:03:55 +0100 |
| parent | 97:ad6006779416 |
| child | 161:b177bcea2006 |
comparison
equal
deleted
inserted
replaced
| 136:3a85c62f544c | 137:e4b9d3c5332c |
|---|---|
| 1 local verse = require "verse"; | 1 local verse = require "verse"; |
| 2 local stream = verse.stream_mt; | 2 local stream = verse.stream_mt; |
| 3 | 3 |
| 4 local jid_split = require "util.jid".split; | 4 local jid_split = require "util.jid".split; |
| 5 local adns = require "net.adns"; | |
| 5 local lxp = require "lxp"; | 6 local lxp = require "lxp"; |
| 6 local st = require "util.stanza"; | 7 local st = require "util.stanza"; |
| 7 | 8 |
| 8 -- Shortcuts to save having to load util.stanza | 9 -- Shortcuts to save having to load util.stanza |
| 9 verse.message, verse.presence, verse.iq, verse.stanza, verse.reply, verse.error_reply = | 10 verse.message, verse.presence, verse.iq, verse.stanza, verse.reply, verse.error_reply = |
| 10 st.message, st.presence, st.iq, st.stanza, st.reply, st.error_reply; | 11 st.message, st.presence, st.iq, st.stanza, st.reply, st.error_reply; |
| 11 | 12 |
| 12 local init_xmlhandlers = require "core.xmlhandlers"; | 13 local init_xmlhandlers = require "core.xmlhandlers"; |
| 13 | 14 |
| 14 local xmlns_stream = "http://etherx.jabber.org/streams"; | 15 local xmlns_stream = "http://etherx.jabber.org/streams"; |
| 16 | |
| 17 local function compare_srv_priorities(a,b) | |
| 18 return a.priority < b.priority or (a.priority == b.priority and a.weight > b.weight); | |
| 19 end | |
| 15 | 20 |
| 16 local stream_callbacks = { | 21 local stream_callbacks = { |
| 17 stream_ns = xmlns_stream, | 22 stream_ns = xmlns_stream, |
| 18 stream_tag = "stream", | 23 stream_tag = "stream", |
| 19 default_ns = "jabber:client" }; | 24 default_ns = "jabber:client" }; |
| 114 self:send("</stream:stream>"); | 119 self:send("</stream:stream>"); |
| 115 end | 120 end |
| 116 return _base_close(self); | 121 return _base_close(self); |
| 117 end | 122 end |
| 118 | 123 |
| 119 -- Initialise connection | 124 local function start_connect() |
| 120 self:connect(self.connect_host or self.host, self.connect_port or 5222); | 125 -- Initialise connection |
| 121 self:reopen(); | 126 self:connect(self.connect_host or self.host, self.connect_port or 5222); |
| 127 self:reopen(); | |
| 128 end | |
| 129 | |
| 130 if not (self.connect_host or self.connect_port) then | |
| 131 -- Look up SRV records | |
| 132 adns.lookup(function (answer) | |
| 133 if answer then | |
| 134 local srv_hosts = {}; | |
| 135 self.srv_hosts = srv_hosts; | |
| 136 for _, record in ipairs(answer) do | |
| 137 table.insert(srv_hosts, record.srv); | |
| 138 end | |
| 139 table.sort(srv_hosts, compare_srv_priorities); | |
| 140 | |
| 141 local srv_choice = srv_hosts[1]; | |
| 142 self.srv_choice = 1; | |
| 143 if srv_choice then | |
| 144 self.connect_host, self.connect_port = srv_choice.target, srv_choice.port; | |
| 145 self:debug("Best record found, will connect to %s:%d", self.connect_host or self.host, self.connect_port or 5222); | |
| 146 end | |
| 147 | |
| 148 self:hook("disconnected", function () | |
| 149 if self.srv_hosts and self.srv_choice < #self.srv_hosts then | |
| 150 self.srv_choice = self.srv_choice + 1; | |
| 151 local srv_choice = srv_hosts[self.srv_choice]; | |
| 152 self.connect_host, self.connect_port = srv_choice.target, srv_choice.port; | |
| 153 start_connect(); | |
| 154 return true; | |
| 155 end | |
| 156 end, 1000); | |
| 157 | |
| 158 self:hook("connected", function () | |
| 159 self.srv_hosts = nil; | |
| 160 end, 1000); | |
| 161 end | |
| 162 start_connect(); | |
| 163 end, "_xmpp-client._tcp."..(self.host)..".", "SRV"); | |
| 164 else | |
| 165 start_connect(); | |
| 166 end | |
| 122 end | 167 end |
| 123 | 168 |
| 124 function stream:reopen() | 169 function stream:reopen() |
| 125 self:reset(); | 170 self:reset(); |
| 126 self:send(st.stanza("stream:stream", { to = self.host, ["xmlns:stream"]='http://etherx.jabber.org/streams', | 171 self:send(st.stanza("stream:stream", { to = self.host, ["xmlns:stream"]='http://etherx.jabber.org/streams', |