Fri, 06 Aug 2010 17:07:56 +0100
verse.bosh: Update to use net.http instead of verse.plugins.http
87
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 | |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 | local init_xmlhandlers = require "core.xmlhandlers"; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 | local st = require "util.stanza"; |
89
1752a9097e6b
verse.bosh: Update to use net.http instead of verse.plugins.http
Matthew Wild <mwild1@gmail.com>
parents:
87
diff
changeset
|
4 | require "net.httpclient_listener"; -- Required for net.http to work |
1752a9097e6b
verse.bosh: Update to use net.http instead of verse.plugins.http
Matthew Wild <mwild1@gmail.com>
parents:
87
diff
changeset
|
5 | local http = require "net.http"; |
87
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 | |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 | local stream_mt = setmetatable({}, { __index = verse.stream_mt }); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 | stream_mt.__index = stream_mt; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 | |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 | local xmlns_stream = "http://etherx.jabber.org/streams"; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 | local xmlns_bosh = "http://jabber.org/protocol/httpbind"; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 | |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 | function verse.new_bosh(logger, url) |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 | local stream = { |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 | bosh_conn_pool = {}; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 | bosh_waiting_requests = {}; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 | bosh_rid = math.random(1,999999); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 | bosh_outgoing_buffer = {}; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 | bosh_url = url; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 | conn = {}; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 | }; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 | function stream:reopen() |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 | self.bosh_need_restart = true; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 | self:flush(true); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 | end |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 | function stream.bosh_response_handler(response, code, request) |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 | return stream:_handle_response(response, code, request); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 | end |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 | local conn = verse.new(logger, stream); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 | return setmetatable(conn, stream_mt); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 | end |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 | |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 | function stream_mt:connect() |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 | self:_send_session_request(); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 | end |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 | |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 | function stream_mt:send(data) |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 | self:debug("Putting into BOSH send buffer: %s", tostring(data)); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 | self.bosh_outgoing_buffer[#self.bosh_outgoing_buffer+1] = st.clone(data); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 | self:flush(); --TODO: Optimize by doing this on next tick (give a chance for data to buffer) |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 | end |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 | |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 | function stream_mt:flush(force) |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 | if self.connected |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 | and #self.bosh_waiting_requests < self.bosh_max_requests |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 | and (force or #self.bosh_outgoing_buffer > 0) then |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 | self:debug("Flushing..."); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 | local payload = self:_make_body(); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 | local buffer = self.bosh_outgoing_buffer; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 | for i, stanza in ipairs(buffer) do |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 | payload:add_child(stanza); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 | buffer[i] = nil; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 | end |
89
1752a9097e6b
verse.bosh: Update to use net.http instead of verse.plugins.http
Matthew Wild <mwild1@gmail.com>
parents:
87
diff
changeset
|
54 | local request = http.request(self.bosh_url, { body = tostring(payload) }, self.bosh_response_handler); |
87
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 | table.insert(self.bosh_waiting_requests, request); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 | else |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
57 | self:debug("Decided not to flush."); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 | end |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 | end |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 | |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 | function stream_mt:_send_session_request() |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 | local body = self:_make_body(); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 | |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 | -- XEP-0124 |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 | body.attr.hold = "1"; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 | body.attr.wait = "60"; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 | body.attr["xml:lang"] = "en"; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 | body.attr.ver = "1.6"; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 | |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 | -- XEP-0206 |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 | body.attr.from = self.jid; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 | body.attr.to = self.host; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 | body.attr.secure = 'true'; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
74 | |
89
1752a9097e6b
verse.bosh: Update to use net.http instead of verse.plugins.http
Matthew Wild <mwild1@gmail.com>
parents:
87
diff
changeset
|
75 | http.request(self.bosh_url, { body = tostring(body) }, function (response) |
87
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 | -- Handle session creation response |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
77 | local payload = self:_parse_response(response) |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
78 | if not payload then |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
79 | self:warn("Invalid session creation response"); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 | self:event("disconnected"); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 | return; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
82 | end |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 | self.bosh_sid = payload.attr.sid; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 | self.bosh_wait = tonumber(payload.attr.wait); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 | self.bosh_hold = tonumber(payload.attr.hold); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
86 | self.bosh_max_requests = tonumber(payload.attr.requests) or self.bosh_hold; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 | self.connected = true; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
88 | self:event("connected"); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
89 | self:_handle_response_payload(payload); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
90 | end); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 | end |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 | |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 | function stream_mt:_handle_response(response, code, request) |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 | if self.bosh_waiting_requests[1] ~= request then |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
95 | self:warn("Server replied to request that wasn't the oldest"); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
96 | else |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
97 | table.remove(self.bosh_waiting_requests, 1); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
98 | end |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
99 | local payload = self:_parse_response(response); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
100 | if payload then |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
101 | self:_handle_response_payload(payload); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 | end |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
103 | if #self.bosh_waiting_requests == 0 then |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
104 | self:debug("We have no requests open, so forcing flush..."); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 | self:flush(true); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 | else |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
107 | self:debug("We have %d requests open, so no need to force a flush", #self.bosh_waiting_requests); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
108 | end |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
109 | end |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
110 | |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
111 | function stream_mt:_handle_response_payload(payload) |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
112 | for stanza in payload:childtags() do |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
113 | if stanza.attr.xmlns == xmlns_stream then |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
114 | self:event("stream-"..stanza.name, stanza); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
115 | elseif stanza.attr.xmlns then |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
116 | self:event("stream/"..stanza.attr.xmlns, stanza); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
117 | else |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
118 | self:event("stanza", stanza); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
119 | end |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
120 | end |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
121 | end |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
122 | |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
123 | local stream_callbacks = { |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
124 | stream_ns = "http://jabber.org/protocol/httpbind", stream_tag = "body", |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
125 | default_ns = "jabber:client", |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
126 | streamopened = function (session, attr) session.notopen = nil; session.payload = verse.stanza("body", attr); return true; end; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
127 | handlestanza = function (session, stanza) session.payload:add_child(stanza); end; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
128 | }; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
129 | function stream_mt:_parse_response(response) |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
130 | self:debug("Parsing response: %s", response); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
131 | local session = { notopen = true, log = self.log }; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
132 | local parser = lxp.new(init_xmlhandlers(session, stream_callbacks), "\1"); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
133 | parser:parse(response); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
134 | return session.payload; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
135 | end |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
136 | |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
137 | function stream_mt:_make_body() |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
138 | self.bosh_rid = self.bosh_rid + 1; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
139 | local body = verse.stanza("body", { |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
140 | xmlns = xmlns_bosh; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
141 | content = "text/xml; charset=utf-8"; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
142 | sid = self.bosh_sid; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
143 | rid = self.bosh_rid; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
144 | }); |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
145 | if self.bosh_need_restart then |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
146 | self.bosh_need_restart = nil; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
147 | body.attr.restart = 'true'; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
148 | end |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
149 | return body; |
d59073722924
verse.bosh: Use verse.new_bosh(logger, url) to make a BOSH connection
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
150 | end |