From cbdb4136136726d572b8bc521fc910f4dc31f00f Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Thu, 12 May 2016 21:39:47 +0200 Subject: prefer IPv4 DNS servers some devices might have problems contacting the IPv6 DNS server while in sleep mode --- .../java/eu/siacs/conversations/utils/DNSHelper.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'src/main/java/eu/siacs/conversations/utils/DNSHelper.java') diff --git a/src/main/java/eu/siacs/conversations/utils/DNSHelper.java b/src/main/java/eu/siacs/conversations/utils/DNSHelper.java index 306d50c2..b96d3c25 100644 --- a/src/main/java/eu/siacs/conversations/utils/DNSHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/DNSHelper.java @@ -12,6 +12,7 @@ import android.os.Parcelable; import android.util.Log; import java.io.IOException; +import java.net.Inet4Address; import java.net.InetAddress; import java.net.SocketTimeoutException; import java.net.UnknownHostException; @@ -77,9 +78,9 @@ public class DNSHelper { LinkProperties linkProperties = connectivityManager.getLinkProperties(networks[i]); if (linkProperties != null) { if (hasDefaultRoute(linkProperties)) { - servers.addAll(0, linkProperties.getDnsServers()); + servers.addAll(0, getIPv4First(linkProperties.getDnsServers())); } else { - servers.addAll(linkProperties.getDnsServers()); + servers.addAll(getIPv4First(linkProperties.getDnsServers())); } } } @@ -89,6 +90,18 @@ public class DNSHelper { return servers.size() > 0 ? servers : getDnsServersPreLollipop(); } + private static List getIPv4First(List in) { + List out = new ArrayList<>(); + for(InetAddress addr : in) { + if (addr instanceof Inet4Address) { + out.add(0, addr); + } else { + out.add(addr); + } + } + return out; + } + @TargetApi(Build.VERSION_CODES.LOLLIPOP) private static boolean hasDefaultRoute(LinkProperties linkProperties) { for(RouteInfo route: linkProperties.getRoutes()) { @@ -155,7 +168,7 @@ public class DNSHelper { public static Bundle queryDNS(String host, InetAddress dnsServer) { Bundle bundle = new Bundle(); try { - client.setTimeout(Config.PING_TIMEOUT * 1000); + client.setTimeout(Config.SOCKET_TIMEOUT * 1000); final String qname = "_xmpp-client._tcp." + host; final String tlsQname = "_xmpps-client._tcp." + host; Log.d(Config.LOGTAG, "using dns server: " + dnsServer.getHostAddress() + " to look up " + host); -- cgit v1.2.3 From 2014f388b1f5eef66c8f787dc6889b03ae461d08 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Thu, 12 May 2016 21:54:42 +0200 Subject: interrupt XMPPConnection Thread in some cases the the DNS query might take too long (even though we specified a timeout) if that happens we need a secondary solution (besides killing the socket) to stop the thread --- src/main/java/eu/siacs/conversations/utils/DNSHelper.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src/main/java/eu/siacs/conversations/utils/DNSHelper.java') diff --git a/src/main/java/eu/siacs/conversations/utils/DNSHelper.java b/src/main/java/eu/siacs/conversations/utils/DNSHelper.java index b96d3c25..2f588f49 100644 --- a/src/main/java/eu/siacs/conversations/utils/DNSHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/DNSHelper.java @@ -51,14 +51,19 @@ public class DNSHelper { final String host = jid.getDomainpart(); final List servers = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? getDnsServers(context) : getDnsServersPreLollipop(); Bundle b = new Bundle(); + boolean interrupted = false; for(InetAddress server : servers) { + if (Thread.currentThread().isInterrupted()) { + interrupted = true; + break; + } b = queryDNS(host, server); if (b.containsKey("values")) { return b; } } if (!b.containsKey("values")) { - Log.d(Config.LOGTAG,"all dns queries failed. provide fallback A record"); + Log.d(Config.LOGTAG,(interrupted ? "Thread interrupted during DNS query" :"all dns queries failed") + ". provide fallback A record"); ArrayList values = new ArrayList<>(); values.add(createNamePortBundle(host, 5222, false)); b.putParcelableArrayList("values",values); -- cgit v1.2.3 From e1cf7b8cb641e5a30c0226404399beb46ff34dc5 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sat, 21 May 2016 08:54:29 +0200 Subject: refactore exceptionhandler to have one line file writer --- src/main/java/eu/siacs/conversations/utils/DNSHelper.java | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/main/java/eu/siacs/conversations/utils/DNSHelper.java') diff --git a/src/main/java/eu/siacs/conversations/utils/DNSHelper.java b/src/main/java/eu/siacs/conversations/utils/DNSHelper.java index 2f588f49..ac64cf2e 100644 --- a/src/main/java/eu/siacs/conversations/utils/DNSHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/DNSHelper.java @@ -47,7 +47,10 @@ public class DNSHelper { protected static Client client = new Client(); + protected static Context context; + public static Bundle getSRVRecord(final Jid jid, Context context) throws IOException { + DNSHelper.context = context; final String host = jid.getDomainpart(); final List servers = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? getDnsServers(context) : getDnsServersPreLollipop(); Bundle b = new Bundle(); -- cgit v1.2.3