59 session.notopen = true; |
59 session.notopen = true; |
60 |
60 |
61 function session.data(conn, data) |
61 function session.data(conn, data) |
62 local ok, err = parser:parse(data); |
62 local ok, err = parser:parse(data); |
63 if ok then return; end |
63 if ok then return; end |
64 log("debug", "Received invalid XML (%s) %d bytes: %s", tostring(err), #data, data:sub(1, 300):gsub("[\r\n]+", " ")); |
64 log("debug", "Received invalid XML (%s) %d bytes: %s", tostring(err), #data, data:sub(1, 300):gsub("[\r\n]+", " "):gsub("[%z\1-\31]", "_")); |
65 session:close("xml-not-well-formed"); |
65 session:close("xml-not-well-formed"); |
66 end |
66 end |
67 |
67 |
68 return true; |
68 return true; |
69 end |
69 end |
98 session.send(reason); |
98 session.send(reason); |
99 end |
99 end |
100 end |
100 end |
101 end |
101 end |
102 session.send("</stream:stream>"); |
102 session.send("</stream:stream>"); |
103 session.conn.close(); |
103 session.conn:close(); |
104 xmppclient.disconnect(session.conn, (reason and (reason.text or reason.condition)) or reason or "session closed"); |
104 xmppclient.ondisconnect(session.conn, (reason and (reason.text or reason.condition)) or reason or "session closed"); |
105 end |
105 end |
106 end |
106 end |
107 |
107 |
108 |
108 |
109 -- End of session methods -- |
109 -- End of session methods -- |
110 |
110 |
111 function xmppclient.listener(conn, data) |
111 function xmppclient.onincoming(conn, data) |
112 local session = sessions[conn]; |
112 local session = sessions[conn]; |
113 if not session then |
113 if not session then |
114 session = sm_new_session(conn); |
114 session = sm_new_session(conn); |
115 sessions[conn] = session; |
115 sessions[conn] = session; |
116 |
116 |
117 session.log("info", "Client connected"); |
117 session.log("info", "Client connected"); |
118 |
118 |
119 -- Client is using legacy SSL (otherwise mod_tls sets this flag) |
119 -- Client is using legacy SSL (otherwise mod_tls sets this flag) |
120 if conn.ssl() then |
120 if conn:ssl() then |
121 session.secure = true; |
121 session.secure = true; |
122 end |
122 end |
123 |
123 |
124 session.reset_stream = session_reset_stream; |
124 session.reset_stream = session_reset_stream; |
125 session.close = session_close; |
125 session.close = session_close; |
131 if data then |
131 if data then |
132 session.data(conn, data); |
132 session.data(conn, data); |
133 end |
133 end |
134 end |
134 end |
135 |
135 |
136 function xmppclient.disconnect(conn, err) |
136 function xmppclient.ondisconnect(conn, err) |
137 local session = sessions[conn]; |
137 local session = sessions[conn]; |
138 if session then |
138 if session then |
139 (session.log or log)("info", "Client disconnected: %s", err); |
139 (session.log or log)("info", "Client disconnected: %s", err); |
140 sm_destroy_session(session, err); |
140 sm_destroy_session(session, err); |
141 sessions[conn] = nil; |
141 sessions[conn] = nil; |
142 session = nil; |
142 session = nil; |
143 collectgarbage("collect"); |
|
144 end |
143 end |
145 end |
144 end |
146 |
145 |
147 connlisteners_register("xmppclient", xmppclient); |
146 connlisteners_register("xmppclient", xmppclient); |