Software /
code /
prosody
Changeset
4223:9fb6e8ec15ed
mod_bosh: Fix terminate logic - process any stanzas in a terminating request, and add type='terminate' to any responses generated by those stanzas. Finally, close all remaining open requests with type='terminate' and close the session. Fixes #211 (thanks Maranda + waqas).
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Fri, 04 Mar 2011 20:27:57 +0000 |
parents | 4222:2805ebd57d7d |
children | 4225:f8dc8b9e0bdd |
files | plugins/mod_bosh.lua |
diffstat | 1 files changed, 20 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/plugins/mod_bosh.lua Wed Mar 02 05:15:54 2011 +0500 +++ b/plugins/mod_bosh.lua Fri Mar 04 20:27:57 2011 +0000 @@ -162,7 +162,13 @@ end end - return true; -- Inform httpserver we shall reply later + if session.bosh_terminate then + session.log("debug", "Closing session with %d requests open", #session.requests); + session:close(); + return nil; + else + return true; -- Inform httpserver we shall reply later + end end end @@ -202,7 +208,6 @@ local session_close_response = { headers = default_headers, body = tostring(close_reply) }; - --FIXME: Quite sure we shouldn't reply to all requests with the error for _, held_request in ipairs(session.requests) do held_request:send(session_close_response); held_request:destroy(); @@ -255,7 +260,13 @@ local oldest_request = r[1]; if oldest_request then log("debug", "We have an open request, so sending on that"); - response.body = t_concat{"<body xmlns='http://jabber.org/protocol/httpbind' sid='", sid, "' xmlns:stream = 'http://etherx.jabber.org/streams'>", tostring(s), "</body>" }; + response.body = t_concat({ + "<body xmlns='http://jabber.org/protocol/httpbind' ", + session.bosh_terminate and "type='terminate' " or "", + "sid='", sid, "' xmlns:stream = 'http://etherx.jabber.org/streams'>", + tostring(s), + "</body>" + }); oldest_request:send(response); --log("debug", "Sent"); if oldest_request.stayopen then @@ -327,13 +338,6 @@ session.rid = rid; end - if attr.type == "terminate" then - -- Client wants to end this session - session:close(); - request.notopen = nil; - return; - end - if session.notopen then local features = st.stanza("stream:features"); hosts[session.host].events.fire_event("stream-features", { origin = session, features = features }); @@ -342,6 +346,12 @@ session.notopen = nil; end + if attr.type == "terminate" then + -- Client wants to end this session, which we'll do + -- after processing any stanzas in this request + session.bosh_terminate = true; + end + request.notopen = nil; -- Signals that we accept this opening tag t_insert(session.requests, request); request.sid = sid;