Improve ping timeouts, add debug output for XmlErrors and ping timeouts
This commit is contained in:
parent
cdd4c0b854
commit
fc1a9a5712
|
@ -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();
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue