Software /
code /
verse
Changeset
75:f5ac4e39e84f
verse.plugins.session: Only negotiate session when support is advertised by the server, and not marked as optional (saves a round-trip in a lot of cases)
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Sun, 30 May 2010 02:47:19 +0100 |
parents | 74:91e80e9f0259 |
children | 76:927167321283 |
files | plugins/session.lua |
diffstat | 1 files changed, 22 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/plugins/session.lua Sun May 30 02:44:29 2010 +0100 +++ b/plugins/session.lua Sun May 30 02:47:19 2010 +0100 @@ -2,19 +2,28 @@ local xmlns_session = "urn:ietf:params:xml:ns:xmpp-session"; function verse.plugins.session(stream) - local function handle_binding(jid) - stream:debug("Establishing Session..."); - stream:send_iq(st.iq({ type = "set" }):tag("session", {xmlns=xmlns_session}), - function (reply) - if reply.attr.type == "result" then - stream:event("session-success"); - elseif reply.attr.type == "error" then - local err = reply:child_with_name("error"); - local type, condition, text = reply:get_error(); - stream:event("session-failure", { error = condition, text = text, type = type }); - end - end); + + local function handle_features(features) + local session_feature = features:get_child("session", xmlns_session); + if session_feature and not session_feature:get_child("optional") then + local function handle_binding(jid) + stream:debug("Establishing Session..."); + stream:send_iq(st.iq({ type = "set" }):tag("session", {xmlns=xmlns_session}), + function (reply) + if reply.attr.type == "result" then + stream:event("session-success"); + elseif reply.attr.type == "error" then + local err = reply:child_with_name("error"); + local type, condition, text = reply:get_error(); + stream:event("session-failure", { error = condition, text = text, type = type }); + end + end); + return true; + end + stream:hook("binding-success", handle_binding); + end end - stream:hook("binding-success", handle_binding); + stream:hook("stream-features", handle_features); + return true; end