From a83545442aec22b91eb8e22f7ebad1fd1d8083c5 Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sun, 17 Jun 2018 23:20:28 +0530 Subject: [PATCH] forwarder config serialization implemented to support DoH Uri. --- DnsServerCore/DnsServer.cs | 2 ++ DnsServerCore/DnsWebService.cs | 45 ++++++++++++++++++++++------------ 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/DnsServerCore/DnsServer.cs b/DnsServerCore/DnsServer.cs index 8733e62a..a41d2259 100644 --- a/DnsServerCore/DnsServer.cs +++ b/DnsServerCore/DnsServer.cs @@ -97,6 +97,8 @@ namespace DnsServerCore minWorker = Environment.ProcessorCount * 32; ThreadPool.SetMinThreads(minWorker, minIOC); } + + ServicePointManager.DefaultConnectionLimit = 100; //concurrent http request limit required when using DNS-over-HTTPS } #endregion diff --git a/DnsServerCore/DnsWebService.cs b/DnsServerCore/DnsWebService.cs index fa7e7387..49772f8f 100644 --- a/DnsServerCore/DnsWebService.cs +++ b/DnsServerCore/DnsWebService.cs @@ -717,7 +717,7 @@ namespace DnsServerCore jsonWriter.WriteStartArray(); foreach (NameServerAddress forwarder in _dnsServer.Forwarders) - jsonWriter.WriteValue(forwarder.EndPoint.ToString()); + jsonWriter.WriteValue(forwarder.ToString()); jsonWriter.WriteEndArray(); } @@ -787,18 +787,25 @@ namespace DnsServerCore for (int i = 0; i < strForwardersList.Length; i++) { - string[] strParts = strForwardersList[i].Split(':'); - - string host = strParts[0]; - int port = 53; - - if (strParts.Length > 1) - port = int.Parse(strParts[1]); - - if (IPAddress.TryParse(host, out IPAddress ipAddress)) - forwarders[i] = new NameServerAddress(new IPEndPoint(ipAddress, port)); + if (strForwardersList[i].StartsWith("https://", StringComparison.CurrentCultureIgnoreCase) || strForwardersList[i].StartsWith("http://", StringComparison.CurrentCultureIgnoreCase)) + { + forwarders[i] = new NameServerAddress(new Uri(strForwardersList[i])); + } else - forwarders[i] = new NameServerAddress(new DomainEndPoint(host, port)); + { + string[] strParts = strForwardersList[i].Split(':'); + + string host = strParts[0]; + int port = 53; + + if (strParts.Length > 1) + port = int.Parse(strParts[1]); + + if (IPAddress.TryParse(host, out IPAddress ipAddress)) + forwarders[i] = new NameServerAddress(new IPEndPoint(ipAddress, port)); + else + forwarders[i] = new NameServerAddress(new DomainEndPoint(host, port)); + } } _dnsServer.Forwarders = forwarders; @@ -1452,7 +1459,11 @@ namespace DnsServerCore int port = 53; { - if (server.StartsWith("[")) + if (server.StartsWith("https://", StringComparison.CurrentCultureIgnoreCase) || server.StartsWith("http://", StringComparison.CurrentCultureIgnoreCase)) + { + //do nothing + } + else if (server.StartsWith("[")) { //ipv6 if (server.EndsWith("]")) @@ -1520,6 +1531,10 @@ namespace DnsServerCore nameServers = new NameServerAddress[] { new NameServerAddress(_serverDomain, IPAddress.Parse("127.0.0.1")) }; proxy = null; //no proxy required for this server } + else if (server.StartsWith("https://", StringComparison.CurrentCultureIgnoreCase) || server.StartsWith("http://", StringComparison.CurrentCultureIgnoreCase)) + { + nameServers = new NameServerAddress[] { new NameServerAddress(new Uri(server)) }; + } else if (IPAddress.TryParse(server, out IPAddress serverIP)) { string serverDomain = null; @@ -1865,7 +1880,7 @@ namespace DnsServerCore NameServerAddress[] forwarders = new NameServerAddress[count]; for (int i = 0; i < count; i++) - forwarders[i] = new NameServerAddress(EndPointExtension.Parse(bR)); + forwarders[i] = new NameServerAddress(bR); _dnsServer.Forwarders = forwarders; } @@ -2036,7 +2051,7 @@ namespace DnsServerCore bW.Write(Convert.ToByte(_dnsServer.Forwarders.Length)); foreach (NameServerAddress forwarder in _dnsServer.Forwarders) - forwarder.EndPoint.WriteTo(bW); + forwarder.WriteTo(bW); } bW.Write((byte)_dnsServer.ForwarderProtocol);