Software /
code /
prosody
Diff
core/s2smanager.lua @ 1007:c500d4cb7855
core.s2smanager: Buffer data sent before connection
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Mon, 20 Apr 2009 22:14:31 +0100 |
parent | 1006:9166d7a8c3c0 |
child | 1075:831c84cbf5fa |
line wrap: on
line diff
--- a/core/s2smanager.lua Mon Apr 20 22:13:09 2009 +0100 +++ b/core/s2smanager.lua Mon Apr 20 22:14:31 2009 +0100 @@ -141,6 +141,23 @@ attempt_connection(host_session); + if not host_session.sends2s then + -- A sends2s which buffers data (until the stream is opened) + -- note that data in this buffer will be sent before the stream is authed + -- and will not be ack'd in any way, successful or otherwise + local buffer; + function host_session.sends2s(data) + if not buffer then + buffer = {}; + host_session.send_buffer = buffer; + end + log("debug", "Buffering data on unconnected s2sout to %s", to_host); + buffer[#buffer+1] = data; + log("debug", "Buffered item %d: %s", #buffer, tostring(data)); + end + + end + return host_session; end @@ -263,6 +280,20 @@ if not attr.id then error("stream response did not give us a streamid!!!"); end session.streamid = attr.id; + -- Send unauthed buffer + -- (stanzas which are fine to send before dialback) + -- Note that this is *not* the stanza queue (which + -- we can only send if auth succeeds) :) + local send_buffer = session.send_buffer; + if send_buffer and #send_buffer > 0 then + log("debug", "Sending s2s send_buffer now..."); + for i, data in ipairs(send_buffer) do + session.sends2s(tostring(data)); + send_buffer[i] = nil; + end + end + session.send_buffer = nil; + if not session.dialback_verifying then initiate_dialback(session); else