mirror of
https://github.com/fergalmoran/DnsServer.git
synced 2026-02-05 15:33:57 +00:00
Updated apps to return shuffled addresses to allow load balancing. Code refactoring done.
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user