Mercurial > prosody-hg
comparison plugins/mod_bosh.lua @ 4311:d6366294f618
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 | 50e1a3dc2b50 |
| children | 42d7d09fdda0 |
comparison
equal
deleted
inserted
replaced
| 4310:52ccbf71d062 | 4311:d6366294f618 |
|---|---|
| 160 request.reply_before = os_time() + session.bosh_wait; | 160 request.reply_before = os_time() + session.bosh_wait; |
| 161 waiting_requests[request] = true; | 161 waiting_requests[request] = true; |
| 162 end | 162 end |
| 163 end | 163 end |
| 164 | 164 |
| 165 return true; -- Inform httpserver we shall reply later | 165 if session.bosh_terminate then |
| 166 session.log("debug", "Closing session with %d requests open", #session.requests); | |
| 167 session:close(); | |
| 168 return nil; | |
| 169 else | |
| 170 return true; -- Inform httpserver we shall reply later | |
| 171 end | |
| 166 end | 172 end |
| 167 end | 173 end |
| 168 | 174 |
| 169 | 175 |
| 170 local function bosh_reset_stream(session) session.notopen = true; end | 176 local function bosh_reset_stream(session) session.notopen = true; end |
| 200 log("info", "Disconnecting client, <stream:error> is: %s", tostring(close_reply)); | 206 log("info", "Disconnecting client, <stream:error> is: %s", tostring(close_reply)); |
| 201 end | 207 end |
| 202 | 208 |
| 203 local session_close_response = { headers = default_headers, body = tostring(close_reply) }; | 209 local session_close_response = { headers = default_headers, body = tostring(close_reply) }; |
| 204 | 210 |
| 205 --FIXME: Quite sure we shouldn't reply to all requests with the error | |
| 206 for _, held_request in ipairs(session.requests) do | 211 for _, held_request in ipairs(session.requests) do |
| 207 held_request:send(session_close_response); | 212 held_request:send(session_close_response); |
| 208 held_request:destroy(); | 213 held_request:destroy(); |
| 209 end | 214 end |
| 210 sessions[session.sid] = nil; | 215 sessions[session.sid] = nil; |
| 253 end | 258 end |
| 254 --log("debug", "Sending BOSH data: %s", tostring(s)); | 259 --log("debug", "Sending BOSH data: %s", tostring(s)); |
| 255 local oldest_request = r[1]; | 260 local oldest_request = r[1]; |
| 256 if oldest_request then | 261 if oldest_request then |
| 257 log("debug", "We have an open request, so sending on that"); | 262 log("debug", "We have an open request, so sending on that"); |
| 258 response.body = t_concat{"<body xmlns='http://jabber.org/protocol/httpbind' sid='", sid, "' xmlns:stream = 'http://etherx.jabber.org/streams'>", tostring(s), "</body>" }; | 263 response.body = t_concat({ |
| 264 "<body xmlns='http://jabber.org/protocol/httpbind' ", | |
| 265 session.bosh_terminate and "type='terminate' " or "", | |
| 266 "sid='", sid, "' xmlns:stream = 'http://etherx.jabber.org/streams'>", | |
| 267 tostring(s), | |
| 268 "</body>" | |
| 269 }); | |
| 259 oldest_request:send(response); | 270 oldest_request:send(response); |
| 260 --log("debug", "Sent"); | 271 --log("debug", "Sent"); |
| 261 if oldest_request.stayopen then | 272 if oldest_request.stayopen then |
| 262 if #r>1 then | 273 if #r>1 then |
| 263 -- Move front request to back | 274 -- Move front request to back |
| 325 return; | 336 return; |
| 326 end | 337 end |
| 327 session.rid = rid; | 338 session.rid = rid; |
| 328 end | 339 end |
| 329 | 340 |
| 330 if attr.type == "terminate" then | |
| 331 -- Client wants to end this session | |
| 332 session:close(); | |
| 333 request.notopen = nil; | |
| 334 return; | |
| 335 end | |
| 336 | |
| 337 if session.notopen then | 341 if session.notopen then |
| 338 local features = st.stanza("stream:features"); | 342 local features = st.stanza("stream:features"); |
| 339 hosts[session.host].events.fire_event("stream-features", { origin = session, features = features }); | 343 hosts[session.host].events.fire_event("stream-features", { origin = session, features = features }); |
| 340 fire_event("stream-features", session, features); | 344 fire_event("stream-features", session, features); |
| 341 session.send(features); | 345 session.send(features); |
| 342 session.notopen = nil; | 346 session.notopen = nil; |
| 343 end | 347 end |
| 344 | 348 |
| 349 if attr.type == "terminate" then | |
| 350 -- Client wants to end this session, which we'll do | |
| 351 -- after processing any stanzas in this request | |
| 352 session.bosh_terminate = true; | |
| 353 end | |
| 354 | |
| 345 request.notopen = nil; -- Signals that we accept this opening tag | 355 request.notopen = nil; -- Signals that we accept this opening tag |
| 346 t_insert(session.requests, request); | 356 t_insert(session.requests, request); |
| 347 request.sid = sid; | 357 request.sid = sid; |
| 348 end | 358 end |
| 349 | 359 |
