further dns improvements

Daniel Gultsch created

Change summary

src/eu/siacs/conversations/utils/DNSHelper.java | 132 ++++++++++--------
1 file changed, 72 insertions(+), 60 deletions(-)

Detailed changes

src/eu/siacs/conversations/utils/DNSHelper.java 🔗

@@ -26,6 +26,10 @@ public class DNSHelper {
 				if (value != null && !"".equals(value) && !servers.contains(value))
 			    	ip = InetAddress.getByName(value);
 			        servers.add(value);
+			        Bundle result = queryDNS(host, ip);
+			        if (!result.containsKey("error")) {
+			        	return result;
+			        }
 			}
 		} catch (ClassNotFoundException e) {
 			ip = InetAddress.getByName("8.8.8.8");
@@ -38,71 +42,79 @@ public class DNSHelper {
 		} catch (InvocationTargetException e) {
 			ip = InetAddress.getByName("8.8.8.8");
 		}
-		
-		Log.d("xmppService","using dns server: "+ip.toString()+" to look up SRV records");
-		
+		return queryDNS(host, ip);
+	}
+	
+	public static Bundle queryDNS(String host, InetAddress dnsServer) {
 		Bundle namePort = new Bundle();
-			String[] hostParts = host.split("\\.");
-			byte[] transId = new byte[2];
-			Random random = new Random();
-			random.nextBytes(transId);
-			byte[] header = { 0x01, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
-					0x00, 0x01, 0x0c, 0x5f, 0x78, 0x6d, 0x70, 0x70, 0x2d, 0x63,
-					0x6c, 0x69, 0x65, 0x6e, 0x74, 0x04, 0x5f, 0x74, 0x63, 0x70 };
-			byte[] rest = { 0x00, 0x00, 0x21, 0x00, 0x01, 0x00, 0x00, 0x29,
-					0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
-			ByteArrayOutputStream output = new ByteArrayOutputStream();
-			output.write(transId);
-			output.write(header);
-			for (int i = 0; i < hostParts.length; ++i) {
-				char[] tmpChars = hostParts[i].toCharArray();
-				byte[] tmp = new byte[tmpChars.length];
-				for (int j = 0; j < tmpChars.length; ++j) {
-					tmp[j] = (byte) tmpChars[j];
-				}
-				output.write(tmp.length);
-				output.write(tmp);
+		try {
+		Log.d("xmppService","using dns server: "+dnsServer.toString()+" to look up "+host);
+		String[] hostParts = host.split("\\.");
+		byte[] transId = new byte[2];
+		Random random = new Random();
+		random.nextBytes(transId);
+		byte[] header = { 0x01, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+				0x00, 0x01, 0x0c, 0x5f, 0x78, 0x6d, 0x70, 0x70, 0x2d, 0x63,
+				0x6c, 0x69, 0x65, 0x6e, 0x74, 0x04, 0x5f, 0x74, 0x63, 0x70 };
+		byte[] rest = { 0x00, 0x00, 0x21, 0x00, 0x01, 0x00, 0x00, 0x29,
+				0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+		ByteArrayOutputStream output = new ByteArrayOutputStream();
+		output.write(transId);
+		output.write(header);
+		for (int i = 0; i < hostParts.length; ++i) {
+			char[] tmpChars = hostParts[i].toCharArray();
+			byte[] tmp = new byte[tmpChars.length];
+			for (int j = 0; j < tmpChars.length; ++j) {
+				tmp[j] = (byte) tmpChars[j];
 			}
-			output.write(rest);
-			byte[] sendPaket = output.toByteArray();
-			int realLenght = sendPaket.length - 11;
-			DatagramPacket packet = new DatagramPacket(sendPaket,
-					sendPaket.length, ip, 53);
-			DatagramSocket datagramSocket = new DatagramSocket();
-			datagramSocket.send(packet);
-			byte[] receiveData = new byte[1024];
+			output.write(tmp.length);
+			output.write(tmp);
+		}
+		output.write(rest);
+		byte[] sendPaket = output.toByteArray();
+		int realLenght = sendPaket.length - 11;
+		DatagramPacket packet = new DatagramPacket(sendPaket,
+				sendPaket.length, dnsServer, 53);
+		DatagramSocket datagramSocket = new DatagramSocket();
+		datagramSocket.send(packet);
+		byte[] receiveData = new byte[1024];
 
-			DatagramPacket receivePacket = new DatagramPacket(receiveData,
-					receiveData.length);
-			datagramSocket.setSoTimeout(2000);
-			datagramSocket.receive(receivePacket);
-			if (receiveData[3]!=-128) {
-				namePort.putString("error", "nosrv");
-				return namePort;
-			}
-			namePort.putInt("port",calcPort(receiveData[realLenght + 16],
-							receiveData[realLenght + 17]));
-			int i = realLenght + 18;
-			int wordLenght = 0;
-			StringBuilder builder = new StringBuilder();
-			while (receiveData[i] != 0) {
-				if (wordLenght > 0) {
-					builder.append((char) receiveData[i]);
-					--wordLenght;
-				} else {
-					wordLenght = receiveData[i];
-					builder.append(".");
-				}
-				++i;
-			}
-			builder.replace(0, 1, "");
-			byte type = receiveData[i+1];
-			if (type!=-64) {
-				namePort.putString("error", "nosrv");
-				return namePort;
+		DatagramPacket receivePacket = new DatagramPacket(receiveData,
+				receiveData.length);
+		datagramSocket.setSoTimeout(3000);
+		datagramSocket.receive(receivePacket);
+		if (receiveData[3]!=-128) {
+			namePort.putString("error", "nosrv");
+			return namePort;
+		}
+		namePort.putInt("port",calcPort(receiveData[realLenght + 16],
+						receiveData[realLenght + 17]));
+		int i = realLenght + 18;
+		int wordLenght = 0;
+		StringBuilder builder = new StringBuilder();
+		while (receiveData[i] != 0) {
+			if (wordLenght > 0) {
+				builder.append((char) receiveData[i]);
+				--wordLenght;
+			} else {
+				wordLenght = receiveData[i];
+				builder.append(".");
 			}
-			namePort.putString("name",builder.toString());
+			++i;
+		}
+		builder.replace(0, 1, "");
+		byte type = receiveData[i+1];
+		if (type!=-64) {
+			namePort.putString("error", "nosrv");
+			return namePort;
+		}
+		namePort.putString("name",builder.toString());
 		return namePort;
+		} catch (IOException e) {
+			Log.d("xmppService","io execpiton during dns");
+			namePort.putString("error", "nosrv");
+			return namePort;
+		}
 	}
 
 	static int calcPort(byte hb, byte lb) {