From 4b9fa857731a9b738d168ba99dae348eb8375374 Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sun, 2 May 2021 14:08:43 +0530 Subject: [PATCH] Updated apps to return shuffled addresses to allow load balancing. Code refactoring done. --- Apps/GeoContinentApp/Address.cs | 35 ++++++++++++++++----------- Apps/GeoCountryApp/Address.cs | 35 ++++++++++++++++----------- Apps/GeoDistanceApp/Address.cs | 34 ++++++++++++++++---------- Apps/SplitHorizonApp/SimpleAddress.cs | 34 ++++++++++++++++---------- 4 files changed, 84 insertions(+), 54 deletions(-) diff --git a/Apps/GeoContinentApp/Address.cs b/Apps/GeoContinentApp/Address.cs index d78b377d..6b83bc66 100644 --- a/Apps/GeoContinentApp/Address.cs +++ b/Apps/GeoContinentApp/Address.cs @@ -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 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 answers = new List(); - 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(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: diff --git a/Apps/GeoCountryApp/Address.cs b/Apps/GeoCountryApp/Address.cs index 8b006e82..32b08ee3 100644 --- a/Apps/GeoCountryApp/Address.cs +++ b/Apps/GeoCountryApp/Address.cs @@ -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 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 answers = new List(); - 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(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: diff --git a/Apps/GeoDistanceApp/Address.cs b/Apps/GeoDistanceApp/Address.cs index 890240bb..8425ab8e 100644 --- a/Apps/GeoDistanceApp/Address.cs +++ b/Apps/GeoDistanceApp/Address.cs @@ -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 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 answers = new List(); - 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(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: diff --git a/Apps/SplitHorizonApp/SimpleAddress.cs b/Apps/SplitHorizonApp/SimpleAddress.cs index 3c7f733d..56339c4b 100644 --- a/Apps/SplitHorizonApp/SimpleAddress.cs +++ b/Apps/SplitHorizonApp/SimpleAddress.cs @@ -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 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 answers = new List(); - 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(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: