Software /
code /
prosody-modules
Comparison
mod_websocket/mod_websocket.lua @ 857:1393af36ec9c
mod_websocket: Determine whether to use a self-closing stream tag, based on the client's initial data
author | Florian Zeitz <florob@babelmonkeys.de> |
---|---|
date | Thu, 08 Nov 2012 01:55:00 +0100 |
parent | 856:7eb54ed58856 |
child | 895:1f4d77104da5 |
comparison
equal
deleted
inserted
replaced
856:7eb54ed58856 | 857:1393af36ec9c |
---|---|
29 local log = module._log; | 29 local log = module._log; |
30 | 30 |
31 local c2s_timeout = module:get_option_number("c2s_timeout"); | 31 local c2s_timeout = module:get_option_number("c2s_timeout"); |
32 local stream_close_timeout = module:get_option_number("c2s_close_timeout", 5); | 32 local stream_close_timeout = module:get_option_number("c2s_close_timeout", 5); |
33 local opt_keepalives = module:get_option_boolean("tcp_keepalives", false); | 33 local opt_keepalives = module:get_option_boolean("tcp_keepalives", false); |
34 local self_closing_stream = module:get_option_boolean("websocket_self_closing_stream", true); | |
35 | 34 |
36 local cross_domain = module:get_option("cross_domain_websocket"); | 35 local cross_domain = module:get_option("cross_domain_websocket"); |
37 if cross_domain then | 36 if cross_domain then |
38 if cross_domain == true then | 37 if cross_domain == true then |
39 cross_domain = "*"; | 38 cross_domain = "*"; |
152 -- We don't serve this host... | 151 -- We don't serve this host... |
153 session:close{ condition = "host-unknown", text = "This server does not serve "..tostring(session.host)}; | 152 session:close{ condition = "host-unknown", text = "This server does not serve "..tostring(session.host)}; |
154 return; | 153 return; |
155 end | 154 end |
156 | 155 |
157 -- COMPAT: Current client implementations need this to be self-closing | 156 -- COMPAT: Some current client implementations need this to be self-closing |
158 if self_closing_stream then | 157 if session.self_closing_stream then |
159 send("<?xml version='1.0'?>"..tostring(st.stanza("stream:stream", { | 158 send("<?xml version='1.0'?>"..tostring(st.stanza("stream:stream", { |
160 xmlns = 'jabber:client', ["xmlns:stream"] = 'http://etherx.jabber.org/streams'; | 159 xmlns = 'jabber:client', ["xmlns:stream"] = 'http://etherx.jabber.org/streams'; |
161 id = session.streamid, from = session.host, version = '1.0', ["xml:lang"] = 'en' }))); | 160 id = session.streamid, from = session.host, version = '1.0', ["xml:lang"] = 'en' }))); |
162 else | 161 else |
163 send("<?xml version='1.0'?>"..st.stanza("stream:stream", { | 162 send("<?xml version='1.0'?>"..st.stanza("stream:stream", { |
224 --- Session methods | 223 --- Session methods |
225 local function session_close(session, reason) | 224 local function session_close(session, reason) |
226 local log = session.log or log; | 225 local log = session.log or log; |
227 if session.conn then | 226 if session.conn then |
228 if session.notopen then | 227 if session.notopen then |
229 -- COMPAT: Current client implementations need this to be self-closing | 228 -- COMPAT: Some current client implementations need this to be self-closing |
230 if self_closing_stream then | 229 if session.self_closing_stream then |
231 session.send("<?xml version='1.0'?>"..tostring(st.stanza("stream:stream", default_stream_attr))); | 230 session.send("<?xml version='1.0'?>"..tostring(st.stanza("stream:stream", default_stream_attr))); |
232 else | 231 else |
233 session.send("<?xml version='1.0'?>"..st.stanza("stream:stream", default_stream_attr):top_tag()); | 232 session.send("<?xml version='1.0'?>"..st.stanza("stream:stream", default_stream_attr):top_tag()); |
234 end | 233 end |
235 end | 234 end |
381 | 380 |
382 if frame.FIN then | 381 if frame.FIN then |
383 data = dataBuffer; | 382 data = dataBuffer; |
384 dataBuffer = nil; | 383 dataBuffer = nil; |
385 | 384 |
386 -- COMPAT: Current client implementations send a self-closing <stream:stream> | 385 -- COMPAT: Some current client implementations send a self-closing <stream:stream> |
387 if self_closing_stream then | 386 data, session.self_closing_stream = data:gsub("^(<stream:stream.*)/>$", "%1>"); |
388 data = data:gsub("(<stream:stream.*)/>$", "%1>"); | 387 session.self_closing_stream = (session.self_closing_stream == 1) |
389 end | |
390 | 388 |
391 data = filter("bytes/in", data); | 389 data = filter("bytes/in", data); |
392 if data then | 390 if data then |
393 local ok, err = stream:feed(data); | 391 local ok, err = stream:feed(data); |
394 if ok then return; end | 392 if ok then return; end |