reworked dns retry
This commit is contained in:
parent
915def24f9
commit
7dcce220cb
|
@ -33,7 +33,7 @@ public class DNSHelper {
|
||||||
for (String dnsserver : dns) {
|
for (String dnsserver : dns) {
|
||||||
InetAddress ip = InetAddress.getByName(dnsserver);
|
InetAddress ip = InetAddress.getByName(dnsserver);
|
||||||
Bundle b = queryDNS(host, ip);
|
Bundle b = queryDNS(host, ip);
|
||||||
if (b.containsKey("name")) {
|
if (b.containsKey("values")) {
|
||||||
return b;
|
return b;
|
||||||
} else if (b.containsKey("error")
|
} else if (b.containsKey("error")
|
||||||
&& "nosrv".equals(b.getString("error", null))) {
|
&& "nosrv".equals(b.getString("error", null))) {
|
||||||
|
@ -45,7 +45,7 @@ public class DNSHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Bundle queryDNS(String host, InetAddress dnsServer) {
|
public static Bundle queryDNS(String host, InetAddress dnsServer) {
|
||||||
Bundle namePort = new Bundle();
|
Bundle bundle = new Bundle();
|
||||||
try {
|
try {
|
||||||
String qname = "_xmpp-client._tcp." + host;
|
String qname = "_xmpp-client._tcp." + host;
|
||||||
Log.d(Config.LOGTAG,
|
Log.d(Config.LOGTAG,
|
||||||
|
@ -133,42 +133,28 @@ public class DNSHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result.size() == 0) {
|
if (result.size() == 0) {
|
||||||
namePort.putString("error", "nosrv");
|
bundle.putString("error", "nosrv");
|
||||||
return namePort;
|
return bundle;
|
||||||
}
|
}
|
||||||
// we now have a list of servers to try :-)
|
ArrayList<Bundle> values = new ArrayList<Bundle>();
|
||||||
|
for (SRV srv : result) {
|
||||||
// classic name/port pair
|
Bundle namePort = new Bundle();
|
||||||
String resultName = result.get(0).getName();
|
namePort.putString("name", srv.getName());
|
||||||
namePort.putString("name", resultName);
|
namePort.putInt("port", srv.getPort());
|
||||||
namePort.putInt("port", result.get(0).getPort());
|
if (ips4.containsKey(srv.getName())) {
|
||||||
|
ArrayList<String> ip = ips4.get(srv.getName());
|
||||||
if (ips4.containsKey(resultName)) {
|
|
||||||
// we have an ip!
|
|
||||||
ArrayList<String> ip = ips4.get(resultName);
|
|
||||||
Collections.shuffle(ip, rnd);
|
Collections.shuffle(ip, rnd);
|
||||||
namePort.putString("ipv4", ip.get(0));
|
namePort.putString("ipv4", ip.get(0));
|
||||||
}
|
}
|
||||||
if (ips6.containsKey(resultName)) {
|
values.add(namePort);
|
||||||
ArrayList<String> ip = ips6.get(resultName);
|
|
||||||
Collections.shuffle(ip, rnd);
|
|
||||||
namePort.putString("ipv6", ip.get(0));
|
|
||||||
}
|
}
|
||||||
|
bundle.putParcelableArrayList("values", values);
|
||||||
// add all other records
|
|
||||||
int i = 0;
|
|
||||||
for (SRV srv : result) {
|
|
||||||
namePort.putString("name" + i, srv.getName());
|
|
||||||
namePort.putInt("port" + i, srv.getPort());
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (SocketTimeoutException e) {
|
} catch (SocketTimeoutException e) {
|
||||||
namePort.putString("error", "timeout");
|
bundle.putString("error", "timeout");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
namePort.putString("error", "unhandled");
|
bundle.putString("error", "unhandled");
|
||||||
}
|
}
|
||||||
return namePort;
|
return bundle;
|
||||||
}
|
}
|
||||||
|
|
||||||
final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
|
final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
|
||||||
|
|
|
@ -4,6 +4,7 @@ import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
import java.security.KeyManagementException;
|
import java.security.KeyManagementException;
|
||||||
|
@ -32,6 +33,7 @@ import de.duenndns.ssl.MemorizingTrustManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Parcelable;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
import android.os.PowerManager.WakeLock;
|
import android.os.PowerManager.WakeLock;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
|
@ -155,50 +157,47 @@ public class XmppConnection implements Runnable {
|
||||||
tagWriter = new TagWriter();
|
tagWriter = new TagWriter();
|
||||||
packetCallbacks.clear();
|
packetCallbacks.clear();
|
||||||
this.changeStatus(Account.STATUS_CONNECTING);
|
this.changeStatus(Account.STATUS_CONNECTING);
|
||||||
Bundle namePort = DNSHelper.getSRVRecord(account.getServer());
|
Bundle result = DNSHelper.getSRVRecord(account.getServer());
|
||||||
if ("timeout".equals(namePort.getString("error"))) {
|
ArrayList<Parcelable> values = result.getParcelableArrayList("values");
|
||||||
|
if ("timeout".equals(result.getString("error"))) {
|
||||||
Log.d(Config.LOGTAG, account.getJid() + ": dns timeout");
|
Log.d(Config.LOGTAG, account.getJid() + ": dns timeout");
|
||||||
this.changeStatus(Account.STATUS_OFFLINE);
|
this.changeStatus(Account.STATUS_OFFLINE);
|
||||||
return;
|
return;
|
||||||
}
|
} else if (values != null) {
|
||||||
|
int i = 0;
|
||||||
|
boolean socketError = true;
|
||||||
|
while (socketError && values.size() > i) {
|
||||||
|
Bundle namePort = (Bundle) values.get(i);
|
||||||
|
try {
|
||||||
String srvRecordServer = namePort.getString("name");
|
String srvRecordServer = namePort.getString("name");
|
||||||
String srvIpServer = namePort.getString("ipv4");
|
|
||||||
int srvRecordPort = namePort.getInt("port");
|
int srvRecordPort = namePort.getInt("port");
|
||||||
if (srvRecordServer != null) {
|
String srvIpServer = namePort.getString("ipv4");
|
||||||
|
InetSocketAddress addr;
|
||||||
if (srvIpServer!=null) {
|
if (srvIpServer!=null) {
|
||||||
|
addr = new InetSocketAddress(srvIpServer, srvRecordPort);
|
||||||
Log.d(Config.LOGTAG, account.getJid()
|
Log.d(Config.LOGTAG, account.getJid()
|
||||||
+ ": using values from dns " + srvRecordServer
|
+ ": using values from dns " + srvRecordServer
|
||||||
+ "[" + srvIpServer + "]:" + srvRecordPort);
|
+ "[" + srvIpServer + "]:" + srvRecordPort);
|
||||||
socket = new Socket(srvIpServer, srvRecordPort);
|
|
||||||
} else {
|
} else {
|
||||||
boolean socketError = true;
|
addr = new InetSocketAddress(srvRecordServer, srvRecordPort);
|
||||||
int srvIndex = 0;
|
|
||||||
while (socketError
|
|
||||||
&& namePort.containsKey("name" + srvIndex)) {
|
|
||||||
try {
|
|
||||||
srvRecordServer = namePort.getString("name"
|
|
||||||
+ srvIndex);
|
|
||||||
srvRecordPort = namePort.getInt("port" + srvIndex);
|
|
||||||
Log.d(Config.LOGTAG, account.getJid()
|
Log.d(Config.LOGTAG, account.getJid()
|
||||||
+ ": using values from dns "
|
+ ": using values from dns "
|
||||||
+ srvRecordServer + ":" + srvRecordPort);
|
+ srvRecordServer + ":" + srvRecordPort);
|
||||||
socket = new Socket(srvRecordServer, srvRecordPort);
|
}
|
||||||
|
socket = new Socket();
|
||||||
|
socket.connect(addr, 20000);
|
||||||
socketError = false;
|
socketError = false;
|
||||||
} catch (UnknownHostException e) {
|
} catch (UnknownHostException e) {
|
||||||
srvIndex++;
|
i++;
|
||||||
if (!namePort.containsKey("name" + srvIndex)) {
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
srvIndex++;
|
i++;
|
||||||
if (!namePort.containsKey("name" + srvIndex)) {
|
|
||||||
throw e;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (socketError) {
|
||||||
|
throw new IOException();
|
||||||
}
|
}
|
||||||
}
|
} else if (result.containsKey("error")
|
||||||
} else if (namePort.containsKey("error")
|
&& "nosrv".equals(result.getString("error", null))) {
|
||||||
&& "nosrv".equals(namePort.getString("error", null))) {
|
|
||||||
socket = new Socket(account.getServer(), 5222);
|
socket = new Socket(account.getServer(), 5222);
|
||||||
} else {
|
} else {
|
||||||
Log.d(Config.LOGTAG, account.getJid()
|
Log.d(Config.LOGTAG, account.getJid()
|
||||||
|
|
Loading…
Reference in a new issue