diff --git a/src/main/java/eu/siacs/conversations/utils/Resolver.java b/src/main/java/eu/siacs/conversations/utils/Resolver.java index d35a7ae2f..8014b8366 100644 --- a/src/main/java/eu/siacs/conversations/utils/Resolver.java +++ b/src/main/java/eu/siacs/conversations/utils/Resolver.java @@ -172,6 +172,9 @@ public class Resolver { ResolverResult result = resolveWithFallback(dnsName, SRV.class); final List results = new ArrayList<>(); final List threads = new ArrayList<>(); + + final List fallbackResults = new ArrayList<>(); + final List fallbackThreads = new ArrayList<>(); for (SRV record : result.getAnswersOrEmptySet()) { if (record.name.length() == 0) { continue; @@ -188,6 +191,12 @@ public class Resolver { results.addAll(ipv4s); } })); + fallbackThreads.add(new Thread(() -> { + final List cnames = resolveIp(record, CNAME.class, result.isAuthenticData(), directTls); + synchronized (fallbackResults) { + fallbackResults.addAll(cnames); + } + })); } for (Thread thread : threads) { thread.start(); @@ -199,7 +208,21 @@ public class Resolver { return Collections.emptyList(); } } - return results; + if (results.size() > 0) { + return results; + } + + for (Thread thread : fallbackThreads) { + thread.start(); + } + for (Thread thread : fallbackThreads) { + try { + thread.join(); + } catch (InterruptedException e) { + return Collections.emptyList(); + } + } + return fallbackResults; } private static List resolveIp(SRV srv, Class type, boolean authenticated, boolean directTls) {