Updated apps to return shuffled addresses to allow load balancing. Code refactoring done.

This commit is contained in:
Shreyas Zare
2021-05-02 14:08:43 +05:30
parent 3c2fa0d75f
commit 4b9fa85773
4 changed files with 84 additions and 54 deletions

View File

@@ -26,6 +26,7 @@ using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
using TechnitiumLibrary.IO;
using TechnitiumLibrary.Net.Dns;
using TechnitiumLibrary.Net.Dns.ResourceRecords;
@@ -86,7 +87,8 @@ namespace GeoContinent
public Task<DnsDatagram> ProcessRequestAsync(DnsDatagram request, IPEndPoint remoteEP, string zoneName, uint appRecordTtl, string appRecordData, bool isRecursionAllowed, IDnsServer dnsServer)
{
switch (request.Question[0].Type)
DnsQuestionRecord question = request.Question[0];
switch (question.Type)
{
case DnsResourceRecordType.A:
case DnsResourceRecordType.AAAA:
@@ -102,7 +104,6 @@ namespace GeoContinent
else
{
jsonContinent = jsonAppRecordData["default"];
}
if (jsonContinent == null)
@@ -110,29 +111,35 @@ namespace GeoContinent
List<DnsResourceRecord> answers = new List<DnsResourceRecord>();
foreach (dynamic jsonAddress in jsonContinent)
switch (question.Type)
{
IPAddress address = IPAddress.Parse(jsonAddress.Value);
case DnsResourceRecordType.A:
foreach (dynamic jsonAddress in jsonContinent)
{
IPAddress address = IPAddress.Parse(jsonAddress.Value);
switch (request.Question[0].Type)
{
case DnsResourceRecordType.A:
if (address.AddressFamily == AddressFamily.InterNetwork)
answers.Add(new DnsResourceRecord(request.Question[0].Name, DnsResourceRecordType.A, DnsClass.IN, appRecordTtl, new DnsARecord(address)));
answers.Add(new DnsResourceRecord(question.Name, DnsResourceRecordType.A, DnsClass.IN, appRecordTtl, new DnsARecord(address)));
}
break;
break;
case DnsResourceRecordType.AAAA:
foreach (dynamic jsonAddress in jsonContinent)
{
IPAddress address = IPAddress.Parse(jsonAddress.Value);
case DnsResourceRecordType.AAAA:
if (address.AddressFamily == AddressFamily.InterNetworkV6)
answers.Add(new DnsResourceRecord(request.Question[0].Name, DnsResourceRecordType.AAAA, DnsClass.IN, appRecordTtl, new DnsAAAARecord(address)));
break;
}
answers.Add(new DnsResourceRecord(question.Name, DnsResourceRecordType.AAAA, DnsClass.IN, appRecordTtl, new DnsAAAARecord(address)));
}
break;
}
if (answers.Count == 0)
return Task.FromResult<DnsDatagram>(null);
if (answers.Count > 1)
answers.Shuffle();
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers));
default:

View File

@@ -26,6 +26,7 @@ using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
using TechnitiumLibrary.IO;
using TechnitiumLibrary.Net.Dns;
using TechnitiumLibrary.Net.Dns.ResourceRecords;
@@ -86,7 +87,8 @@ namespace GeoCountry
public Task<DnsDatagram> ProcessRequestAsync(DnsDatagram request, IPEndPoint remoteEP, string zoneName, uint appRecordTtl, string appRecordData, bool isRecursionAllowed, IDnsServer dnsServer)
{
switch (request.Question[0].Type)
DnsQuestionRecord question = request.Question[0];
switch (question.Type)
{
case DnsResourceRecordType.A:
case DnsResourceRecordType.AAAA:
@@ -102,7 +104,6 @@ namespace GeoCountry
else
{
jsonCountry = jsonAppRecordData["default"];
}
if (jsonCountry == null)
@@ -110,29 +111,35 @@ namespace GeoCountry
List<DnsResourceRecord> answers = new List<DnsResourceRecord>();
foreach (dynamic jsonAddress in jsonCountry)
switch (question.Type)
{
IPAddress address = IPAddress.Parse(jsonAddress.Value);
case DnsResourceRecordType.A:
foreach (dynamic jsonAddress in jsonCountry)
{
IPAddress address = IPAddress.Parse(jsonAddress.Value);
switch (request.Question[0].Type)
{
case DnsResourceRecordType.A:
if (address.AddressFamily == AddressFamily.InterNetwork)
answers.Add(new DnsResourceRecord(request.Question[0].Name, DnsResourceRecordType.A, DnsClass.IN, appRecordTtl, new DnsARecord(address)));
answers.Add(new DnsResourceRecord(question.Name, DnsResourceRecordType.A, DnsClass.IN, appRecordTtl, new DnsARecord(address)));
}
break;
break;
case DnsResourceRecordType.AAAA:
foreach (dynamic jsonAddress in jsonCountry)
{
IPAddress address = IPAddress.Parse(jsonAddress.Value);
case DnsResourceRecordType.AAAA:
if (address.AddressFamily == AddressFamily.InterNetworkV6)
answers.Add(new DnsResourceRecord(request.Question[0].Name, DnsResourceRecordType.AAAA, DnsClass.IN, appRecordTtl, new DnsAAAARecord(address)));
break;
}
answers.Add(new DnsResourceRecord(question.Name, DnsResourceRecordType.AAAA, DnsClass.IN, appRecordTtl, new DnsAAAARecord(address)));
}
break;
}
if (answers.Count == 0)
return Task.FromResult<DnsDatagram>(null);
if (answers.Count > 1)
answers.Shuffle();
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers));
default:

View File

@@ -28,6 +28,7 @@ using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
using TechnitiumLibrary.IO;
using TechnitiumLibrary.Net.Dns;
using TechnitiumLibrary.Net.Dns.ResourceRecords;
@@ -103,7 +104,8 @@ namespace GeoDistance
public Task<DnsDatagram> ProcessRequestAsync(DnsDatagram request, IPEndPoint remoteEP, string zoneName, uint appRecordTtl, string appRecordData, bool isRecursionAllowed, IDnsServer dnsServer)
{
switch (request.Question[0].Type)
DnsQuestionRecord question = request.Question[0];
switch (question.Type)
{
case DnsResourceRecordType.A:
case DnsResourceRecordType.AAAA:
@@ -143,29 +145,35 @@ namespace GeoDistance
List<DnsResourceRecord> answers = new List<DnsResourceRecord>();
foreach (dynamic jsonAddress in jsonClosestServer.addresses)
switch (question.Type)
{
IPAddress address = IPAddress.Parse(jsonAddress.Value);
case DnsResourceRecordType.A:
foreach (dynamic jsonAddress in jsonClosestServer.addresses)
{
IPAddress address = IPAddress.Parse(jsonAddress.Value);
switch (request.Question[0].Type)
{
case DnsResourceRecordType.A:
if (address.AddressFamily == AddressFamily.InterNetwork)
answers.Add(new DnsResourceRecord(request.Question[0].Name, DnsResourceRecordType.A, DnsClass.IN, appRecordTtl, new DnsARecord(address)));
answers.Add(new DnsResourceRecord(question.Name, DnsResourceRecordType.A, DnsClass.IN, appRecordTtl, new DnsARecord(address)));
}
break;
break;
case DnsResourceRecordType.AAAA:
foreach (dynamic jsonAddress in jsonClosestServer.addresses)
{
IPAddress address = IPAddress.Parse(jsonAddress.Value);
case DnsResourceRecordType.AAAA:
if (address.AddressFamily == AddressFamily.InterNetworkV6)
answers.Add(new DnsResourceRecord(request.Question[0].Name, DnsResourceRecordType.AAAA, DnsClass.IN, appRecordTtl, new DnsAAAARecord(address)));
break;
}
answers.Add(new DnsResourceRecord(question.Name, DnsResourceRecordType.AAAA, DnsClass.IN, appRecordTtl, new DnsAAAARecord(address)));
}
break;
}
if (answers.Count == 0)
return Task.FromResult<DnsDatagram>(null);
if (answers.Count > 1)
answers.Shuffle();
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers));
default:

View File

@@ -23,6 +23,7 @@ using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
using TechnitiumLibrary.IO;
using TechnitiumLibrary.Net;
using TechnitiumLibrary.Net.Dns;
using TechnitiumLibrary.Net.Dns.ResourceRecords;
@@ -50,7 +51,8 @@ namespace SplitHorizon
public Task<DnsDatagram> ProcessRequestAsync(DnsDatagram request, IPEndPoint remoteEP, string zoneName, uint appRecordTtl, string appRecordData, bool isRecursionAllowed, IDnsServer dnsServer)
{
switch (request.Question[0].Type)
DnsQuestionRecord question = request.Question[0];
switch (question.Type)
{
case DnsResourceRecordType.A:
case DnsResourceRecordType.AAAA:
@@ -67,29 +69,35 @@ namespace SplitHorizon
List<DnsResourceRecord> answers = new List<DnsResourceRecord>();
foreach (dynamic jsonAddress in jsonAddresses)
switch (question.Type)
{
IPAddress address = IPAddress.Parse(jsonAddress.Value);
case DnsResourceRecordType.A:
foreach (dynamic jsonAddress in jsonAddresses)
{
IPAddress address = IPAddress.Parse(jsonAddress.Value);
switch (request.Question[0].Type)
{
case DnsResourceRecordType.A:
if (address.AddressFamily == AddressFamily.InterNetwork)
answers.Add(new DnsResourceRecord(request.Question[0].Name, DnsResourceRecordType.A, DnsClass.IN, appRecordTtl, new DnsARecord(address)));
answers.Add(new DnsResourceRecord(question.Name, DnsResourceRecordType.A, DnsClass.IN, appRecordTtl, new DnsARecord(address)));
}
break;
break;
case DnsResourceRecordType.AAAA:
foreach (dynamic jsonAddress in jsonAddresses)
{
IPAddress address = IPAddress.Parse(jsonAddress.Value);
case DnsResourceRecordType.AAAA:
if (address.AddressFamily == AddressFamily.InterNetworkV6)
answers.Add(new DnsResourceRecord(request.Question[0].Name, DnsResourceRecordType.AAAA, DnsClass.IN, appRecordTtl, new DnsAAAARecord(address)));
break;
}
answers.Add(new DnsResourceRecord(question.Name, DnsResourceRecordType.AAAA, DnsClass.IN, appRecordTtl, new DnsAAAARecord(address)));
}
break;
}
if (answers.Count == 0)
return Task.FromResult<DnsDatagram>(null);
if (answers.Count > 1)
answers.Shuffle();
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers));
default: