diff --git a/Apps/GeoCountryApp/Address.cs b/Apps/GeoCountryApp/Address.cs
index ade2a668..6c5d9c3a 100644
--- a/Apps/GeoCountryApp/Address.cs
+++ b/Apps/GeoCountryApp/Address.cs
@@ -19,10 +19,10 @@ along with this program. If not, see .
using DnsServerCore.ApplicationCommon;
using MaxMind.GeoIP2.Responses;
-using Newtonsoft.Json;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
+using System.Text.Json;
using System.Threading.Tasks;
using TechnitiumLibrary;
using TechnitiumLibrary.Net.Dns;
@@ -82,86 +82,87 @@ namespace GeoCountry
{
case DnsResourceRecordType.A:
case DnsResourceRecordType.AAAA:
- dynamic jsonAppRecordData = JsonConvert.DeserializeObject(appRecordData);
- dynamic jsonCountry = null;
-
- bool ecsUsed = false;
- EDnsClientSubnetOptionData requestECS = request.GetEDnsClientSubnetOption();
- if (requestECS is not null)
+ using (JsonDocument jsonDocument = JsonDocument.Parse(appRecordData))
{
- if (_maxMind.DatabaseReader.TryCountry(requestECS.Address, out CountryResponse csResponse))
+ JsonElement jsonAppRecordData = jsonDocument.RootElement;
+ JsonElement jsonCountry = default;
+
+ bool ecsUsed = false;
+ EDnsClientSubnetOptionData requestECS = request.GetEDnsClientSubnetOption();
+ if (requestECS is not null)
{
- ecsUsed = true;
- jsonCountry = jsonAppRecordData[csResponse.Country.IsoCode];
- if (jsonCountry is null)
- jsonCountry = jsonAppRecordData["default"];
+ if (_maxMind.DatabaseReader.TryCountry(requestECS.Address, out CountryResponse csResponse))
+ {
+ ecsUsed = true;
+ if (!jsonAppRecordData.TryGetProperty(csResponse.Country.IsoCode, out jsonCountry))
+ jsonAppRecordData.TryGetProperty("default", out jsonCountry);
+ }
}
- }
- if (jsonCountry is null)
- {
- if (_maxMind.DatabaseReader.TryCountry(remoteEP.Address, out CountryResponse response))
+ if (jsonCountry.ValueKind == JsonValueKind.Undefined)
{
- jsonCountry = jsonAppRecordData[response.Country.IsoCode];
- if (jsonCountry is null)
- jsonCountry = jsonAppRecordData["default"];
+ if (_maxMind.DatabaseReader.TryCountry(remoteEP.Address, out CountryResponse response))
+ {
+ if (!jsonAppRecordData.TryGetProperty(response.Country.IsoCode, out jsonCountry))
+ jsonAppRecordData.TryGetProperty("default", out jsonCountry);
+ }
+ else
+ {
+ jsonAppRecordData.TryGetProperty("default", out jsonCountry);
+ }
+
+ if (jsonCountry.ValueKind == JsonValueKind.Undefined)
+ return Task.FromResult(null);
+ }
+
+ List answers = new List();
+
+ switch (question.Type)
+ {
+ case DnsResourceRecordType.A:
+ foreach (JsonElement jsonAddress in jsonCountry.EnumerateArray())
+ {
+ IPAddress address = IPAddress.Parse(jsonAddress.GetString());
+
+ if (address.AddressFamily == AddressFamily.InterNetwork)
+ answers.Add(new DnsResourceRecord(question.Name, DnsResourceRecordType.A, DnsClass.IN, appRecordTtl, new DnsARecordData(address)));
+ }
+ break;
+
+ case DnsResourceRecordType.AAAA:
+ foreach (JsonElement jsonAddress in jsonCountry.EnumerateArray())
+ {
+ IPAddress address = IPAddress.Parse(jsonAddress.GetString());
+
+ if (address.AddressFamily == AddressFamily.InterNetworkV6)
+ answers.Add(new DnsResourceRecord(question.Name, DnsResourceRecordType.AAAA, DnsClass.IN, appRecordTtl, new DnsAAAARecordData(address)));
+ }
+ break;
+ }
+
+ if (answers.Count == 0)
+ return Task.FromResult(null);
+
+ if (answers.Count > 1)
+ answers.Shuffle();
+
+ EDnsOption[] options;
+
+ if (requestECS is null)
+ {
+ options = null;
}
else
{
- jsonCountry = jsonAppRecordData["default"];
+ if (ecsUsed)
+ options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, requestECS.SourcePrefixLength, requestECS.Address);
+ else
+ options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, 0, requestECS.Address);
}
+
+ return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers, null, null, _dnsServer.UdpPayloadSize, EDnsHeaderFlags.None, options));
}
- if (jsonCountry is null)
- return Task.FromResult(null);
-
- List answers = new List();
-
- switch (question.Type)
- {
- case DnsResourceRecordType.A:
- foreach (dynamic jsonAddress in jsonCountry)
- {
- IPAddress address = IPAddress.Parse(jsonAddress.Value);
-
- if (address.AddressFamily == AddressFamily.InterNetwork)
- answers.Add(new DnsResourceRecord(question.Name, DnsResourceRecordType.A, DnsClass.IN, appRecordTtl, new DnsARecordData(address)));
- }
- break;
-
- case DnsResourceRecordType.AAAA:
- foreach (dynamic jsonAddress in jsonCountry)
- {
- IPAddress address = IPAddress.Parse(jsonAddress.Value);
-
- if (address.AddressFamily == AddressFamily.InterNetworkV6)
- answers.Add(new DnsResourceRecord(question.Name, DnsResourceRecordType.AAAA, DnsClass.IN, appRecordTtl, new DnsAAAARecordData(address)));
- }
- break;
- }
-
- if (answers.Count == 0)
- return Task.FromResult(null);
-
- if (answers.Count > 1)
- answers.Shuffle();
-
- EDnsOption[] options;
-
- if (requestECS is null)
- {
- options = null;
- }
- else
- {
- if (ecsUsed)
- options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, requestECS.SourcePrefixLength, requestECS.AddressValue);
- else
- options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, 0, requestECS.AddressValue);
- }
-
- return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers, null, null, _dnsServer.UdpPayloadSize, EDnsHeaderFlags.None, options));
-
default:
return Task.FromResult(null);
}
diff --git a/Apps/GeoCountryApp/CNAME.cs b/Apps/GeoCountryApp/CNAME.cs
index 237b06e3..46440915 100644
--- a/Apps/GeoCountryApp/CNAME.cs
+++ b/Apps/GeoCountryApp/CNAME.cs
@@ -19,10 +19,10 @@ along with this program. If not, see .
using DnsServerCore.ApplicationCommon;
using MaxMind.GeoIP2.Responses;
-using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net;
+using System.Text.Json;
using System.Threading.Tasks;
using TechnitiumLibrary.Net.Dns;
using TechnitiumLibrary.Net.Dns.EDnsOptions;
@@ -76,8 +76,9 @@ namespace GeoCountry
public Task ProcessRequestAsync(DnsDatagram request, IPEndPoint remoteEP, DnsTransportProtocol protocol, bool isRecursionAllowed, string zoneName, string appRecordName, uint appRecordTtl, string appRecordData)
{
- dynamic jsonAppRecordData = JsonConvert.DeserializeObject(appRecordData);
- dynamic jsonCountry = null;
+ using JsonDocument jsonDocument = JsonDocument.Parse(appRecordData);
+ JsonElement jsonAppRecordData = jsonDocument.RootElement;
+ JsonElement jsonCountry = default;
bool ecsUsed = false;
EDnsClientSubnetOptionData requestECS = request.GetEDnsClientSubnetOption();
@@ -86,30 +87,28 @@ namespace GeoCountry
if (_maxMind.DatabaseReader.TryCountry(requestECS.Address, out CountryResponse csResponse))
{
ecsUsed = true;
- jsonCountry = jsonAppRecordData[csResponse.Country.IsoCode];
- if (jsonCountry is null)
- jsonCountry = jsonAppRecordData["default"];
+ if (!jsonAppRecordData.TryGetProperty(csResponse.Country.IsoCode, out jsonCountry))
+ jsonAppRecordData.TryGetProperty("default", out jsonCountry);
}
}
- if (jsonCountry is null)
+ if (jsonCountry.ValueKind == JsonValueKind.Undefined)
{
if (_maxMind.DatabaseReader.TryCountry(remoteEP.Address, out CountryResponse response))
{
- jsonCountry = jsonAppRecordData[response.Country.IsoCode];
- if (jsonCountry is null)
- jsonCountry = jsonAppRecordData["default"];
+ if (!jsonAppRecordData.TryGetProperty(response.Country.IsoCode, out jsonCountry))
+ jsonAppRecordData.TryGetProperty("default", out jsonCountry);
}
else
{
- jsonCountry = jsonAppRecordData["default"];
+ jsonAppRecordData.TryGetProperty("default", out jsonCountry);
}
+
+ if (jsonCountry.ValueKind == JsonValueKind.Undefined)
+ return Task.FromResult(null);
}
- if (jsonCountry is null)
- return Task.FromResult(null);
-
- string cname = jsonCountry.Value;
+ string cname = jsonCountry.GetString();
if (string.IsNullOrEmpty(cname))
return Task.FromResult(null);
@@ -129,9 +128,9 @@ namespace GeoCountry
else
{
if (ecsUsed)
- options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, requestECS.SourcePrefixLength, requestECS.AddressValue);
+ options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, requestECS.SourcePrefixLength, requestECS.Address);
else
- options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, 0, requestECS.AddressValue);
+ options = EDnsClientSubnetOptionData.GetEDnsClientSubnetOption(requestECS.SourcePrefixLength, 0, requestECS.Address);
}
return Task.FromResult(new DnsDatagram(request.Identifier, true, request.OPCODE, true, false, request.RecursionDesired, isRecursionAllowed, false, false, DnsResponseCode.NoError, request.Question, answers, null, null, _dnsServer.UdpPayloadSize, EDnsHeaderFlags.None, options));