From fc1a9a5712b1f46bcd2390e798147f3855042b96 Mon Sep 17 00:00:00 2001 From: fiaxh Date: Sun, 30 Dec 2018 13:35:01 +0100 Subject: [PATCH] Improve ping timeouts, add debug output for XmlErrors and ping timeouts --- libdino/src/service/connection_manager.vala | 6 ++- libdino/src/service/file_manager.vala | 2 +- xmpp-vala/src/core/stanza_reader.vala | 59 ++++++++++++--------- 3 files changed, 39 insertions(+), 28 deletions(-) diff --git a/libdino/src/service/connection_manager.vala b/libdino/src/service/connection_manager.vala index 67763ad3..977fc732 100644 --- a/libdino/src/service/connection_manager.vala +++ b/libdino/src/service/connection_manager.vala @@ -232,6 +232,7 @@ public class ConnectionManager : Object { private void check_reconnect(Account account) { bool acked = false; + DateTime? last_activity_was = connections[account].last_activity != null ? connections[account].last_activity : null; XmppStream stream = connections[account].stream; stream.get_module(Xep.Ping.Module.IDENTITY).send_ping(stream, account.bare_jid.domain_jid, () => { @@ -240,10 +241,13 @@ public class ConnectionManager : Object { change_connection_state(account, ConnectionState.CONNECTED); }); - Timeout.add_seconds(5, () => { + Timeout.add_seconds(10, () => { if (connections[account].stream != stream) return false; if (acked) return false; + if (connections[account].last_activity != last_activity_was) return false; + // Reconnect. Nothing gets through the stream. + print(@"[$(account.bare_jid)] Ping timeouted. Reconnecting\n"); change_connection_state(account, ConnectionState.DISCONNECTED); try { connections[account].stream.disconnect(); diff --git a/libdino/src/service/file_manager.vala b/libdino/src/service/file_manager.vala index 861c51da..241bcebf 100644 --- a/libdino/src/service/file_manager.vala +++ b/libdino/src/service/file_manager.vala @@ -144,7 +144,7 @@ public class FileManager : StreamInteractionModule, Object { if (!is_sender_trustworthy(file_transfer, conversation)) return; if (file_transfer.size == -1) { - file_provider.get_meta_info(file_transfer); + yield file_provider.get_meta_info(file_transfer); } if (file_transfer.size >= 0 && file_transfer.size < 5000000) { diff --git a/xmpp-vala/src/core/stanza_reader.vala b/xmpp-vala/src/core/stanza_reader.vala index b8cb1f4c..43c453ff 100644 --- a/xmpp-vala/src/core/stanza_reader.vala +++ b/xmpp-vala/src/core/stanza_reader.vala @@ -223,38 +223,45 @@ public class StanzaReader { } public async StanzaNode read_stanza_node() throws XmlError { - ns_state = ns_state.push(); - var res = yield read_node_start(); - if (res.has_nodes) { - bool finishNodeSeen = false; - do { - yield skip_until_non_ws(); - if ((yield peek_single()) == '<') { - skip_single(); - if ((yield peek_single()) == '/') { + try { + ns_state = ns_state.push(); + var res = yield read_node_start(); + if (res.has_nodes) { + bool finish_node_seen = false; + do { + yield skip_until_non_ws(); + if ((yield peek_single()) == '<') { skip_single(); - string desc = yield read_until_char('>'); - skip_single(); - if (desc.contains(":")) { - var split = desc.split(":"); - if (split[0] != ns_state.find_name((!)res.ns_uri)) throw new XmlError.BAD_XML(""); - if (split[1] != res.name) throw new XmlError.BAD_XML(""); + if ((yield peek_single()) == '/') { + skip_single(); + string desc = yield read_until_char('>'); + skip_single(); + if (desc.contains(":")) { + var split = desc.split(":"); + if (split[0] != ns_state.find_name((!)res.ns_uri)) throw new XmlError.BAD_XML(""); + if (split[1] != res.name) throw new XmlError.BAD_XML(""); + } else { + if (ns_state.current_ns_uri != res.ns_uri) throw new XmlError.BAD_XML(""); + if (desc != res.name) throw new XmlError.BAD_XML(""); + } + finish_node_seen = true; } else { - if (ns_state.current_ns_uri != res.ns_uri) throw new XmlError.BAD_XML(""); - if (desc != res.name) throw new XmlError.BAD_XML(""); + res.sub_nodes.add(yield read_stanza_node()); } - finishNodeSeen = true; } else { - res.sub_nodes.add(yield read_stanza_node()); + res.sub_nodes.add(yield read_text_node()); } - } else { - res.sub_nodes.add(yield read_text_node()); - } - } while (!finishNodeSeen); - if (res.sub_nodes.size == 0) res.has_nodes = false; + } while (!finish_node_seen); + if (res.sub_nodes.size == 0) res.has_nodes = false; + } + ns_state = ns_state.pop(); + return res; + } catch (XmlError e) { + uint8[] buffer_cpy = buffer.copy(); + buffer_cpy += '\0'; + warning("XmlError at: %s".printf((string)buffer_cpy) + "\n"); + throw e; } - ns_state = ns_state.pop(); - return res; } public async StanzaNode read_node() throws XmlError {